3

私の目標は、並行して実行できる最大スレッドの数値を考え出すことです。私はGoogleから多くのリンクを指摘されました。そこでは、RAM/StackSizeを分割することで簡単な計算ができます。64ビットLinuxでは、スレッドスタックサイズは10 MB(ulimit -s = 10240kb)と定義されており、RAMは4 GBで、OS用に1 GBを残し、この計算で300スレッド程度にすることができますが、テストアプリケーションは小さいです。書き込みは最大32297になり、メモリ不足エラーが発生します。

-Xssを使用してさまざまな値を試しましたが、これらの値はスレッド数にほとんど影響を与えません。〜32297のままです)。

これにより、スタックサイズは可変であり、OSによって決定され、必要に応じて定義された最大値に達するという印象を受けましたが、どこを読んでも、スタックサイズは静的です。

私がここで欠けているのは正確には何ですか?

4

5 に答える 5

5

を使用してLinuxの最大スタックサイズを確認/変更してみてください

ulimit -s

Linuxスレッドの制限も確認してください

cat /proc/sys/kernel/threads-max  
于 2011-08-03T08:14:51.520 に答える
3

また、Java のスレッドには約 32K の制限があることがわかりました。このように多くのスレッドがある場合は、通常、別のアプローチを使用することをお勧めします。私のマシンでは、32K スレッドを実行すると、while(true) Thread.sleep(1000)コンテキスト切り替えだけで 3 つのコアが消費されます。

Java: 作成できるスレッド数の制限は?

于 2011-08-03T13:41:29.927 に答える
3

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/

于 2012-02-09T13:52:02.640 に答える
0

あなたが読んだことは、制限がアドレス空間(2 ^ 32)である場合、32ビットアーキテクチャでのみ有効です。Xmx + MaxPermSize + (Xss * スレッド数) < 最大アドレス空間 OS がユーザー プロセスに許可します。OSと物理ハードウェアによっては、あなたが言ったように3Goのようなものがあります。しかし、これはRAMとは関係ありません。

64 ビット アーキテクチャの場合、アドレス空間は制限されません (2^64)。誰かが上で言ったように、OS の制限を確認する必要があります。

于 2011-08-03T08:06:10.990 に答える
0

これは、pid_max カーネル変数がデフォルトで 32768 であるためですが、64 ビット システムでは最大 400 万まで増加する可能性があります。説明は簡単です。1 つのスレッド = 1 つの PID (プロセス ID) を持つ 1 つのプロセスなので、pid もスレッドもありません。

于 2018-03-07T23:41:07.007 に答える