Linux下进程可以创建的最大线程数是多少?
如何(如果可能)可以修改此值?
Linux没有每个进程限制的单独线程,只是对系统上进程总数的限制(线程本质上只是在Linux上具有共享地址空间的进程),您可以像这样查看:
cat /proc/sys/kernel/threads-max
默认值是内存页数/ 4.你可以增加这个:
echo 100000 > /proc/sys/kernel/threads-max
单个用户可能创建的进程数(以及线程数)也有限制,ulimit/getrlimit
有关这些限制的详细信息,请参阅.
这是错误的说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/
实际上,限制通常由堆栈空间决定.如果每个线程获得1MB堆栈(我不记得这是否是Linux上的默认值),那么32位系统将在3000个线程之后耗尽地址空间(假设最后一个gb保留给内核) .
但是,如果使用超过几十个线程,您很可能会遇到糟糕的性能.迟早,您会得到太多的上下文切换开销,调度程序中的开销太多,等等.(创建大量线程只会占用大量内存.但是很多线程需要做实际工作,因为他们正在争夺可用的CPU时间,这会减慢你的速度)
在这个限制甚至相关的情况下你在做什么?
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
@Thomas在系统系统上更新2018年:
/etc/systemd/logind.conf: UserTasksMax=100000
@dragosrsupercool
Linux不使用虚拟内存来计算线程的最大值,而是使用系统上安装的物理ram
max_threads = totalram_pages / (8 * 8192 / 4096);
http://kavassalis.com/2011/03/linux-and-the-maximum-number-of-processes-threads/
核心/ 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
设置它:
echo 123456789 > /proc/sys/kernel/threads-max
123456789 =线程数
线程数限制:
$ 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个线程?