Linux中每个进程的最大线程数?
Linux下进程可以创建的最大线程数是多少 如何(如果可能)修改此值?检索此值:Linux中每个进程的最大线程数?,linux,multithreading,Linux,Multithreading,Linux下进程可以创建的最大线程数是多少 如何(如果可能)修改此值?检索此值: cat /proc/sys/kernel/threads-max 要设置它,请执行以下操作: echo 123456789 | sudo tee -a /proc/sys/kernel/threads-max 123456789=#of threadsLinux没有单独的每个进程的线程限制,只有系统上进程总数的限制(线程基本上只是Linux上具有共享地址空间的进程),您可以这样查看: cat /proc/sys
cat /proc/sys/kernel/threads-max
要设置它,请执行以下操作:
echo 123456789 | sudo tee -a /proc/sys/kernel/threads-max
123456789=#of threadsLinux没有单独的每个进程的线程限制,只有系统上进程总数的限制(线程基本上只是Linux上具有共享地址空间的进程),您可以这样查看:
cat /proc/sys/kernel/threads-max
默认值为内存页数/4。您可以这样增加:
echo 100000 > /proc/sys/kernel/threads-max
单个用户可以创建的进程(以及线程)数量也有限制,有关这些限制的详细信息,请参见
ulimit/getrlimit
。实际上,限制通常由堆栈空间决定。如果每个线程都有一个1MB堆栈(我不记得这是否是Linux上的默认值),那么在3000个线程之后,32位系统的地址空间就会用完(假设最后一个gb保留给内核)
但是,如果您使用的线程超过几十个,您很可能会体验到糟糕的性能。迟早会有太多的上下文切换开销,调度器中的开销,等等。(创建大量线程只会消耗大量内存。但是,大量有实际工作要做的线程会降低您的速度,因为它们正在争夺可用的CPU时间)
如果这个限制是相关的,你在做什么?这可能不重要。如果将算法设计为使用固定数量的线程(例如,如果有4个或8个处理器,则为4个或8个),您将获得更好的性能。您可以使用工作队列、异步IO或类似libevent的东西来实现这一点 使用
nbio
非阻塞i/o
如果需要更多线程来执行阻塞的I/O调用,那么说LINUX没有每个进程单独的线程限制是错误的 Linux间接实现每个进程的最大线程数强> 因此,可以通过增加总虚拟内存或减少堆栈大小来增加每个进程的线程数。但是,当最大虚拟内存等于交换内存时,由于堆栈溢出,过度减小堆栈大小可能导致代码失败 检查您的机器:
ulimit -s newvalue
ulimit -v newvalue
总虚拟内存:ulimit-v
(默认值是无限的,因此需要增加交换内存以增加该值)
总堆栈大小:ulimit-s
(默认值为8Mb)
增加这些值的命令:
ulimit -s newvalue
ulimit -v newvalue
*将新值替换为要设置为限制的值
参考文献:
ulimit -s newvalue
ulimit -v newvalue
根据您的系统,只需编写一个示例程序[通过在循环中创建进程]并使用ps-axo-pid、ppid、rss、vsz、nlwp、cmd进行检查。当它不能再创建线程时,检查nlwp计数[nlwp是线程数]瞧,你得到了你的傻瓜式答案,而不是阅读书籍 Linux不使用虚拟内存来计算线程的最大值,而是使用安装在系统上的物理ram
max_threads = totalram_pages / (8 * 8192 / 4096);
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不需要增加虚拟内存,因为在32位上,我们有3 GB的用户空间,1 GB的内核空间,在64位上,我们有128 TB的虚拟内存,这在Solaris上发生,如果要增加虚拟内存,则需要添加交换空间。线程计数限制:
$ cat /proc/sys/kernel/threads-max
计算方法:
max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);
以及:
x86_64页面大小(页面大小)为4K;
与所有其他体系结构一样,x86_64对每个活动线程都有一个内核堆栈。这些线程堆栈是线程大小(2*页面大小)大
对于mempages:
cat /proc/zoneinfo | grep spanned | awk '{totalpages=totalpages+$2} END {print totalpages}';
因此,实际上这个数字与线程内存堆栈大小的限制无关(ulimit-s
)
注意:在我的rhel虚拟机中,线程内存堆栈限制为10M,对于1.5G内存,该虚拟机只能提供150个线程?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
2018年更新自@Thomas,关于systemd systems:
/etc/systemd/logind.conf: UserTasksMax=100000
我们可以在linux中看到以下文件中定义的最大线程数 cat/proc/sys/kernel/threads max (或) sysctl-a | grep threads max永久设置
vim /etc/sysctl.conf
并添加
kernel.threads-max = "value"
对于现在看到这一点的人来说,在systemd系统(在我的例子中,特别是Ubuntu 16.04)上,cgroup pids.max参数还有一个限制 默认设置为12288,可以在/etc/systemd/logind.conf中重写
其他建议仍然适用,包括PID_max、threads max、max_maps_count、ulimit等。使用ulimit检查每个线程的堆栈大小,在我的例子中是Redhat Linux 2.6:
ulimit -a
...
stack size (kbytes, -s) 10240
每个线程都将获得分配给其堆栈的内存量(10MB)。对于32位程序和4GB的最大地址空间,最大值仅为4096MB/10MB=409个线程!!!减去程序代码,减去堆空间可能会导致观察到最多300个线程
您应该能够通过编译并在64位上运行或设置ulimit-s8192甚至ulimit-s4096来提高这一点。但如果这是另一个讨论…您可以通过以下命令查看当前值- cat/proc/sys/kernel/threads max 您还可以设置如下值 echo 100500>/proc/sys/kernel/threads max
您设置的值将根据可用RAM页面进行检查。如果线程结构占用可用RAM页面的1/8)以上,则线程最大值将相应减少。是,要增加线程数,需要增加虚拟内存或减小堆栈大小。在Raspberry Pi中,我没有找到增加虚拟内存的方法,如果将堆栈大小从默认的8MB减少到1MB,则每个进程可能会获得1000多个线程,但是
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
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