用ab和wrk做压力测试
之前一直在做cocos2d-x手游客户端开发,最近被组织上安排去做服务器开发了。虽然一开始接触OpenResty,遇到不少问题,但由于本渣重用了大量以前的代码,倒也很快就完成了一个可以正常运作的版本。只是本渣毕竟是新手,所做的功能也没有前人踩坑的经验,对自己代码的性能不放心,所以这段时间也在折腾压力测试,这次就来分享一些做压测的tips。
首先,Apache的ab可以很方便地产生大量(并发)的同一请求,ab上手也很容易,是做简单压测的首选工具之一。
使用ab需要注意几个选项:
-p指定POST参数,与curl不同,ab的POST参数选项必须指定一个文件。
1 2 | |
-T和-H指定HTTP Header(前者是Content-type):
1 2 3 4 5 6 7 | |
像本渣压测时就用到了如下参数:
1 | |
之前manual提到POST必须指定-T参数,但如果少了前面的-H参数,测出来的数据会和实际情况有偏差。指定ab的这些参数最好是和实际的客户端的HTTP header保持一致,个人建议采用tcpdump或Wireshark等工具来抓取实际的客户端访问服务器的HTTP请求。
-s指定timeout时间,这个参数也最好与实际客户端的设置保持一致。
1 2 3 | |
- 需要特别注意的是,
ab默认不启用HTTP Keep-Alive,需要使用-k开启这一特性:
1 2 | |
关于HTTP Keep-Alive,下面有两张直观的图说得很明白:
不采用HTTP Keep-Alive,请求某一网页的html和css会通过不同的TCP连接去完成:
同样的场景,采用HTTP Keep-Alive,就可以在同一TCP连接中请求尽可能多的资源,从而避免建立TCP连接的overhead:
以上两张图是从Ilya Grigorik的High Performance Browser Networking引用过来的,如果你对HTTP Keep-Alive不熟悉的话,可以参考下这本书。
PS. 这里为了不把HTTP Keep-Alive和TCP keepalive混淆起来,本渣就不随Grigorik写做keepalive了。
- 还有另一个需要特别注意的地方,由于
ab发起的请求都是一模一样的,所以ab认为服务器的返回也应该完全相同才对。如果服务器对相同请求的处理结果不同——像本渣做的功能恰好就是这种情况——需要再指定-l选项:
1 2 | |
前面提到ab所产生的请求都是一样的,如果我们想用不同的testcase来做压测呢?这时候ab就无能为力了,好在还有其他强大的压测工具,例如wrk。wrk支持lua编程,可以通过overriderequest、response的全局函数来指定请求和响应的处理逻辑,这给本渣做压测带来不少便利,因为本渣之前不就是做客户端开发嘛,现在可以直接重用客户端的代码了XD
关于ab和wrk的具体用法和细节请参考下面的链接,本渣这里就不赘述了,毕竟把别人提过的东西又重复一遍就没什么意思了其实就是懒癌XD
参考资料
-
阿里云这篇文章使用ab和wrk对OSS进行benchmark测试挺好的,推荐一看
-
耗子叔的这篇博文也值得一看:性能测试应该怎么做?。在做压测之前应当考虑清楚,设计适当的testcase。
-
ab的使用可以参考: -
wrk的使用可以参考: