您的位置:首页 > 理论基础 > 计算机网络

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

2015-09-07 20:42 555 查看


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

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

赞0

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


ab apache 测试 源码

同步更新在独立博客





用过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(最大值)

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

?
?
看注释应该就能明白了,由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的性能而不是服务端的性能。正是观察者效应,观察者本身对观察结果构成影响。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: