[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 影响的是初始化时的用户环境,因此修改完毕后必须注销当前用户,重新登录后才会生效。

标签: linux

发表评论:

Powered by anycle 湘ICP备15001973号-1