Linuxのプロセスで作成できるスレッドの最大数はいくつですか?
この値は(可能な場合)どのように変更できますか?
Linuxのプロセスで作成できるスレッドの最大数はいくつですか?
この値は(可能な場合)どのように変更できますか?
回答:
Linuxには、プロセスごとの個別のスレッド制限はありません。システム上のプロセスの合計数に対する制限(スレッドは、本質的にはLinux上の共有アドレス空間を持つ単なるプロセスです)で、次のように表示できます。
cat /proc/sys/kernel/threads-max
デフォルトはメモリページ数/ 4です。あなたはこれを次のように増やすことができます:
echo 100000 > /proc/sys/kernel/threads-max
また、1人のユーザーが作成できるプロセス(およびスレッド)の数にも制限がありulimit/getrlimit
ます。これらの制限の詳細については、を参照してください。
E667: Fsync failed
みましたが、viを節約しようとすると表示されます。
これは、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/
ulimit -s
。これはに関係ありません。可能なスレッドIDの数と同じ数のスレッドを作成することは非常に可能です(賢明ではありませんが、可能です)。64ビットLinuxでは、スレッドIDの数よりも多くのスレッドを作成することも簡単に "可能"です(もちろん、それは不可能ですが、スタックに関しては可能です)。3.スタックの予約、コミット、VMは、特にOCとは異なります。
実際には、制限は通常スタックスペースによって決まります。各スレッドが1MBのスタックを取得する場合(それがLinuxのデフォルトであるかどうかを思い出せません)、32ビットシステムでは3000スレッド後にアドレス空間が不足します(最後のGBがカーネルに予約されていると想定)。 。
ただし、数十を超えるスレッドを使用すると、恐ろしいパフォーマンスが発生する可能性が高くなります。遅かれ早かれ、コンテキスト切り替えのオーバーヘッドが多すぎたり、スケジューラーのオーバーヘッドが多すぎたりします。(多数のスレッドを作成しても、大量のメモリを消費するだけです。しかし、実際の作業を伴う多くのスレッドは、利用可能な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
あずきっく
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のサイズは異なる場合があるため、Linuxが仮想メモリを増やす必要がないことを知っています。 64ビットでは、Solarisで発生する128 TBの仮想メモリを取得しました。仮想メモリを増やしたい場合は、スワップ領域を追加する必要があります。
それを取得するには:
cat /proc/sys/kernel/threads-max
設定するには:
echo 123456789 > /proc/sys/kernel/threads-max
123456789 =スレッド数
>
)一部が失われますsudo
:tryecho 12345678 | sudo tee -a /proc/sys/kernel/threads-max
スレッド数制限:
$ 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
)。
PS:rhel VMのスレッドメモリスタック制限は10Mであり、1.5Gメモリの場合、このVMは150スレッドしか提供できませんか?
スレッドごとのスタックサイズをulimitで確認します。私の場合はRedhat Linux 2.6です。
ulimit -a
...
stack size (kbytes, -s) 10240
各スレッドは、そのスタックに割り当てられたこの量のメモリ(10MB)を取得します。32ビットプログラムと最大アドレススペースが4 GBの場合、最大4096 MB / 10 MB = 409スレッドです。マイナスのプログラムコードからヒープスペースを引いた値は、おそらく最大値になります。300スレッドの。
64ビットでコンパイルして実行するか、ulimit -s 8192またはulimit -s 4096を設定することで、これを上げることができるはずです。しかし、これが望ましい場合は、別のディスカッションです...
Linuxの次のファイルで定義されているスレッドの最大数を確認できます
猫/ proc / sys / kernel / threads-max
(または)
sysctl -a | grepスレッド最大
はい、スレッド数を増やすには、仮想メモリを増やすか、スタックサイズを減らす必要があります。Raspberry Piで、スタックサイズをデフォルトの8MBから1MBに減らすと、仮想メモリを増やす方法が見つかりませんでした。プロセスごとに1000を超えるスレッドが取得される可能性がありますが、「ulimit -s」コマンドでスタックサイズを減らしますすべてのスレッドでこれを作成します。したがって、pthread_tで各スレッドのスタックサイズを設定できるため、私の解決策は「pthread_t」インスタンス「スレッドクラス」を使用することでした。最後に、Raspberry Piではプロセスごとに1000を超えるスレッドをアーカイブできます。各スレッドは1MBのスタックを備えています。