问题来源
最近在做服务器压力以及并发测试,因为是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,单位是k2.使用pthread_attr_setstacksize在程序中改变线程栈大小,单位是byte3.运行程序的时候,是否以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.如果客户程序非长连接,还可以让客户端线程反复跑起来!
时间: 2024-11-03 01:30:33