Linux環境下のプロセスで作成できるスレッドの最大数はいくつですか?
可能であれば、この値をどのように変更できますか?
Linuxには、プロセスごとの個別のスレッド数の制限はありません。システム上のプロセスの総数に対する制限だけです(スレッドは、基本的にはLinux上の共有アドレス空間を持つプロセスだけです)。
cat /proc/sys/kernel/threads-max
デフォルトはメモリページ数/ 4です。あなたはこれを増やすことができます:
echo 100000 > /proc/sys/kernel/threads-max
1人のユーザーが作成できるプロセス(したがってスレッド)の数にも制限があります。これらの制限に関する詳細についてはulimit/getrlimit
を参照してください。
これは、LINUXがプロセスごとに個別のスレッド制限を持っていないと言うのは間違っています。
Linuxは1プロセスあたりのスレッドの最大数を間接的に実装しています!!
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はカーネル用に予約されていると仮定します) 。
ただし、数十を超えるスレッドを使用すると、恐らく最高のパフォーマンスが得られます。遅かれ早かれ、あなたはあまりにも多くのコンテキスト切り替えオーバーヘッド、スケジューラの中であまりにも多くのオーバーヘッド、などを得ることになります。 (多数のスレッドを作成することは、大量のメモリーを消費することにとどまりません。しかし、実際にworkすることを行う多くのスレッドは、使用可能なCPU時間を争っているので遅くなります。 )
この制限がさらに関連しているところであなたは何をしていますか?
linux上の適切な100Kスレッド:
ulimit -s 256
ulimit -i 120000
echo 120000 > /proc/sys/kernel/threads-max
echo 600000 > /proc/sys/vm/max_map_count
echo 200000 > /proc/sys/kernel/pid_max
./100k-pthread-create-app
systemdシステム上の@Thomasからの2018年更新:
/etc/systemd/logind.conf: UserTasksMax=100000
@dragosrsupercool
Linuxはスレッドの最大値を計算するために仮想メモリを使用しませんが、システムにインストールされた物理RAM
max_threads = totalram_pages / (8 * 8192 / 4096);
http://kavassalis.com/2011/03/linux-and-the-maximum-number-of-processes-threads/
kernel/fork.c
/* The default maximum number of threads is set to a safe
* value: the thread structures can take up at most half
* of memory.
*/
max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);
つまり、インストールされるRAMのサイズが異なる場合があるため、スレッド最大数はシステムごとに異なります。32ビットではユーザースペース用に3 GB、カーネル用に1 GBが必要です。 64ビットでは128 TBの仮想メモリがありました。これはSolarisで起こります。仮想メモリを増やしたい場合はスワップ空間を追加する必要があります。
取得するには:
cat /proc/sys/kernel/threads-max
設定するには:
echo 123456789 > /proc/sys/kernel/threads-max
123456789 =スレッド数
スレッド数の制限
$ cat /proc/sys/kernel/threads-max
計算方法
max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);
x86_64ページサイズ(PAGE_SIZE)は4Kです。他のすべてのアーキテクチャと同様に、x86_64にはすべてのアクティブスレッド用のカーネルスタックがあります。これらのスレッドスタックはTHREAD_SIZE(2 * PAGE_SIZE)大きいです。
mempagesの場合:
cat /proc/zoneinfo | grep spanned | awk '{totalpages=totalpages+$2} END {print totalpages}';
そのため、実際にはこの数はスレッドメモリのスタックサイズ(ulimit -s
)の制限とは関係ありません。
P.S:私のrhel VMではスレッドメモリスタックの制限は10Mですが、1.5Gメモリの場合、このVMは150個のスレッドしか使用できません。
それはおそらく問題にならないはずです。固定数のスレッドを使用するようにアルゴリズムを設計すると、はるかに優れたパフォーマンスが得られます(たとえば、4つまたは8つのプロセッサを使用している場合は4つまたは8つ)。作業キュー、非同期IO、またはlibeventのようなものでこれを行うことができます。
これを見ている人のために、systemdシステム(私の場合は、特にUbuntu 16.04)で、cgroup pids.maxパラメータによって強制されるもう1つの制限があります。
これはデフォルトで12,288に設定されており、/ etc/systemd/login.confで上書きすることができます。
Pids_max、threads-max、max_maps_count、ulimitsなど、他のアドバイスも適用されます。
ブロックするI/O呼び出しを行うためにより多くのスレッドが必要な場合は、nbio
ノンブロッキングI/Oライブラリなどを使用します。
私の場合はRedhat Linux 2.6で、ulimitを使用してスレッドごとのスタックサイズを確認します。
ulimit -a
...
stack size (kbytes, -s) 10240
各スレッドは、スタックに割り当てられたこの量のメモリ(10 MB)を取得します。 32ビットプログラムと最大4GBのアドレス空間で、それは最大4096MB/10MB = 409スレッドです。マイナスプログラムコードからヒープスペースを引いた値は、おそらく最大値になるでしょう。 300スレッド.
あなたはこれを64bitでコンパイルして走らせるか、あるいはulimit -s 8192あるいはulimit -s 4096を設定することで上げることができるはずです。
あなたのシステムに依存します、単にサンプルプログラムを書いて[ループでプロセスを作成することによって]、ps axo pid、ppid、rss、vsz、nlwp、cmdを使ってチェックしてください。それがそれ以上スレッドを作成することができなくなったら、nlwp count [nlwpはスレッド数]をチェックしてください。
恒久的に設定するには、
vim /etc/sysctl.conf
そして追加
kernel.threads-max = "value"
はい、スレッド数を増やすには、仮想メモリを増やすか、スタックサイズを減らす必要があります。 Raspberry Piでは、スタックサイズをデフォルトの8MBから1MBに減らすと、仮想メモリを増やすことができませんでした。プロセスあたり1000スレッドを超える可能性がありますが、「ulimit -s」コマンドでスタックサイズを減らすことができます。すべてのスレッドに対してこれを行います。そのため、私の解決策は、“ pthread_t”インスタンス“ thread class”を使用することでした。これは、pthread_tによって各スレッドごとのスタックサイズを設定できるためです。最後に、私はRaspberry Piでプロセスごとに1000以上のスレッドをアーカイブすることができます。それぞれのスレッドに1MBのスタックがあります。
Linuxの次のファイルに定義されているスレッドの最大数を確認できます。
cat/proc/sys/kernel/threads-max
(または)
sysctl -a | grep threads-max
現在の値は、次のコマンドで確認できます。cat/proc/sys/kernel/threads-max
次のように値を設定することもできます。
echo 100500>/proc/sys/kernel/threads-max
設定した値は、使用可能なRAMページと照合されます。スレッド構造が使用可能なRAMページの1/8以上を占める場合、それに応じてthread-maxが減少します。