压力测试 & 案例
计算机知识思维导图:压力测试 & 案例。网页展示前三层结构,可在线查看完整脑图并下载 GoMind 文件。
2026-08-25
## 压力测试 & 案例 ### 压力测试 & 案例 #### 瓶颈 ##### 硬件 ##### 网络 ##### 软件 ##### 负载(软件tomcat/硬件CPU,内存) #### 分析手段 ##### LoadRunner 11 压测 ##### 依据压测 评估服务器可支撑的并发数 ##### LoadRunner 11 参考配图 ##### linux服务器 状态检查 ##### tomcat 状态检查 ##### jvisualvm JVM监控 ##### 预测: 每s请求数 ##### 预算硬件 ##### 解释词 #### 数据收集 ##### tomcat status 状态监控 ##### CPU ##### 内存 ##### nginx ##### 业务数据库 #### 案例 ##### 浙广6套 跨年摇金币 ##### wasu元宵摇红包 > 仅展示前三层结构;请在线查看完整脑图或下载 GoMind 文件。
压力测试 & 案例
压力测试 & 案例
top
CPU
free
内存
硬件
宽带下行
客户端出口带宽(下载)
宽带上行
服务端入口带宽(上传)
网络
JAVA_OPTS="$JAVA_OPTS -Xms2560m"
JAVA_OPTS="$JAVA_OPTS -Xmx3000m"
JAVA_OPTS="$JAVA_OPTS -XX:PermSize=256m"
JAVA_OPTS="$JAVA_OPTS -XX:MaxPermSize=512m"
Catalina.sh -> 4G内存为例
JAVA_OPTS="-server" JAVA_OPTS="$JAVA_OPTS -Xms2560m" JAVA_OPTS="$JAVA_OPTS -Xmx3000m" JAVA_OPTS="$JAVA_OPTS -XX:PermSize=256m" JAVA_OPTS="$JAVA_OPTS -XX:MaxPermSize=512m"
jvm
maxThreads="2000"
maxProcessors="3000"
acceptCount="3000"
server.xml
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="30000"
redirectPort="8443"
minProcessors="10" maxThreads="2000" maxProcessors="3000" enableLookups="false" acceptCount="3000" debug="0" />http连接数
http://blog.csdn.net/jiushuai/article/details/7519060 <Connector port="8080" maxHttpHeaderSize="8192" useBodyEncodingForURI="true" 2. maxThreads="1000" minSpareThreads="25" maxSpareThreads="75" 3. enableLookups="false" redirectPort="8443" acceptCount="100" 4. compression="on" compressionMinSize="2048" 这些地方该怎么改? 如何加大tomcat连接数 在tomcat配置文件server.xml中的<Connector ... />配置中,和连接数相关的参数有: minProcessors:最小空闲连接线程数,用于提高系统处理性能,默认值为10 maxProcessors:最大连接线程数,即:并发处理的最大请求数,默认值为75 acceptCount:允许的最大连接数,应大于等于maxProcessors,默认值为100 enableLookups:是否反查域名,取值为:true或false。为了提高处理能力,应设置为false connectionTimeout:网络连接超时,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。通常可设置为30000毫秒。 其中和最大连接数相关的参数为maxProcessors和acceptCount。如果要加大并发连接数,应同时加大这两个参数。
tomcat
应用服务器
maxActivity 连接池的最大数据库连接数
maxIdea 最大空闲数,数据库连接的最大空闲时间。
工程数据库连接池配置 如:config.properties
maxIdle,最大空闲数,数据库连接的最大空闲时间。超过空闲时间,数据库连接将被标记为不可用,然后被释放。设为0表示无限制。
MaxActive,连接池的最大数据库连接数。设为0表示无限制。
maxWait ,最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示
<property name="maxActive" value="4000" />
<property name="maxIdle" value="1000" />
<property name="maxWait" value="30000" />应用连接数据库连接数
1000~5000 并行连接
max_connections
show variables like "max_connections"; set global max_connections = 2000; 这个设置会马上生效,但是当mysql重启时这个设置会失效,更好的办法是修改mysql的ini配置文件my.ini 找到mysqld块,修改或者添加下面的设置: max_connections=200 这样修改之后,即便重启mysql也会默认载入这个配置了
mysql
数据库连接数
软件
pcre 前置条件
安装 pcre-8.36 yum -y install gcc pcre-devel openssl openssl-devel 或 wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.21.tar.gz cd pcre-8.36 ./configure make make install
安装
安装 nginx-1.7.10 tar zxvf nginx-1.7.10.tar.gz cd nginx-1.7.10 ./configure 或 ./configure --prefix=/data/lucky/nginx --with-pcre=/data/lucky/pcre-8.36 make make install 注: --prefix=/data/lucky/nginx 安装目标路径(默认安装到/user/data/*) 低权限linux账号,对/user/data目录不可读,需要此参数更改安装目录
配置
配置:
vim /usr/local/nginx/conf/nginx.conf
内容:
#include host-conf/tomcat.conf;
upstream tomcat{
server 125.210.208.44:8080;
server 125.210.208.44:28081;
}
server {
listen 8081;
server_name tomcat;
。。。
}
或(Tengine):
vi /usr/local/nginx/conf/nginx.conf
include host-conf/tomcat.conf;
[luck@trsweb host-conf]$ vi tomcat.conf
upstream backend {
server 127.0.0.1:8080;
server 127.0.0.1:28080;
}
server {
#程序类
location / {
proxy_pass http://backend;
}
}启停
启动: /usr/local/nginx/sbin/nginx 或 sudo /usr/local/nginx/nginx 状态: ps -A | grep nginx 重启nginx: kill -HUP `cat /usr/local/nginx/logs/nginx.pid` 或 service nginx restart 停止nginx: kill `cat /usr/local/nginx/logs/nginx.pid`
均衡策略#ip hash
gzip压缩
nginx 软件层均衡
linux安装nginx http://limaoyuan.iteye.com/blog/904352 http://blog.163.com/power_mr/blog/static/1387440072013812111438462/
F5 硬件层均衡
引入消息同步机制(menmcach等)
内存对象不可同步
用图片服务器解决
上传到服务器本地目录资源(图片等),其它服务不可见
负载策略用 ip hash
session不可共享
分布式可能出现的问题
负载(软件tomcat/硬件CPU,内存)
瓶颈
无休息时间,测试服务器最大极限可受理的请求数
设休息时间,模拟实际用户场景
模拟实际用户数量
并发Vuser
Untitled node
应用服务器连接耗尽
数据库连接耗尽
连接耗尽
服务器 500
[10060] 连接已超时
Action.c(11): 错误 -27796: 连接服务器“125.210.208.44:8080”失败: “[10060] 连接已超时” loadrunner-27796错误寻求解决办法 - 鲵之风采的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/niqinwen/article/details/17302631
具体错误
优先解决,因为此可能影响到其它的参考数值
观察场景状态中错误情况
LoadRunner进行性能测试时遇到的问题汇总-tianwaitian666-ChinaUnix博客 http://blog.chinaunix.net/uid-27127953-id-3819231.html loadrunner报错汇总 http://wangqun116.iteye.com/blog/1695191
数据库连接数不够
mysql线程数 maxThread
客户端硬件资源不够用了-CPU
服务端硬件资源不够用了-CPU,内存,JVM
300~400 上不去
或
一定程度停止增长
服务超时
硬件资源上限
响应时间边长,导致
办法:单机增加多个tomcat服务,通过nginx配置负载均衡
tomcat挂掉
依据原因增加JVM配置内存等
JVM挂掉
下降,服务挂掉
观察每秒点击次数
配合Vuser新增
超过一定数值服务可能会挂掉
Max threads: 2000
Vuser只添加了这么多
Vuser数超过当前thread数,说明未同时连接,可能是休息时间或其它原因导致
上不去了
Current thread count: 100
观察tomcat在线用户session数
http://125.210.208.44:8080/manager/status "http-bio-8080" Max threads: 2000 Current thread count: 100 Current thread busy: 3 Max processing time: 17117 ms Processing time: 162.016 s Request count: 983 Error count: 7 Bytes received: 0.00 MB Bytes sent: 66.46 MB
压力客户机网上是否100%上线(常见于页面资源加载测试)
服务端带宽上限(上传带宽,宽带上行)
观察观察吞吐量
单次请求消耗时间
Untitled node
此图测试设置了2s休息时间.可见响应时间稳定且响应时间0.5s内
理想:1s内响应,图表稳定(直线)
观察-事务响应时间(含自定义的休息时间)
慢慢增长Vuser
Vuser同时进入
策略
Vuser上升曲线
事务响应时间(含自定义的休息时间)
每个用户1s内可能有多次连接
每秒点击次数可能超过同时在线人数
无休息时间
因设休息时间(如:2s),同时请求的用户在1s内只有1/2的人在请求服务器
此时每秒点击数为同时刻最大Vuser的一半
设休息时间
可结合同时刻Vuser数量,比较每秒点击数,可分析出1s成功请求用数量
每秒点击次数
网络资源消耗 如:每秒100MB
单页面消耗网络资源,流量 会在录制脚本时,编译后日志中体现
用户并发打开网页,加载大量资源时观察
吞吐量
监控目标
LoadRunner 11 压测
观察事务响应时间正常 即可支撑
设定Vuser人数,预测的请求休息时间
不正常,响应太慢,则调整Vuser参考人数
最大的Vuser人数和最大的每s请求数,都可转换为平台可支撑的 实际并发人数
正常,再放大Vuser人数
仅设定参考Vuser人数,不设置休息时间
观察事务响应时间是否正常
依据压测
评估服务器可支撑的并发数
压测.愿望接口,两个tomcat,3000
LoadRunner 11 参考配图
CPU
内存
磁盘
网络
linux服务器 状态检查
最大并发,当前并发
JVM内存
tomcat 状态检查
jvisualvm JVM监控
jvisualvm JVM监控 http://hepeng19861212.iteye.com/blog/964734
预计参加人数
每次请求休息时间s
预计并发人数
准备数据
预计并发人数
最大值(在单人请求间隔>1s情况下)
预计并发人数/每次请求休息时间s
约等于值
已知每s请求数/并发人数
并发人数/每s请求数=平均每人每s请求数
小于等于
估算请求间隔时间
扩展
预测: 每s请求数
=目标并发人数/单服务器并发数
预算硬件
每次请求休息时间s[操作间隔时间+请求处理时间]
1分钟最高数据库处理业务人数 (接近并发人数)
并发数 = 每s请求数 = 没s点击数
解释词
分析手段
实时监测会话
jvm消耗
tomcat status 状态监控
http://jingyan.baidu.com/article/925f8cb8f3d925c0dce05677.html <role rolename="admin-gui"/> <user username="admin" password="1234" roles="manager-gui"/>
top 实时
CPU
内存
具体请求过滤,统计
cat access.log | grep "05/Mar/2015:20:0" | grep "POST /gameServer/hongbao.do" | wc -l
时间信息提取
cat access.log | grep "05/Mar/2015:20" | grep "POST /gameServer/hongbao.do" | awk -F ' ' '{print $4}' | awk -F '/' '{print $3}' >> 20.txt历史时间的请求
cd /data/lucky/nginx/logs
cat access.log | grep "05/Mar/2015:12:00" | grep "POST /gameServer/hongbao.do" | awk -F ' ' '{print $4}' | awk -F '/' '{print $3}'
输入到本地
cat access.log | grep "05/Mar/2015:12:00" | grep "POST /gameServer/hongbao.do" | awk -F ' ' '{print $4}' | awk -F '/' '{print $3}' >> 12.txtUntitled node
制作图表
nginx
参加人数
每分钟业务情况
异常数据检查(并发,作弊等)
图表制作
图表制作
业务数据库
数据收集
tomcat
ESC -Cent OS
tomcat
ESC -Cent OS
RDS
tomcat
ESC -Cent OS.. 5台
SLB
阿里云
设备结构
1185
实际人数
由于后端请求休息时间差异,此数量没有太大的参考意义
5665
总请求数
454
1分钟最高处理请求数
19点档
834
实际人数
4105
总请求数
461
1分钟最高处理请求数
20点档
473
实际人数
2355
总请求数
248
1分钟最高处理请求数
21点档
302
实际人数
1509
总请求数
148
1分钟最高处理请求数
22点档
213
实际人数
1105
总请求数
92
1分钟最高处理请求数
23点档
85
实际人数
228
总请求数
81
1分钟最高处理请求数
24点档
规则
待收集
压测
1185
小于总人数(在单人请求间隔>1s情况下)
1185/N
约等于 总人数/请求休息间隔时间
-- 1s最高接受请求数 50 select create_date,count(*) from record GROUP BY create_date ORDER BY count(*) desc
50
-- 1s最高接受请求数 50 select create_date,count(*) from record GROUP BY create_date ORDER BY count(*) desc
大于 1s最高数据库处理业务数
总人数/网络队列每s受理数(其实很大,远超过并发人数)
够快的情况下是能超过总人数的. 即此不耗时
子主题 3
网络受理间隔秒数
实际人数2119
3s请求一次后端
1分钟最高数据库处理业务数 1623
1s最高数据库处理业务数 40
500
实际峰值每s请求数
wasu 元宵摇红包
实际人数1185
比wasu业务数少,是因为间隔时间长导致(30s请求一次后端)
1分钟最高数据库处理业务数 454
1s最高数据库处理业务数 50
估算出: 500*(50/40)=645
实际峰值每s请求数
浙广6套 跨年摇金币
依据经验比例估算
估算:每s请求数均值
实际运营
浙广6套 跨年摇金币
tomcat
mysql
tomcat
nginx
linux
设备结构
放大 http连接数
调整JVM 内存至10G (不一定要用这么多,只是机器本身有32G,冗余设计)
应用程序与数据库的连接数 调大
mysql maxThread放大
负载均衡 nginx + 2tomcat
调优
实际人数1600
1分钟最高数据库处理业务数(接近并发数) 668
1s最高数据库处理业务数 25
12点档
实际人数2119
1分钟最高数据库处理业务数 1623
1s最高数据库处理业务数 40
20点档
规则
猜测/预算
Untitled node
压测
Untitled node
图表制作
实际运营
wasu元宵摇红包
案例