Linuxサーバーを最適化して、プロセスごとに10,000スレッドを処理する
他の人が説明したように、これは一般的に間違っています。スレッドは、高価な資源であり、それは自身の持っている、特にので、コールスタック(通常は、メガバイト)を、それがカーネルによってタスクのスケジュールですので。スレッドは、開かれたファイル記述子よりもさらにコストがかかります。
オペレーティングシステムを読む:3つの簡単なピース(無料でダウンロードできる教科書)。
経験則として、あなたは多くのスレッドを持ちたくない、そして確かに多くの実行可能なスレッドを持ちたくない。実行可能なスレッドの数は、通常、多くてもコアの数(またはその数倍)にする必要があるため、最大で約12になります。プロセス内のスレッド数はわずかに大きくなる可能性があります。したがって、非常に拡張性の高いサーバー(多くのプロセッサソケットとコアを備えている)がない限り、プロセス(デスクトップ上)に12を超える実行可能なスレッドと100のスレッド(ほとんどがアイドル状態)を持たせたくありません。 。
Linuxでは、スレッドとプロセスは非常によく似ており(どちらもclone(2)で作成できるため)、どちらもカーネルによってスケジュールされたタスクです。実際、カーネルスケジューラは、いくつかのマルチスレッドプロセス内のスレッド、またはシングルスレッドプロセスの単一のメインスレッド(その場合、その単一スレッドを "プロセス"と呼びます)、またはカーネルスレッドであるタスクをスケジュールします。デスクトップシステムで合計1,000を超えるスケジュール可能なタスクを実行したくない場合があります。
Linuxでは、プロセスは、同じ仮想アドレス空間を共有する(およびファイル記述子テーブルなどの他のいくつかのものを共有する)スレッドのグループです。一部のプロセスには1つのスレッドしかありません。
仮想アドレス空間がされて定義された通りウィキペディアで
「オペレーティングシステムがプロセスに提供する仮想アドレスの範囲のセット」
(ただし、この用語は普遍的ではなく、Microsoftの一部のドキュメントでは異なる互換性のない定義を使用していることを説明しているこの回答も参照してください)。
Linuxでは、いくつかのプロセスの仮想アドレス空間を理解するためにproc(5)が役立ちます。両方
cat /proc/self/maps
とcat /proc/$$/maps
ターミナルで試してください。thisとpmap(1)&ps(1)&top(1)も参照してください。
すべてのユーザー空間プログラムは、いくつかのプロセスで実行され、仮想メモリを使用しているため、すべてのプロセスには独自の仮想アドレス空間があります。物理RAMはLinuxカーネルによって管理されるリソースであり、アプリケーションはRAMに直接アクセスできません(mmap(2) -ing を除く。mem(4)を/dev/mem
参照)。
したがって、プロセスは直接 RAMを使用しません。仮想メモリを使用し、独自の仮想アドレス空間を持っています。カーネルの用途ページング物理RAMの管理するためのページを仮想アドレス空間とプロセスの提供抽象化を。いつでも(プロセスがアイドル状態のときでも、実行中の場合でも)カーネルはいくつかのページをページアウトできます(ディスク上でページをスワップするなど)。カーネルはMMUを構成しています(ディスクからページをフェッチするか、セグメンテーション違反をプロセスに伝達することにより、一部の割り込みハンドラーでページミスハードウェア例外を処理しています。signal (7)を参照してください)
システムスレッドの上にグリーンスレッドを配置することもできます(ただし、グリーンスレッドライブラリの実装とデバッグは困難です)。Goで使用されているゴルーチンを空想的な例として調べてください。setcontext(3)も参照してください。
場合によっては、システムがスラッシングを試すことがあります。これは、(すべてのプロセスで必要な)仮想メモリの合計が使用可能な物理RAMを(大きな要因で)超えた場合に発生します。その後、コンピュータが応答しなくなります。常駐セットのサイズ、デマンドページング、ワーキングセット、メモリのオーバーコミットメント、ASLRについてお読みください。
Linux-の-forも参照フォーク(2) 、クローン(2) 、MMAP(2) 、のmadvise(2) 、posix_fadvise(2) 、MLOCK(2) 、はexecve(2) 、資格情報(7) 、pthreadの(7)、futex(7)、capabilities(7)。