一、tcprstat简介
tcprstat是percona开发的用来调查mysql响应时间的工具,也可以用来调查典型的request-response类型的服务。前段时间拿该工具统计过御剑的gameserver耗时,在此记录下来。
详细介绍:
http://www.percona.com/docs/wiki/tcprstat:start
下载:
二进制:
http://github.com/downloads/Lowercases/tcprstat/tcprstat-static.v0.3.1.x86_64
源码下载
http://bazaar.launchpad.net/~ignacio-nin/tcprstat/trunk/tarball/73?start_revid=73
二、使用
可以直接运行程序得出结果(suse10sp2内核版本不够,tlinux可以),也可以通过读取tcpdump的cap文件来分析结果
1.直接使用(官方示例):
# tcprstat -p 3306 -t 1-n 5
timestamp count max min avg med stddev 95_max 95_avg 95_std 99_max 99_avg 99_std
1283261499 1870 559009 39 883 153 13306 1267 201 150 6792 323 685
1283261500 1865 25704 29 578 142 2755 889 175 107 23630 333 1331
1283261501 1887 26908 33 583 148 2761 714 176 94 23391 339 1340
1283261502 2015 304965 35 624 151 7204 564 171 79 8615 237 507
1283261503 1650 289087 35 462 146 7133 834 184 120 3565 244 358
2.读取tcpdump文件
tcprstat -l IP -p port -r tcpdump.pcap
三、原理
tcprstat和tcpdump一样,也是通过libpcap库抓包,如果没有tcprstat,也可以通过程序来分析tcpdump的抓包文件,只是比较麻烦,大概原理如下。
1.通过tcpdump抓包
/usr/sbin/tcpdumphost IP and tcp port PORT -i eth1 -s 0 -w tcpdump.pcap
2.通过ip:port端口对确定一个tcp流(socket本质是ip地址端口四元组),通过wireshark的Follow Tcp Stream功能可以实现同样的工作
3.取出有数据的tcp包(data>0),根据socket流进行区分,并计算每个socket出包和入包的时间差
4.将大量的耗时进行统计,如取平均值,最大值,最小值 …
从tcprstat源码也可以看出大概逻辑
源码大概流程(tcprstat分析离线包的部分)
1.tcprstat.c
main函数(如果参数是r,则读取tcpdump包进行分析)
调用offline_capture分析离线包
2.capture.c
offline_capture函数调用pcap_loop不断抓包分析,process_packet是一个回调函数,用来处理包
3.process-packet.c
process_ip函数根据ip包的来源ip和目的ip来区别入包和出包
只取data>0的包,入包和出包分别处理,注意出包的处理是将源ip和目的ip做了调换,为的使该包与出包相对应。
4.stat.c
inbound函数将入包按socket(本地ip,本地port,目的ip,目的port)为key放入hash表中
outbound函数以出包的socket(注意出包的源地址,目的地址已经调换)为key,在hash表中查找是否有对应的包(查找到的包为入包),计算出包和入包的时间差(服务器响应时间),并记录下来。
5.对得到的记录按照一定方法进行统计,打印出结果
Stat.c中的一些列函数(stats_avg,stats_sum,stats_max...)
四、网上文档
http://rdc.taobao.com/blog/cs/?p=728