Tomcat7线程优化及压力测试
一、测试内容
本次测试是针对业务微信端通知消息模块进行的压力测试,
测试用例是模拟用户点击推送消息查看通知详情。
二、测试方法及数据准备
本次采用开源测试工具jmeter采用多线程的方式模拟大量客户端向服务器方发送业务请求,达到压力测试的目的。
数据准备:5万个虚拟用户(uic_account_info表导入5万记录)
50万条通知明细(notice表10条、notice_subscr表导入50万记录)。
三、测试环境
Tomcat服务器:wx-dev-web,2核cpu,4g内存
Jmeter服务器:wx-dev-test02,2核cpu,4g内存
带宽:金山云内网带宽
四、jmeter设置
测试url:内部链接
Jmeter线程200,单线程循环100次
测试脚本:内部脚本
参数化文件:内部数据
名词定义(时间的单位均为ms):
Samples – 本次场景中一共完成了多少个线程
Average – 平均响应时间
Median – 统计意义上面的响应时间的中值
90% Line – 所有线程中90%的线程的响应时间都小于xx
Min – 最小响应时间
Max – 最大响应时间
Error – 出错率
Troughput – 吞吐量
KB/sec – 以流量做衡量的吞吐量
五、测试数据
1 测试一
基础参数,只有JVM内存修改为1000M。
吞吐量基本稳定在900以上,出错率较高基本>1%
Java参数:
1 | -Xms1000M -Xmx1000M -Xss512k |
Tomcat参数:
1 | <Connector port="8090" protocol="HTTP/1.1" |
数据样本:
Label | # Samples | Average | Median | 90% Line | 95% Line | 99% Line | Min | Max | Error % | Throughput | KB/sec |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | 20000 | 172 | 111 | 190 | 239 | 3000 | 2 | 3242 | 1.38% | 945.7 | 195.3 |
2 | 20000 | 181 | 112 | 204 | 343 | 3001 | 2 | 3574 | 1.26% | 938.5 | 193.7 |
3 | 20000 | 178 | 110 | 215 | 278 | 3001 | 3 | 3374 | 1.42% | 947.5 | 195.7 |
4 | 20000 | 171 | 110 | 210 | 262 | 3001 | 3 | 3280 | 1.23% | 987.5 | 203.8 |
5 | 20000 | 176 | 112 | 206 | 257 | 3001 | 3 | 3302 | 1.44% | 985 | 203.5 |
2 测试二
JVM参数不变,Tomcat线程数调到30000,测试tomcat线程过高的情况。
从压测结果看起到了反效果,吞吐量大部分只能在400左右。此时CPU达到瓶颈,吞吐量不稳定,tomcat不能线性处理请求,会出现卡顿并反映在cpu及jvm上
Java参数:
1 | -Xms1000M -Xmx1000M -Xss512k |
Tomcat参数:
1 | <Connector port="8090" protocol="org.apache.coyote.http11.Http11NioProtocol" |
数据样本:
Label | # Samples | Average | Median | 90% Line | 95% Line | 99% Line | Min | Max | Error % | Throughput | KB/sec |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | 20000 | 336 | 136 | 288 | 456 | 3000 | 2 | 30003 | 1.25% | 401.8 | 82.9 |
2 | 20000 | 391 | 294 | 483 | 627 | 2223 | 3 | 31000 | 0.60% | 327.3 | 67.3 |
3 | 20000 | 217 | 162 | 341 | 428 | 1224 | 3 | 30005 | 0.68% | 431.1 | 88.7 |
4 | 20000 | 188 | 148 | 268 | 340 | 1176 | 3 | 3714 | 0.50% | 939.5 | 193.2 |
5 | 20000 | 374 | 135 | 254 | 317 | 3000 | 2 | 30007 | 1.04% | 414.9 | 85.5 |
3 测试三
把Tomcat线程数减少到1000,结果与测试二类似
Java参数:
1 | -Xms1000M -Xmx1000M -Xss512k |
Tomcat参数:
1 | <Connector port="8090" protocol="org.apache.coyote.http11.Http11NioProtocol" |
数据样本:
Label | # Samples | Average | Median | 90% Line | 95% Line | 99% Line | Min | Max | Error % | Throughput | KB/sec |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | 20000 | 25 | 22 | 40 | 51 | 71 | 3 | 143 | 0.00% | 767.5 | 157.4 |
2 | 20000 | 270 | 197 | 466 | 625 | 1711 | 3 | 4063 | 0.90% | 672.2 | 138.5 |
3 | 20000 | 335 | 133 | 327 | 425 | 1239 | 3 | 30011 | 0.94% | 411.1 | 84.7 |
4 | 20000 | 254 | 112 | 258 | 308 | 1093 | 3 | 30010 | 0.76% | 458.2 | 94.3 |
5 | 20000 | 265 | 146 | 298 | 387 | 1185 | 3 | 30003 | 0.71% | 373.8 | 71.8 |
测试四
继续调小tomcat线程,测试结果比之前稳定,吞吐量保持在高水平,并且出错率比默认参数低一倍左右,基本<1%。
Java参数:
1 | -Xms1000M -Xmx1000M -Xss512k |
Tomcat参数:
1 | <Connector port="8090" protocol="org.apache.coyote.http11.Http11NioProtocol" |
数据样本:
Label | # Samples | Average | Median | 90% Line | 95% Line | 99% Line | Min | Max | Error % | Throughput | KB/sec |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | 20000 | 172 | 134 | 255 | 297 | 1151 | 2 | 3245 | 0.64% | 1005.7 | 206.9 |
2 | 20000 | 202 | 188 | 302 | 346 | 436 | 3 | 3261 | 0.25% | 898 | 184.4 |
3 | 20000 | 188 | 162 | 271 | 313 | 1105 | 2 | 3347 | 0.31% | 940.4 | 193.2 |
4 | 20000 | 194 | 160 | 278 | 331 | 1216 | 2 | 3153 | 0.74% | 921.6 | 189.7 |
5 | 20000 | 182 | 164 | 253 | 291 | 487 | 4 | 3240 | 0.50% | 984.8 | 202.5 |
测试五
继续调小tomcat线程,测试取得了最理想的结果,吞吐量稳定保持在高水平,比之前测试都要高,其他各项结果均有不同程度提升,关键是出错率为0%。
Java参数:
1 | -Xms1000M -Xmx1000M -Xss512k |
Tomcat参数:
1 | <Connector port="8090" protocol="org.apache.coyote.http11.Http11NioProtocol" |
数据样本:
Label | # Samples | Average | Median | 90% Line | 95% Line | 99% Line | Min | Max | Error % | Throughput | KB/sec |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | 20000 | 176 | 179 | 222 | 234 | 262 | 5 | 333 | 0.00% | 1069.9 | 219.4 |
2 | 20000 | 208 | 204 | 272 | 299 | 348 | 6 | 494 | 0.00% | 920.5 | 188.8 |
3 | 20000 | 182 | 183 | 230 | 243 | 267 | 9 | 323 | 0.00% | 1036.8 | 212.6 |
4 | 20000 | 178 | 180 | 230 | 244 | 276 | 3 | 3004 | 0.00% | 1036.8 | 212.6 |
5 | 20000 | 181 | 183 | 234 | 248 | 277 | 5 | 387 | 0.00% | 1039.3 | 213.1 |
六、结论
- 当前最大瓶颈在服务器配置,主要受cpu限制,不能承载大并发请求。
- 此项压测对数据库无明显依赖,测试过程中数据库指标健康。
- Tomcat线程按测试五参数调整能达到最优性能,吞吐率稳定而且出错率为0。
1
2
3
4
5
6
7
8
9
10<Connector port="8090" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
enableLookups="false"
maxThreads="128"
minSpareThreads="32"
maxSpareThreads="64"
acceptCount="300"
debug="0"
disableUploadTimeout="true"
redirectPort="8443" /> - 按当前服务器配置,tomcat参数调优对整体吞吐性能影响不算明显,大概提升10%左右,但是对出错率有较好提升。