apache ab 输出结果详细解析(源码分析) http://my.oschina.net/lubia/blog/177186

 apache ab 输出结果详细解析(源码分析)

发表于2年前(2013-11-18 13:21)   阅读( 815) | 评论( 1)  4人收藏此文章, 我要收藏
0

9月19日成都 OSC 源创会正在报名,送机械键盘和开源无码内裤  

ab  apache  测试  源码

同步更新在独立博客。

apache ab 输出结果详细解析(源码分析) http://my.oschina.net/lubia/blog/177186_第1张图片

用过ab做压力测试的朋友对这张图应该不陌生,但大多数人并不明白这代表什么意思,更别说怎么计算出来的了。虽然ab有很多问题(甚至无法避免),但仍然值得研究。

通常只关注两项

Requests per second:    3680.02 [#/sec] (mean) 

//每秒事务数:总事务数 / 执行时间

Time per request:       0.230 [ms] (mean, across all concurrent requests)

//事务平均执行时间:执行时间 / 总事务数

但这两项只能给出大概的结果,详细的分析还要依赖上图,下面逐项分析

有Connect,Processing,Waiting,Total四项,详细的分析在后面源码分析中给出。

 每一项分别有min(最小值),mean(平均值),[+/-sd](方差),median(中位数),max(最大值)

要计算出以上各项,主要依赖于两个结构体

?
1
2
3
4
5
6
7
8
9
struct connection {
     ....
     apr_time_t start,           /* Start of connection */
                connect,         /* Connected, start writing */
                endwrite,        /* Request written */
                beginread,       /* First byte of input */
                done;            /* Connection closed */
     ....
};

?
1
2
3
4
5
6
struct data {
     apr_time_t starttime;         /* start time of connection */
     apr_interval_time_t waittime; /* between request and reading response */
     apr_interval_time_t ctime ;    /* time to connect */
     apr_interval_time_t time ;     /* time for connection */
};
看注释应该就能明白了,由connection这个结构体,计算出data结构体,data的值就是最终输出的值

Connect = data.ctime

Processing = data.time - data.ctime

Waiting = data.waittime

Total = data.time

data中的各个字段计算方式如下

data.starttime = connection.start

data.waittime = connection.beginread  - beginread .endwrite

data.ctime = connection.connect - connection.start

data.time = connection.done - connection.start

到这里就可以明显的看出来Total = Connect  + Processing ,而Waiting 是怎么计算出来的呢?看这句源码

s->waittime  = ap_max(0, c->beginread - c->endwrite);

就是说Waiting是connection这个结构体中beginread减去endwrite,这代表什么?从写入完成到读取第一个字符,这就是 往返链路时间 + 服务端运行时间 + 缓冲区等待时间,前面的好理解,那这个缓冲区等待时间是啥呢?原来内核中有读/写缓冲区,我们调用socket进行write,这个函数执行完数据并不一定已经发送到服务端,而是从用户空间拷贝到了"写缓冲区",当发送完毕后再从缓冲区删除。相应的,服务端返回的数据也会首先储存在"读缓冲区",当应用程序拷贝到用户空间后,才从缓冲区删除。而Waiting和Processing 的时间只相差一个ab读取数据的时间,因此在局域网环境下数据量不大时两者相差可能很小。

因此,ab的输出结果可以这样解释

Connect :socket链路建立消耗,代表网络状况好坏

Processing :写入缓冲区消耗+链路消耗+服务端消耗

Waiting :写入缓冲区消耗+链路消耗+服务端消耗+读取数据消耗

Total :单个事务总时间

至此,ab输出结果的来龙去脉解释清楚。


但是ab这样的测试工具有一个最大的问题,就是测试工具本身对测试结果构成影响,特别是设置的并发数较高时,可能测的是ab的性能而不是服务端的性能。正是观察者效应,观察者本身对观察结果构成影响。

你可能感兴趣的:(apache)