前段时间写了一个升级查询的后台服务器,涉及到服务器的性能测试,这里仅作记录:

单个测试

首先,我先来验证服务器的准确性,通过curl请求来确保数据是OK的:

提示:所有的数据传输都是https,若请求的是http也会重定向到https

单个测试http转发:

1
2
3
4
5
curl -H "Content-Type: application/json" http://update.xxx.com/checkversion -L --post301 -d '
{
// POST内容保密
}'
# CURL 添加 `-L --post301` 可以进行POST重定向http至https

单个测试https:

1
2
3
4
curl -H "Content-Type: application/json" https://update.xxx.com/checkversion -d '
{
// POST内容保密
}'

并发测试

ab

1
$ ab -c 1000 -n 10000 -T "application/json" -p /tmp/xxx.json https://update.xxx.com/checkversion

ab是apachebench命令的缩写。

ab是apache自带的压力测试工具。ab非常实用,它不仅可以对apache服务器进行网站访问压力测试,也可以对或其它类型的服务器进行压力测试。

参考链接:https://www.cnblogs.com/myvic/p/7703973.html

jmeter:

1
2
brew install jmeter --with-plugins
jmeter -t /Users/scue/docs/xxx/发布系统/test-weiqiang.jmx

Jmeter有一个界面进行测试的配置,但个人在实际使用过程中发现它对测试机的性能要求较高~

参考链接:http://www.cnblogs.com/TankXiao/p/4045439.html

wrk ✔️

  • 环境安装
1
2
3
4
5
6
7
sudo yum groupinstall 'Development Tools'
sudo yum install openssl-devel
sudo yum install git
git clone https://github.com/wg/wrk.git wrk
cd wrk
make -j8
cp wrk /usr/local/bin/
  • 执行测试
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
$ wrk -c 3000 -d 10 -t 1000 -s scripts/post_json.lua https://update.xxx.com/checkversion

$ cat scripts/post_json.lua
wrk.method = "POST"
wrk.body   = [[{
-- POST内容保密
}]]
wrk.headers["Content-Type"] = "application/json"
-- function response(status, headers, body)  
--    print(body)
-- end  
  • 并发结果
1
2
3
4
5
6
7
8
Running 10s test @ https://update.xxx.com/checkversion
  1000 threads and 3000 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   297.84ms   82.24ms   1.08s    81.53%
    Req/Sec    11.12      5.91    60.00     61.59%
  129844 requests in 10.14s, 80.98MB read
Requests/sec:  12803.26
Transfer/sec:      7.99MB

表示每秒请求数量达到12803.26个。

参考链接:https://type.so/linux/lua-script-in-wrk.html

一些建议

以上几个测试方法,我比较推荐使用wrk,配置比较灵活,各方面还都很OK,同时有几点建议:

  • 测试机要与服务器网络足够稳定且宽带足够(尽量同一个LAN)
  • 测试程序不要放到服务器上同时跑
  • 可以使用多个机器对同一台服务器进行测试(考虑测试机宽带、性能消耗)
  • 增加测试机不能提高测试的结果时,这个结果应该是我们想要测试结果了

提示:使用iTerm2的Broadcast input to all panes in current tab (Opt+Cmd+I)同时多个Pane进行输入文字很好用,可以同时开始测试。