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

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

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

首先分析32位linux系统

对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运行,可以避免被限制资源

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

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.如果客户程序非长连接,还可以让客户端线程反复跑起来!
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值