ab压力测试中,发现你一次最多只能启动1024个线程

  • 默认情况下,一个线程的栈要预留1M的内存空间
    而一个进程中可用的内存空间只有2G,所以理论上一个进程中最多可以开2048个线程
  • 但是内存当然不可能完全拿来作线程的栈,所以实际数目要比这个值要小。你也可以通过连接时修改默认栈大小,将其改的比较小,这样就可以多开一些线程。如将默认栈的大小改成512K,这样理论上最多就可以开4096个线程。即使物理内存再大,一个进程中可以起的线程总要受到2GB这个内存空间的限制。
  • 比方说你的机器装了64GB物理内存,但每个进程的内存空间还是4GB,其中用户态可用的还是2GB。
    • 内核态. CPU可以访问内存所有数据, 包括外围设备, 例如硬盘, 网卡. CPU也可以将自己从一个程序切换到另一个程序
    • 用户态:.只能受限的访问内存, 且不允许访问外围设备. 占用CPU的能力被剥夺, CPU资源可以被其他程序获取
  • 如果是同一台机器内的话,能起多少线程也是受内存限制的。每个线程对象都要站用非页面内存,而非页面内存也是有限的,当非页面内存被耗尽时,也就无法创建线程了。
  • 如果物理内存非常大,同一台机器内可以跑的线程数目的限制值会越来越大。在Windows下写个程序,一个进程Fork出2000个左右线程就会异常退出了,为什么?这个问题的产生是因为windows32位系统,一个进程所能使用的最大虚拟内存为2G,而一个线程的默认线程栈StackSize为1024K(1M),这样当线程数量逼近2000时,2000*1024K=2G(大约),内存资源就相当于耗尽

影响最大线程大小的因素

  • Java虚拟机本身

    • Xms 初始堆大小
    • Xmx 最大堆大小
    • Xss 每个线程的堆栈大小
  • 系统限制
    • /proc/sys/kernel/pid_max
    • /proc/sys/kernel/thread-max
    • max_user_process(ulimit -u)
    • /proc/sys/vm/max_map_count

其他突破线程问题

  • 多进程-启动多线程
  • 使用异步请求
    • 无论是使用多进程-多线程,还是异步请求,最主要的影响还是电脑本身的配置

下面是具体配置

Windows

httpd.exe -l 会看见 mpm_winnt.c windows默认执行 mpm_winnt_module方式 (暂未找到修改成其他方式的方法)

1.httpd.conf 文件去掉 Include conf/extra/httpd-mpm.conf 前面的#

2.修改extra/httpd-mpm.conf 最下面 或 查找 mpm_winnt_module 修改ThreadsPerChild 和 MaxRequestsPerChild

#每个子进程建立的线程数
ThreadsPerChild 1 默认150 #指令设置每个子进程在其生存期内允许伺服的最大请求数量。
#到达MaxRequestsPerChild的限制后,子进程将会结束。
#如果MaxRequestsPerChild为"0",子进程将永远不会结束。
MaxRequestsPerChild 10 默认0

根据自己网站并发数量设置:
ThreadsPerChild 设置 网站平均在线人数
MaxRequestsPerChild 设置最高在线人数的值

Linux

ps -ef | grep httpd | wc -l 查看当前 httpd进程数

apachectl -l 会看见 prefork.c Linux默认执行 mpm_prefork_module

  1. httpd.conf 文件去掉 Include conf/extra/httpd-mpm.conf 前面的#

2.修改extra/httpd-mpm.conf 最上面 或 查找 mpm_prefork_module

StartServers          5 #默认启动线程数

    #指令设置空闲子进程的最小数量。
#所谓空闲子进程是指没有正在处理请求的子进程。
#如果当前空闲子进程数少于MinSpareServers ,
#那么Apache将以最大每秒一个的速度产生新的子进程。
#只有在非常繁忙机器上才需要调整这个参数。将此参数设的太大通常是一个坏主意。
MinSpareServers 5 # #指令设置空闲子进程的最大数量。
#所谓空闲子进程是指没有正在处理请求的子进程。
#如果当前有超过MaxSpareServers数量的空闲子进程,
#那么父进程将杀死多余的子进程。
#只有在非常繁忙机器上才需要调整这个参数。
#将此参数设的太大通常是一个坏主意。
#如果你将该指令的值设置为比MinSpareServers小,
#Apache将会自动将其修改成"MinSpareServers+1"。
MaxSpareServers 10 #
MaxClients 150 #apache可以同时处理的请求
MaxRequestsPerChild 0 #如windows MaxRequestsPerChild

