性能测试报告
测试环境
- CPU 4core AMD Opteron 62xx class
- MemTotal: 8061436 kB
- nginx version: openresty/1.11.2.5
- redis-cli 4.0.2
业务背景
redis数据结构
(1)hash:
[key]_mac: 已本地激活的号码,field为mac,value为 icntv_id
[key]_icntv_id: 已本地激活和尚未激活的号码,field为icntv_id,value为 mac:timestamp,尚未绑定的时候value为-1
(2)list:
[key]_pool:记录该[key]池中尚未使用的号码,测试前已经写入了10万条数据
[key]_activation: value为[icntv_id:mac:timestamp]值的长串,pop后进入MQ
需测试接口
1./auth 验证接口,验证号码和绑定是否一致
2./activate 绑定接口,传入mac绑定对应的号码
测试工具以及方法
ab
apache所出http的benchmark工具,通过调整并发数测试不同并发下的接口表现情况,但无法调整post的body内容,测试脚本如下:
ab -n 20000 -c 50 -k -T application/json -p post.txt http://xxx.xxx.xxx.xxx:8080/auth >> ab.log -c 并发数
wrk
一个开源http的benchmark工具,与ab不同的是支持lua脚本修改每次提交内容,测试脚本如下:
wrk -t1 -c600 -d10s -s scripts/mac_add.lua http://xxx.xxx.xxx.xxx:8080/auth >> wrk.log
涉及lua脚本如下:
counta = 190001
request = function()
counta = counta + 1
wrk.headers["Content-Type"] = "application/json"
wrk.body = '{"mac":"'..counta..'"}'
wrk.method = "POST"
return wrk.format()
end
openresty的systemtap工具和FlameGraph工具
生成火焰图的工具,分析lua程序的性能瓶颈.生成脚本如下,-p为master nginx的进程号:
openresty-systemtap-toolkit-master/ngx-sample-lua-bt -p 16518 --luajit20 -t 5 > wrk_600_c.bt openresty-systemtap-toolkit-master/fix-lua-bt wrk_600_c.bt > wrk_600_c_flame.bt FlameGraph-master/stackcollapse-stap.pl wrk_600_c_flame.bt > wrk_600_c_flame.cbt FlameGraph-master/flamegraph.pl wrk_600_c_flame.cbt > wrk_600_c_flame.svg
测试结果
先说结论,后面有详细内容:
单机情况下,并发500情况下偶尔接口会有失败,/auth接口QPS在4000到5000,/activate接口QPS在3000到4000,平均响应时间在200ms以内
PS:wrk比ab感觉还要高效一点
ab: 所有请求post参数均相同,对于/activate接口测试参考不太大
- 接口/auth,到600并发时开始失败,QPS在4500到5000,平均响应时间在200ms以内
echo "===n-20000,c-600====" Server Software: openresty/1.11.2.5 Server Hostname: xxx.xxx.xxx.xxx Server Port: 8080 Document Path: /auth Document Length: 75 bytes Concurrency Level: 600 Time taken for tests: 27.057 seconds Complete requests: 100000 Failed requests: 7361 (Connect: 0, Receive: 0, Length: 7361, Exceptions: 0) Write errors: 0 Keep-Alive requests: 99378 Total transferred: 27682080 bytes Total POSTed: 21302982 HTML transferred: 7512428 bytes Requests per second