使用tcprstat调查服务响应时间和源码简析

一、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

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值