其他参考

作者:望月成三人
链接:https://www.jianshu.com/p/8f39dc823052
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

ab压力测试-突破最大线程数的更多相关文章

  1. 简单模拟一下ab压力测试

    简单了解下ab ab全程是apache benchmark,是apache官方推出的一个工具,创建多个并发访问线程,模拟多个访问者同时对一个URL地址进行访问.它的测试目标是基于URL的,因此它既可以 ...

  2. linux ab压力测试工具及ab命令详解

    原文链接:https://blog.csdn.net/qq_27517377/article/details/78794409 yum -y install httpd-tools ab -v 查看a ...

  3. Web性能测试篇:AB 压力测试

    1. 压力测试的概念\定义 1.这段话是给刚接触\学习性能测试知识的初学者,在实际工作中都会接触到性能测试.压力测试.负载测试等专业名词也容易混淆,下面带大家熟悉下这到底是怎么定义: 1.1.性能测试 ...

  4. Nginx网络架构实战学习笔记(五):大访问量优化整体思路、ab压力测试及nginx性能统计模块、nginx单机1w并发优化

    文章目录 大访问量优化整体思路 ab压力测试及nginx性能统计模块 ab压力测试及nginx性能统计模块 ab压力测试 nginx性能统计模块 nginx单机1w并发优化 整装待发: socket ...

  5. 4分钟apache自带ab压力测试工具使用: 2015.10.4

    2015.10.44分钟apache自带ab压力测试工具使用:win8.1 wampserver2.5 -Apache-2.4.9-Mysql-5.6.17-php5.5.12-64b 可以参考一下部 ...

  6. win8.1上wamp环境中利用apache自带ab压力测试工具使用超简单讲解

    2015.10.4apache自带ab压力测试工具使用:本地环境:win8.1 wampserver2.5 -Apache-2.4.9-Mysql-5.6.17-php5.5.12-64b 可以参考一 ...

  7. apache ab压力测试报错(apr_socket_recv: Connection reset by peer (104))

    apache ab压力测试报错(apr_socket_recv: Connection reset by peer (104))   今天用apache 自带的ab工具测试,当并发量达到1000多的时 ...

  8. ab压力测试nginx

    centos7系统: yum install httpd-tools -y #安装ab压力测试工具

  9. apache ab压力测试报错apr_socket_recv

    apache ab压力测试报错(apr_socket_recv: Connection reset by peer (104)) apache 自带的ab工具测试,当并发量达到1000多的时候报错如下 ...

随机推荐

  1. VIM键盘图

  2. SPOJ FAVDICE 数学期望

    题目大意: 一个有n面的色子抛掷多少次能使所有面都能被抛到过,求期望值 总面数为n,当已经抛到过 i 个不同面时,我们抛出下一个不同面的概率为 (n-i)/n,那么抛的次数为 n/(n-i) 将所有抛 ...

  3. ZOJ 2588 求割边问题

    题目链接:http://vjudge.net/problem/viewProblem.action?id=14877 题目大意: 要尽可能多的烧毁桥,另外还要保证图的连通性,问哪些桥是绝对不能烧毁的 ...

  4. hdu 1059二进制优化背包问题

    #include<stdio.h> #include<string.h> int max(int a,int b ) {  return a>b?a:b; } int a ...

  5. 自用的博客皮肤CSS代码

    是在默认皮肤simple memory的基础上进行的魔改 /*****home和头部开始**************************/ #home { margin: 0 auto; widt ...

  6. SA模板

    #include<cstdio> #include<algorithm> #include<cstring> using namespace std; ; char ...

  7. BZOJ1702: [Usaco2007 Mar]Gold Balanced Lineup 平衡的队列

    n<=100000个数表示每头牛在K<=30种物品的选取情况,该数在二进制下某位为0表示不选1表示选,求一个最大的区间使区间内选择每种物品的牛一样多. 数学转化,把不同状态间单变量的关系通 ...

  8. Multiply Strings(字符串乘法模拟,包含了加法模拟)

    Given two numbers represented as strings, return multiplication of the numbers as a string. Note: Th ...

  9. HTML DOM对象的属性和方法介绍(原生JS方法)

    HTML DOM对象的属性和方法介绍 DOM 是 Document Object Model(文档对象模型)的缩写. DOM(文档对象模型)是针对HTML和XML文档的一个API(应用程序编程接口), ...

  10. Nexus搭建Maven私有仓库

    原文:http://blog.csdn.net/rickyit/article/details/54927101 前言 Nexus Repository Manager is a Javaapplic ...