Fedora 30(12GB RAM)とUbuntu 16 Linuxシステム(16GB RAM)に10,000を超えるスレッドを割り当てようとしています。
約10,000個のスレッドで次のエラーが発生します。
- Java:新しい基本スレッドを作成できません。
- C: リソースは一時的に使用できません。
Fedoraシステムのいくつかの設定に従ってください。
$ uname -a
Linux lab21.xxxxx.ix 5.1.11-300.fc30.x86_64 #1 SMP Mon Jun 17 19:33:15 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
$ ulimit -a
core file size (blocks, -c) unlimited
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 47765
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 47765
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
$ cat /proc/sys/kernel/pid_max
32768
$ cat /proc/sys/kernel/threads-max
95530
**$ cat /proc/meminfo (before the stress test)**
MemTotal: 12257732 kB
MemFree: 11424808 kB
MemAvailable: 11772784 kB
Buffers: 74556 kB
Cached: 487680 kB
SwapCached: 0 kB
Active: 424696 kB
Inactive: 224036 kB
Active(anon): 87056 kB
Inactive(anon): 592 kB
Active(file): 337640 kB
Inactive(file): 223444 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 6003828 kB
SwapFree: 6003828 kB
Dirty: 1576 kB
Writeback: 0 kB
AnonPages: 86496 kB
Mapped: 112124 kB
Shmem: 1152 kB
KReclaimable: 45044 kB
Slab: 100440 kB
SReclaimable: 45044 kB
SUnreclaim: 55396 kB
KernelStack: 3600 kB
PageTables: 3784 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 12132692 kB
Committed_AS: 732436 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 0 kB
VmallocChunk: 0 kB
Percpu: 7680 kB
HardwareCorrupted: 0 kB
AnonHugePages: 0 kB
ShmemHugePages: 0 kB
ShmemPmdMapped: 0 kB
CmaTotal: 0 kB
CmaFree: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
Hugetlb: 0 kB
DirectMap4k: 121280 kB
DirectMap2M: 12427264 kB
**After the stress test**
MemTotal: 12257732 kB
MemFree: 11014248 kB
MemAvailable: 11363328 kB
Buffers: 75096 kB
Cached: 487988 kB
SwapCached: 0 kB
Active: 517840 kB
Inactive: 221644 kB
Active(anon): 176960 kB
Inactive(anon): 600 kB
Active(file): 340880 kB
Inactive(file): 221044 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 6003828 kB
SwapFree: 6003828 kB
Dirty: 0 kB
Writeback: 0 kB
AnonPages: 176428 kB
Mapped: 112408 kB
Shmem: 1160 kB
KReclaimable: 45576 kB
Slab: 208928 kB
SReclaimable: 45576 kB
SUnreclaim: 163352 kB
KernelStack: 171744 kB
PageTables: 46040 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 12132692 kB
Committed_AS: 86824336 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 0 kB
VmallocChunk: 0 kB
Percpu: 7872 kB
HardwareCorrupted: 0 kB
AnonHugePages: 0 kB
ShmemHugePages: 0 kB
ShmemPmdMapped: 0 kB
CmaTotal: 0 kB
CmaFree: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
Hugetlb: 0 kB
DirectMap4k: 123328 kB
DirectMap2M: 12425216 kB
FedoreシステムよりもRAMが4GB多いUbuntuシステムでは、13K以下を割り当てることができます。この違いは、Ubuntuシステムのより大きなメモリに関連している可能性があります。
どのようなヒントがありますか?
答え1
問題はsystemd cgroupの制限...
「/sys/fs/cgroup/pids/user.slice/user-$UID.slice/pids.max」を確認しましたが、10.813です。 15000に増やしてスレッドを割り当てます。
したがって、Systemdはcgroupを使用してリソースとスレッドを制限します。
この記事は真実への道です!
答え2
特定のシステムのリソース制限を理解するのに役立ちますが、あまりにも多くのネイティブスレッドを作成しようとすると、これだけではエラーの根本原因を特定するのに十分ではありません。 e もっと興味深いのは、返されるエラーがpthread_create()
リソース制限を超えたことを示していることです。通知されない重要な情報は、どのリソース制限を超えたかです。
イガオン- 別のスレッドを作成するには、リソースが不足しているか、スレッド数にシステム制限がありました。後者の状況は、2つの方法で発生する可能性があります。つまり、実際のユーザーIDのプロセス数を制限するRLIMIT_NPROCソフトリソース制限(setrlimit(2)を介して設定)に達するか、カーネル内のスレッド数にシステム全体の制限があります。 /proc/sysが/kernel/threads-maxに達しました。源泉:https://linux.die.net/man/3/pthread_create
残念ながら、これは、どのリソース制約が問題を引き起こすのかを理解するために、退屈な手動デバッグを実行する必要があることを意味します。
注: Java は、Thread
Linux の POSIX スレッド (pthread) であるオペレーティングシステムの基本スレッドを通じて実装されます。 Cと同じなので、症状も似ています。
デリゲート
あなたに効果的で時間をよりよく活用するもう1つの選択肢は、軽量スレッド(緑色スレッドとも呼ばれる)を使用することです。比較すると先制攻撃Linuxカーネルがスレッドと軽量スレッドの切り替えを担当する基本スレッド(pthreadなど)のスレッドモデルは次のとおりです。協力的なこれは、軽量スレッドがマルチスレッドの実行感を維持するために定期的にメインスレッドに譲歩する必要があることを意味します。
表面的には、これは悪いモデルのように見えるかもしれませんが、軽量スレッドの最大の利点の1つは、利用可能なリソースに最小限の影響を与えながら一般に約100,000のスレッドを実行できることです。明らかに、各軽量スレッドでファイルを開くと起動した場所に戻りますが、軽量スレッドを詳しく見て、これが実行可能なソリューションであることを確認することをお勧めします。