Linux下一个进程可以创建的最大线程数是多少?
如何(如果可能的话)修改这个值?
Linux下一个进程可以创建的最大线程数是多少?
如何(如果可能的话)修改这个值?
当前回答
我认为我们错过了另一个限制,它也会阻止新线程的创建,这是内核。pid_max极限。
root@myhost:~# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 16.04.7 LTS
Release: 16.04
Codename: xenial
root@myhost:~# uname -a
Linux myhost 4.4.0-190-generic #220-Ubuntu SMP Fri Aug 28 23:02:15 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
我发现至少在我的系统中,这个阈值核。Pid_max是32768。当我启动任何简单的JVM进程时,它会报告如下错误:
java/jstack/jstat ...
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Cannot create GC thread. Out of system resources.
# An error report file with more information is saved as:
# /root/hs_err_pid1390.log
检查内存是否充足。
root@lascorehadoop-15a32:~# free -mh
total used free shared buff/cache available
Mem: 125G 11G 41G 1.2G 72G 111G
Swap: 0B 0B 0B
检查系统线程:
~# ps -eLf|wc -l
31506
但是我用ulimit检查系统限制:
root@myhost:~# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 515471
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 98000
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) 515471
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
从ulimit输出中,我们可以看到当前线程数远远小于最大用户进程限制。
实际上,所达到的极限是kernel.pid_max
非常容易检查和调整: https://www.cyberciti.biz/tips/howto-linux-increase-pid-limits.html
其他回答
Yes, to increase the threads number you need to increase the virtual memory or decrease the stack size. In Raspberry Pi I didn’t find a way to increase the virtual memory, if a decrease the stack size from default 8MB to 1MB It is possibly get more than 1000 threads per process but decrease the stack size with the “ulimit -s” command make this for all threads. So, my solution was use “pthread_t” instance “thread class” because the pthread_t let me set the stack size per each thread. Finally, I am available to archive more than 1000 threads per process in Raspberry Pi each one with 1MB of stack.
如果使用Suse操作系统,则需要选择其中一种方法
https://www.suse.com/support/kb/doc/?id=000015901
全球性的,
/etc/systemd/system.conf
DefaultTasksMax=Value
对于特定的ssh服务
/etc/systemd/system/sshd.service.d/override.conf
TasksMax=Value
要永久地固定,
vim /etc/sysctl.conf
并添加
kernel.threads-max = "value"
使用ulimit检查每个线程的堆栈大小,在我的情况下Redhat Linux 2.6:
ulimit -a
...
stack size (kbytes, -s) 10240
你的每个线程将得到这个数量的内存(10MB)分配给它的堆栈。一个32位的程序,最大地址空间为4GB,最大只有4096MB / 10MB = 409个线程!!减去程序代码,减去堆空间可能会导致观察到的最大值。300个线程。
您应该能够通过在64bit上编译和运行或设置ulimit -s 8192甚至ulimit -s 4096来引发这个问题。但如果这是明智的是另一个讨论…
可以通过以下命令查看当前值- 猫/proc/sys/kernel/threads-max
您还可以像这样设置值
Echo 100500 > /proc/sys/kernel/threads-max
您设置的值将根据可用的RAM页进行检查。如果线程结构占用可用RAM页面的1/8以上,则thread-max将相应降低。