用ab和wrk做压力测试

之前一直在做cocos2d-x手游客户端开发,最近被组织上安排去做服务器开发了。虽然一开始接触OpenResty,遇到不少问题,但由于本渣重用了大量以前的代码,倒也很快就完成了一个可以正常运作的版本。只是本渣毕竟是新手,所做的功能也没有前人踩坑的经验,对自己代码的性能不放心,所以这段时间也在折腾压力测试,这次就来分享一些做压测的tips。

首先,Apacheab可以很方便地产生大量(并发)的同一请求,ab上手也很容易,是做简单压测的首选工具之一。

使用ab需要注意几个选项:

1
2
       -p POST-file
              File containing data to POST. Remember to also set -T.
1
2
3
4
5
6
7
       -T content-type
              Content-type  header  to  use  for  POST/PUT  data,  eg.  application/x-www-form-urlencoded.  Default is
              text/plain.

       -H custom-header
              Append extra headers to the request. The argument is typically in the form of a valid header line,  con
              taining a colon-separated field-value pair (i.e., "Accept-Encoding: zip/zop;8bit").

像本渣压测时就用到了如下参数:

1
-H 'Accept-Encoding: gzip' -T 'application/x-www-form-urlencoded'

之前manual提到POST必须指定-T参数,但如果少了前面的-H参数,测出来的数据会和实际情况有偏差。指定ab的这些参数最好是和实际的客户端的HTTP header保持一致,个人建议采用tcpdumpWireshark等工具来抓取实际的客户端访问服务器的HTTP请求。

1
2
3
       -s timeout
              Maximum number of seconds to wait before the socket times out. Default is 30 seconds. Available in 2.4.4
              and later.
1
2
       -k     Enable  the  HTTP KeepAlive feature, i.e., perform multiple requests within one HTTP session. Default is
              no KeepAlive.

关于HTTP Keep-Alive,下面有两张直观的图说得很明白:

不采用HTTP Keep-Alive,请求某一网页的html和css会通过不同的TCP连接去完成:

image

同样的场景,采用HTTP Keep-Alive,就可以在同一TCP连接中请求尽可能多的资源,从而避免建立TCP连接的overhead:

image

以上两张图是从Ilya Grigorik的High Performance Browser Networking引用过来的,如果你对HTTP Keep-Alive不熟悉的话,可以参考下这本书。

PS. 这里为了不把HTTP Keep-Alive和TCP keepalive混淆起来,本渣就不随Grigorik写做keepalive了。

1
2
       -l     Do not report errors if the length of the responses is not constant. This  can  be  useful  for  dynamic
              pages. Available in 2.4.7 and later.

前面提到ab所产生的请求都是一样的,如果我们想用不同的testcase来做压测呢?这时候ab就无能为力了,好在还有其他强大的压测工具,例如wrkwrk支持lua编程,可以通过overriderequestresponse的全局函数来指定请求和响应的处理逻辑,这给本渣做压测带来不少便利,因为本渣之前不就是做客户端开发嘛,现在可以直接重用客户端的代码了XD

关于abwrk的具体用法和细节请参考下面的链接,本渣这里就不赘述了,毕竟把别人提过的东西又重复一遍就没什么意思了其实就是懒癌XD

参考资料