苗火 Nicholas
[linux]最大线程数受多个原因制约
2016-3-10 萧
用 cat /proc/sys/kernel/threads-max 检查一下系统支持的最大线程数,一般来说数字都很大。但实际上用户创建线程的数量还是受几方面制约的。



1、PTHREAT_THREAD_MAX 这个值描述了单个用户进程可创建的最大线程数,直接修改并无效果,得在修改后重新编译C库才能起作用,除非有特殊要求,否则就小题大做了。



2、linux 中每个线程分配的栈空间缺省为8M,分配给用户编程的地址空间为3G,因此纯理论上包括主线程在内最大线程数不超过 3 * 1024 / 8 = 384 个,加上代码段,数据段等开销,这个数字还要减少。因此减少每个线程的栈大小可以增加创建的线程数。

使用 pthread_create() 创建线程时可以用 pthread_attr_setstacksize() 函数来设置一个较小的栈大小。以此增加线程总数。这样做的好处是只影响程序本身。

也可以直接用 ulimit -s 修改缺省的栈大小。不过这样容易影响所有用户进程和线程,如非必要,不建议这样做。



3、用 uname -r 检查一下内核版本,如果使用的是2.4的内核,则线程是采用轻量级进程实现的,线程数是统计在进程基数中的。当很多使用线程的软件会开比较多的线程时,在数量上等同于开了相同数量的进程。所以可以通过 ulimit -u 检查一下用户创建最大线程数的大小,一般来说,很多系统都会把进程数设置为小于500,这样如果碰到线程开的太多的话自然容易出现问题。如果是 unlimited 则没有限制。

如果确实是这个原因,则可以修改 /etc/security/limits.conf 中的 nproc 项,至于格式,该文件里的注释已经说的很清楚了。基本上就是:

影响区域(如用户,组,软件名称等) 限制方式{硬性,柔性} SP 项目名称(如进程数,文件数等) SP 数值

修改最大进程数限制的具体实例如:(SP代表空格)

* SP soft SP nproc SP 1024

需要注意的是,由于修改 /etc/security/limits.conf 影响的是初始化时的用户环境,因此修改完毕后必须注销当前用户,重新登录后才会生效。
发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容