>

Linux 下测试一个服务程序的并发性能,最简便的是采用系统自带的 Apache Bench,简称 ab

ab 是通过模拟发送 http 请求的方式对服务程序进行测试,通过模拟多个进程在单位时间内发送多个请求,
测试服务程序的响应速度和并发吞吐量。

最常见的 ab 做压力测试的例子:

ab -n 1000 -c 100 http://www.example.com/

这里模拟的是同时启动 100 个进程(concurrency),总共发起 1000个请求去访问对应的服务程序。

A more complex example:
ab -n 1000 -c 10 -k -H “Accept-Encoding: gzip, deflate” http://www.example.com/

参数解释:

-n 1000 is the total number of requests to make.

-c 100 tells AB to do 10 requests at a time, instead of 1 request at a time, to better simulate concurrent visitors (vs. sequential visitors).

-k sends the KeepAlive header, which asks the web server to not shut down the connection after each request is done, but to instead keep reusing it.

We can also send the extra header Accept-Encoding: gzip, deflate because mod_deflate is almost always used to compress the text/html output 25%-75%,
the effects of which should not be dismissed due to it’s impact on the overall performance of the web server (i.e., can transfer 2x the data in the same amount of time, etc).

QPS = total number of requests / total elapsed time

AB 的缺陷
由于 ab 只能发送 http 请求,因此要求被测试的服务程序提供 http 服务,否则无法使用 ab 进行 load test。
对于一些系统内部的服务比如 dao 服务,不对外提供 http 服务,而是对内提供 rpc 服务的话,没法使用 ab 来进行压力测试。
这时候需要我们自己手动发起多个来客户端进程来进行测试。

可以使用 mapred 来模拟启动多个进程,这些进程从 stdio 来读入数据(比如请求),最后计算完成这些请求所花费的时间,从而计算出 qps。

例子:
准备好一个数据文件, 里面有很多条请求(每行是一个请求), 写好一个客户端程序(比如叫 client_program),
把这个数据文件作为输入,不断读取这个数据文件中的每一行并发送请求到数据库进行(增删改查)。

$ cat request.dat | head -1000 | ./mapred --mapper=client_program --count=100 > output

或者

$ cat request.dat | head -1000 | ./mapred -m client_program -c 100 > output

在 client_program 中,每完成一个请求,应该打印一个完成这次请求所花费的时间。

在最终的输出文件中,会记录每个请求所花费的时间,每行一个。
花费时间最长的 减去 花费时间最短的就得到总时间。

qps = 总请求数 / 总时间

参考:
http://stackoverflow.com/questions/12732182/ab-load-testing


如果你对我的文章感兴趣,欢迎留言或者关注我的专栏。

微信公众号:“知辉”

搜索“deliverit”或

扫描二维码