Linux中每个进程的最大线程数?
在Linux下,一个进程可以创build的最大线程数是多less?
(如果可能)如何修改这个值?
Linux没有单独的每进程线程数限制,只是系统进程总数的限制(线程本质上只是在Linux上有一个共享地址空间的进程),你可以这样查看:
cat /proc/sys/kernel/threads-max
缺省值是内存页数/ 4。 你可以像这样增加:
echo 100000 > /proc/sys/kernel/threads-max
单个用户可能创build的进程数(也就是线程数)也有限制,请参阅ulimit/getrlimit
了解有关这些限制的详细信息。
这是错误的说,LINUX没有单独的线程每个进程的限制。
Linux间接实现每个进程的最大线程数量!
number of threads = total virtual memory / (stack size*1024*1024)
因此,通过增加总虚拟内存或减小堆栈大小,可以增加每个进程的线程数量。 但是,如果最大虚拟内存等于交换内存,则堆栈大小的减less会导致堆栈溢出导致代码失败。
检查你的机器:
总虚拟内存: ulimit -v
(默认是无限的,因此你需要增加交换内存来增加这个)
总堆栈大小: ulimit -s
(默认是8Mb)
增加这些值的命令:
ulimit -s newvalue ulimit -v newvalue
*用您想要作为限制的值replace新值。
参考文献:
http://dustycodes.wordpress.com/2012/02/09/increasing-number-of-threads-per-process/
实际上,这个限制通常是由堆栈空间决定的。 如果每个线程得到一个1MB的堆栈(我不记得这是Linux上的默认值),那么你的一个32位系统将在3000个线程之后耗尽地址空间(假设最后一个GB被保留给内核) 。
但是,如果使用多于几十个线程,则很可能会遇到可怕的性能问题。 迟早,你会得到太多的上下文切换开销,在调度程序中有太多的开销,等等。 (创build大量的线程只不过是吃了大量的内存而已,但实际工作中要做的很multithreading会让你放慢速度,因为它们正在争夺可用的CPU时间)
这个限制甚至是相关的,你在做什么?
检索它:
cat /proc/sys/kernel/threads-max
要设置它:
echo 123456789 > /proc/sys/kernel/threads-max
123456789 =线程数量
@dragosrsupercool
Linux不使用虚拟内存来计算线程的最大值,而是使用系统上安装的物理内存
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位我们得到了3GB的用户空间和1GB的内核,在64位上我们得到了128TB的虚拟内存,发生在Solaris上,如果你想增加虚拟内存,你需要添加交换空间。
在Linux上适当的10万线程:
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
线程数限制:$ 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虚拟机中线程内存堆栈限制是10M,对于1.5G内存,这个虚拟机只能支付150个线程?
这可能不重要。 你将得到更好的性能devise你的algorithm使用固定数量的线程(如4或8,如果你有4或8个处理器)。 你可以用工作队列,asynchronousIO或类似libevent来做到这一点。
使用nbio
非阻塞I / O库或其他任何,如果你需要更多的线程做I / O调用阻塞
取决于您的系统,只需编写一个示例程序(通过在循环中创build进程)并使用ps axo pid,ppid,rss,vsz,nlwp,cmd来检查。 当它不能创build线程检查nlwp计数[nlwp是数字线程]瞧,你有你的傻瓜certificate的答案,而不是通过书
对于现在在systemd系统(在我的情况下,特别是Ubuntu 16.04)的人来说,cgroup pids.max参数实施了另一个限制。
默认设置为12,288,可以在/etc/systemd/logind.conf中重写
其他build议仍然适用,包括pids_max,threads-max,max_maps_count,ulimits等
我们可以在linux中看到以下文件中定义的最大线程数
cat / proc / sys / kernel / threads-max
(要么)
sysctl -a | grep threads-max
要永久设置,
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线程。
你应该可以通过编译和运行在64位或设置ulimit -s 8192甚至ulimit -s 4096来提高这一点。但如果这是可取的是另一个讨论…