Linux には、プロセスごとの個別のスレッドの制限はありません。システム上のプロセスの総数に対する制限があるだけです (スレッドは、基本的に、Linux では共有アドレス空間を持つ単なるプロセスです)。これは次のように表示できます:
cat /proc/sys/kernel/threads-max
デフォルトは、メモリ ページ数/4 です。これを次のように増やすことができます:
echo 100000 > /proc/sys/kernel/threads-max
1 人のユーザーが作成できるプロセス (およびスレッド) の数にも制限があります。ulimit/getrlimit
を参照してください。 これらの制限に関する詳細については、
これは、LINUX にはプロセスごとに個別のスレッドの制限がないというのは誤りです。
<ブロック引用>Linux はプロセスあたりの最大スレッド数を間接的に実装しています!!
number of threads = total virtual memory / (stack size*1024*1024)
したがって、プロセスごとのスレッド数は、仮想メモリの合計を増やすか、スタック サイズを減らすことで増やすことができます。ただし、スタック サイズを小さくしすぎると、最大仮想メモリがスワップ メモリと同じであるにもかかわらず、スタック オーバーフローが原因でコード エラーが発生する可能性があります。
マシンをチェック:
合計仮想メモリ:ulimit -v
(デフォルトは無制限であるため、これを増やすにはスワップ メモリを増やす必要があります)
合計スタック サイズ:ulimit -s
(デフォルトは 8Mb)
これらの値を増やすコマンド:
ulimit -s newvalue
ulimit -v newvalue
*新しい値を制限したい値に置き換えてください。
参考文献:
http://dustycodes.wordpress.com/2012/02/09/increasing-number-of-threads-per-process/
実際には、制限は通常、スタック領域によって決まります。各スレッドが 1MB のスタックを取得する場合 (これが Linux のデフォルトかどうかは覚えていません)、32 ビット システムでは 3000 スレッド後にアドレス空間が不足します (最後の GB がカーネルに予約されていると仮定します)。 .
ただし、数十を超えるスレッドを使用すると、パフォーマンスが大幅に低下する可能性があります。遅かれ早かれ、コンテキスト切り替えのオーバーヘッドやスケジューラーのオーバーヘッドなどが大きくなりすぎます。 (多数のスレッドを作成しても、多くのメモリを消費するだけです。しかし、実際の 作業 では多くのスレッドが使用されます。 利用可能な CPU 時間を奪い合っているため、速度が低下します)
この制限が関係している場合、あなたは何をしていますか?