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


245

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

この値は(可能な場合)どのように変更できますか?

回答:


247

Linuxには、プロセスごとの個別のスレッド制限はありません。システム上のプロセスの合計数に対する制限(スレッドは、本質的にはLinux上の共有アドレス空間を持つ単なるプロセスです)で、次のように表示できます。

cat /proc/sys/kernel/threads-max

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

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

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


3
/ proc / sys / vm / max_map_countの制限により、スレッドの数も制限される場合があります。限界に達した場合は、その限界を大幅に増やしても安全です。
Mikko Rantalainen、2012年

1
Robert:Linuxは間接的にプロセスごとの制限を実装しています。詳細については私の答えを確認してください;)
codersofthedark

私はubuntu 12.04でこれを変更しようとしていますが、コマンドで変更されません。私もviを変更してE667: Fsync failedみましたが、viを節約しようとすると表示されます。
Siddharth 2013年

4
@dragosrsupercool最大スレッドは合計RAMを使用して計算され、仮想メモリは使用されません
c4f4t0r

1
スレッドあたりのスタックサイズの量(システムのデフォルト)は、他の何よりも制限になる可能性が高くなります。スレッドごとのスタックサイズを減らすことは、スレッドの総数を増やす方法の1つです(ただし、これはめったに良い考えではありません)。
ランディハワード

67

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


11
3つの小さな詳細を除いて:1. Linuxはこれを行いません。スタックの存在と、メモリとアドレス空間が有限のサイズであるという事実は、それとは無関係です。2.作成時にスレッドのスタックを指定する必要がありますulimit -s。これはに関係ありません。可能なスレッドIDの数と同じ数のスレッドを作成することは非常に可能です(賢明ではありませんが、可能です)。64ビットLinuxでは、スレッドIDの数よりも多くのスレッドを作成することも簡単に "可能"です(もちろん、それは不可能ですが、スタックに関しては可能です)。3.スタックの予約、コミット、VMは、特にOCとは異なります。
デイモン

はい、スレッド数を増やすには、仮想メモリを増やすか、スタックサイズを減らす必要があります。Raspberry Piで、スタックサイズをデフォルトの8MBから1MBに減らすと、仮想メモリを増やす方法が見つかりませんでした。プロセスごとに1000を超えるスレッドが取得される可能性がありますが、「ulimit -s」コマンドでスタックサイズを減らしますすべてのスレッドでこれを作成します。つまり、pthread_tで各スレッドのスタックサイズを設定できるため、私のソリューションは「pthread_t」インスタンス「スレッドクラス」を使用することでした。最後に、Raspberry Piではプロセスごとに1000を超えるスレッドを1
MB

43

実際には、制限は通常スタックスペースによって決まります。各スレッドが1MBのスタックを取得する場合(それがLinuxのデフォルトであるかどうかを思い出せません)、32ビットシステムでは3000スレッド後にアドレス空間が不足します(最後のGBがカーネルに予約されていると想定)。 。

ただし、数十を超えるスレッドを使用すると、恐ろしいパフォーマンスが発生する可能性が高くなります。遅かれ早かれ、コンテキスト切り替えのオーバーヘッドが多すぎたり、スケジューラーのオーバーヘッドが多すぎたりします。(多数のスレッドを作成しても、大量のメモリを消費するだけです。しかし、実際の作業を伴う多くのスレッドは、利用可能なCPU時間を争っているため、速度が低下します)

この制限が関係しているところでは何をしていますか?


3
スタックのスレッドごとに1MBはかなり高く、多くのプログラムはこの多くのスタックスペースの近くを必要としません。パフォーマンスは、存在するスレッドの数ではなく、実行可能なプロセスの数に基づきます。私は現在、0.40の負荷で1200以上のスレッドを実行しているマシンを持っています。
ロバートギャンブル

13
パフォーマンスは、スレッドが実行していることに依存します。彼らがあまり機能せず、したがってコンテキスト切り替えが少ない場合は、数十よりもはるかに多くすることができます。
Corey Goldberg

スタックは動的に増加し、最初のページのみが割り当てられます
Michael Pankov

28

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

4
ありがとう、ついに32kのJavaスレッド数を突破することができました。
berezovskyi 2016年

1
私にとっては機能しません:$ ulimit -s 100000 $ ulimit -i 63645 $ cat / proc / sys / kernel / threads-max 127626 $ cat / proc / sys / vm / max_map_count 600000 $ cat / proc / sys / kernel / pid_max 200000 $ java -Xmx4G -Xss256k -cp。ThreadCreation ... 11542 11543 java.lang.OutOfMemoryError:java.lang.Thread.start0(Native Method)at java.lang.Thread.start(Thread.java:717)at ThreadCreation.main(で新しいネイティブスレッドを作成できませんThreadCreation.java:15)
マーティンVysny

@MartinVysny ulimit -s = KBのスレッドサイズ。したがって、100MBのスレッドスタックサイズでスレッドを作成しようとしています。
Vladimir Kunschikov 2017年

@Thomas、とにかくフィードバックをありがとう、チェックせずに提案を追加しました。
Vladimir Kunschikov

2
@VladimirKunschikovバディ、ありがとう、あなたの解決策は本当にうまくいきました、そしてトーマスにその追加の行を追加してくれてありがとう、私はそれがその行で機能しないことを確認できます。
BillHoo 2018

14

あずきっく

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の仮想メモリを取得しました。仮想メモリを増やしたい場合は、スワップ領域を追加する必要があります。


11

それを取得するには:

cat /proc/sys/kernel/threads-max

設定するには:

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

123456789 =スレッド数


rootであっても、書き込みをしようとするとアクセス許可が拒否されます。
キム

投稿されてから10年近くになります。私は現在の状況については最新ではありませんが、多くのことが変更された可能性があります(おそらく変更されています)...
Vincent Van Den Berghe

perm-denyの問題は追加される可能性があります(>)一部が失われますsudo:tryecho 12345678 | sudo tee -a /proc/sys/kernel/threads-max
dwanderson

10

スレッド数制限:

$ 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スレッドしか提供できませんか?


5

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

これはデフォルトで12,288に設定されており、/ etc / systemd / logind.confでオーバーライドできます

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


5

スレッドごとのスタックサイズを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を設定することで、これを上げることができるはずです。しかし、これが望ましい場合は、別のディスカッションです...


4

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


3
マルチスレッドの目的はパフォーマンスだけではありません。たとえば、4コアプロセッサのブロッキングシステムで10個のポートをリッスンしています。この例では4のは意味がありません
obayhan

3

使用して、nbio あなたがI / Oを行うためのより多くのスレッドが必要な場合は、I / Oまたはライブラリどんな非ブロックそのブロックを呼び出します


2

システムによって異なりますが、[ループでプロセスを作成することにより]サンプルプログラムを作成し、ps axo pid、ppid、rss、vsz、nlwp、cmdを使用して確認します。スレッドを作成できなくなったら、nlwp count [nlwp is the number threads]を確認してください。




0

次のコマンドで現在の値を確認できます-cat / proc / sys / kernel / threads-max

次のように値を設定することもできます

エコー100500> / proc / sys / kernel / threads-max

設定した値は、使用可能なRAMページに対してチェックされます。スレッド構造が利用可能なRAMページの1/8以上を占める場合、それに応じてthread-maxが削減されます。


0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.