一台主机,至多可以开启多少个线程

Posted Leo_wlCnBlogs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一台主机,至多可以开启多少个线程相关的知识,希望对你有一定的参考价值。

问题来源

最近在做服务器压力以及并发测试,因为是C/S模型,所以需要自己模拟客户端,需要运行大量的线程模拟并发,于是就碰到这个问题了。

另一个原因是,我在服务器中创建了一个线程池,我很想知道线程池的个数上限,从而更好的制定线程池动态增减的方法,所以也做了同样的测试。

首先分析32linux系统

对32位系统来说,理论上的寻址范围是4G(2^32),但实际系统还要预留系统空间用于自身管理,一般来说真正的最大寻址范围都要小于4G。对于Linux来说,一个进程拥有的用户空间为0~0xBFFFFFFF,共3G,另外1G是内核空间;Windows的到0x7FFFFFFF,只有2G。(32位系统的寻址范围还可以扩大,应用某些扩展标准,例如PAE,最多能支持到16G到64G不等。但这个情况不在我的讨论范围)。

一个LInux进程在用户态最多访问3G内存,每个线程必须占用特定大小的堆栈空间(stack size),这个因素使32位系统创建的线程数不可能超过n=3G/StackSize 
注:Stack Size可以用ulimit -s查看,单位是k,同时这个size是可以设定的。

我的系统是ubuntu12.04,这个size是8192k

所以大致上一个用户进程最对创建360左右的线程数。

Create thread 303
can‘t create thread: Cannot allocate memory

 

然后考虑64位系统

因为64位系统,没有寻址范围的限制,所以理论上,可以创建的线程数应该是几乎无限的,除非其他条件限制。

但是,我在实际测试中,当创建线程数达到7500左右的时候,出现错误。但是原因一直没能找到。
Create thread 7545
can‘t create thread: Resource temporarily unavailable

如何更改线程栈的大小

1.使用ulimit -s size命令,将线程栈大小临时设置成size,单位是k
2.使用pthread_attr_setstacksize在程序中改变线程栈大小,单位是byte
3.运行程序的时候,是否以root运行,可以避免被限制资源

64linux下,增加线程数的方法试验

1.使用ulimit -s,将线程栈大小改为1024k,最大创建线程数仍为7500,没有改变,说明64位系统栈空间大小已经不再是限制了。
2.以root权限运行程序,发现线程可以运行数目达到1.5w级别,确实权限高,受限小一些,但是有风险。
3.使用ulimit -s改变线程栈大小,然后再以root权限运行,结果与2一样,说明线程栈空间不是限制因素。

 

服务器并发的测试方法

1.首先编写了客户端程序,并进行单个测试,ok!
2.将客户端程序改写成多线程的,一个客户端运行100个线程(线程是1中的程序改装)
3.shell脚本并行运行2中的客户端100次,那么就可以创造100*100的并发了。
4.一台机子可开启的线程数受限,考虑N台同时运行,那么并发测试就可以N*100*100了。
5.如果客户程序非长连接,还可以让客户端线程反复跑起来!

以上是关于一台主机,至多可以开启多少个线程的主要内容,如果未能解决你的问题,请参考以下文章

一个电脑最多能开启多少个线程

一台Java服务器如何跑多少个线程

Bzoj2339--Hnoi2011卡农

一台主机可以多人同时使用?

如何一台主机多人用?

深度为k的二叉树至多有多少个结点