zoukankan      html  css  js  c++  java
  • 一台主机,至多可以开启多少个线程

    问题来源

    最近在做服务器压力以及并发测试,因为是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.如果客户程序非长连接,还可以让客户端线程反复跑起来!
  • 相关阅读:
    DFC-3C和DFC-3B的区别和注意事项
    Bug搬运工-CSCux99539:Intermittent error message "Power supply 2 failed or shutdown"
    EVE上传Dynamips、IOL和QEMU镜像
    EVE扩大虚拟内存
    EVE磁盘扩容
    VMware安装EVE
    介绍Mobility Group
    Bug搬运工-CSCvi02106 :Cisco 2800, 3800, 1560 APs: when connected to a Cisco Switch CDP-4-DUPLEX_MISMATCH log is seen
    jquery.autocomplete在火狐下的BUG解决
    nodeJS中exports和mopdule.exports的区别
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/5920903.html
Copyright © 2011-2022 走看看