web-dev-qa-db-ja.com

Linuxでプロセスあたりの最大スレッド数は?

Linux環境下のプロセスで作成できるスレッドの最大数はいくつですか?

可能であれば、この値をどのように変更できますか?

221
user60008667

Linuxには、プロセスごとの個別のスレッド数の制限はありません。システム上のプロセスの総数に対する制限だけです(スレッドは、基本的にはLinux上の共有アドレス空間を持つプロセスだけです)。

cat /proc/sys/kernel/threads-max

デフォルトはメモリページ数/ 4です。あなたはこれを増やすことができます:

echo 100000 > /proc/sys/kernel/threads-max

1人のユーザーが作成できるプロセス(したがってスレッド)の数にも制限があります。これらの制限に関する詳細についてはulimit/getrlimitを参照してください。

221
Robert Gamble

これは、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/

63
codersofthedark

実際的には、上限は通常スタックスペースによって決まります。各スレッドが1MBのスタックを取得した場合(これがLinuxのデフォルトであるかどうか私は覚えていません)、32ビットシステムは3000スレッド後にアドレス空間を使い果たします(最後のgbはカーネル用に予約されていると仮定します) 。

ただし、数十を超えるスレッドを使用すると、恐らく最高のパフォーマンスが得られます。遅かれ早かれ、あなたはあまりにも多くのコンテキスト切り替えオーバーヘッド、スケジューラの中であまりにも多くのオーバーヘッド、などを得ることになります。 (多数のスレッドを作成することは、大量のメモリーを消費することにとどまりません。しかし、実際にworkすることを行う多くのスレッドは、使用可能なCPU時間を争っているので遅くなります。 )

この制限がさらに関連しているところであなたは何をしていますか?

42
jalf

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
20

@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で起こります。仮想メモリを増やしたい場合はスワップ空間を追加する必要があります。

13
c4f4t0r

取得するには:

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個のスレッドしか使用できません。

7
Albert Kong

それはおそらく問題にならないはずです。固定数のスレッドを使用するようにアルゴリズムを設計すると、はるかに優れたパフォーマンスが得られます(たとえば、4つまたは8つのプロセッサを使用している場合は4つまたは8つ)。作業キュー、非同期IO、またはlibeventのようなものでこれを行うことができます。

4
twk

これを見ている人のために、systemdシステム(私の場合は、特にUbuntu 16.04)で、cgroup pids.maxパラメータによって強制されるもう1つの制限があります。

これはデフォルトで12,288に設定されており、/ etc/systemd/login.confで上書きすることができます。

Pids_max、threads-max、max_maps_count、ulimitsなど、他のアドバイスも適用されます。

3
Trent Lloyd

ブロックするI/O呼び出しを行うためにより多くのスレッドが必要な場合は、nbioノンブロッキングI/Oライブラリなどを使用します。

3
wefeqfw

私の場合は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を設定することで上げることができるはずです。

3
Axel Podehl

あなたのシステムに依存します、単にサンプルプログラムを書いて[ループでプロセスを作成することによって]、ps axo pid、ppid、rss、vsz、nlwp、cmdを使ってチェックしてください。それがそれ以上スレッドを作成することができなくなったら、nlwp count [nlwpはスレッド数]をチェックしてください。

2
resultsway

恒久的に設定するには、

vim /etc/sysctl.conf

そして追加

kernel.threads-max = "value"
0
Matteo Zocca

はい、スレッド数を増やすには、仮想メモリを増やすか、スタックサイズを減らす必要があります。 Raspberry Piでは、スタックサイズをデフォルトの8MBから1MBに減らすと、仮想メモリを増やすことができませんでした。プロセスあたり1000スレッドを超える可能性がありますが、「ulimit -s」コマンドでスタックサイズを減らすことができます。すべてのスレッドに対してこれを行います。そのため、私の解決策は、“ pthread_t”インスタンス“ thread class”を使用することでした。これは、pthread_tによって各スレッドごとのスタックサイズを設定できるためです。最後に、私はRaspberry Piでプロセスごとに1000以上のスレッドをアーカイブすることができます。それぞれのスレッドに1MBのスタックがあります。

0
Deulis

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が減少します。

0
Arif