本文描述 tcprstat 工具的安装和使用。
========== 我是分割线 ==========
【安装】
tcprstat 的源码管理方式使用的是 bzr 。bzr 的简介和相应客户端的安装可以参考《 安装和使用 TPCC-MySQL 工具遇到的问题 》。
下载源码。
1
2
|
[root@Betty WGET_DIR] # bzr branch lp:tcprstat
Branched 73 revisions. |
压缩备份。
1
|
[root@Betty WGET_DIR] # tar czvf tcprstat.tar.gz ./tcprstat
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
[root@Betty WGET_DIR] # cd tcprstat/
[root@Betty tcprstat] # ll
total 72 -rw-r--r-- 1 root root 38 Aug 23 17:18 AUTHORS -rw-r--r-- 1 root root 35147 Aug 23 17:18 COPYING -rw-r--r-- 1 root root 0 Aug 23 17:18 ChangeLog -rw-r--r-- 1 root root 922 Aug 23 17:18 Makefile.am -rw-r--r-- 1 root root 914 Aug 23 17:18 NEWS -rw-r--r-- 1 root root 2730 Aug 23 17:18 README -rw-r--r-- 1 root root 81 Aug 23 17:18 TODO -rw-r--r-- 1 root root 926 Aug 23 17:18 bootstrap -rw-r--r-- 1 root root 2643 Aug 23 17:18 configure.ac drwxr-xr-x 2 root root 4096 Aug 23 17:18 libpcap drwxr-xr-x 2 root root 4096 Aug 23 17:18 src [root@Betty tcprstat] #
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
[root@Betty tcprstat] # vi README
~ tcprstat ~
tcprstat is a pcap-based tool that extracts information about TCP response times .
tcprstat 是一个基于 pcap 提取 TCP 应答时间信息的工具。 It works by sniffing for TCP "requests" (inbound packets) and measures the time
that it takes for sending a "response" (next outbound packet). While this
approach might seem too simple, it works for simple protocols that are based in
such request /response system, like HTTP and the MySQL protocol. In the future,
we may write more complex protocol decoding.
# 工作原理:嗅探 TCP 的 request 并测量发送 response 所需的事件间隔。适用于一问一答式协议类型 的处理,如 HTTP 和 MySQL 协议。 tcprstat sniffs for a while , and then shows some stats about the sniffed
packets, similar to the way top (1) works.
tcpstat 会嗅探一段时间,然后展现一些统计信息,工作方式类似于 top 。
tcprstat uses libpcap to capture TCP. Due to many distros not shipping libpcap >= 1.0.0, tcprstat ships libpcap 1.1.1 and uses it if it can't find a
suitable version tcpstat 使用 libpcap 来捕获 TCP 包。鉴于许多发行版并不提供 libpcap >= 1.0.0 ,tcpstat 源码包中自带了相关源文件。 The build process delivers a static version, tcprstat-static, with no external linking (some castration is needed at libpcap) so it can be copied directly to a server with no need for compilation tools.
构建过程会生成一个 static 版本 -- tcpstat-static ,其不需要依赖任何外部链接,所以可以直接 拷贝其他机器上使用。 tcprstat is released under the GPL, version 2 or 3. ################################################################################ # # # tcprstat -- Extract stats about TCP response times # # Copyright (C) 2010 Ignacio Nin # # # # This program is free software; you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation; either version 2 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License # # along with this program; if not, write to the Free Software # # Foundation, Inc., # # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # # # ################################################################################ |
1
2
3
4
|
[root@Betty tcprstat] # chmod +x bootstrap
[root@Betty tcprstat] # ./bootstrap
. /bootstrap : line 23: aclocal: command not found
[root@Betty tcprstat] #
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
[root@Betty tcprstat] #
[root@Betty tcprstat] # vi bootstrap
#!/bin/sh # # tcprstat -- Extract stats about TCP response times # Copyright (C) 2010 Ignacio Nin # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # aclocal && autoheader && #libtoolize --automake && automake --add-missing && autoconf <span>< /span ><span>< /span >
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
[root@Betty tcprstat] # yum list|grep automake
automake.noarch 1.9.6-2.3.el5 base automake14.noarch 1.4p6-13.el5.1 base automake15.noarch 1.5-16.el5.2 base automake16.noarch 1.6.3-8.el5.1 base automake17.noarch 1.7.9-7.el5.2 base [root@Betty tcprstat] #
[root@Betty tcprstat] #
[root@Betty tcprstat] # yum list|grep autoconf
autoconf.noarch 2.59-12 base autoconf-archive.noarch 2012.09.08-1.el5 epel autoconf213.noarch 2.13-12.1 base ocaml-autoconf.noarch 1.0-4.el5 epe<span>< /span >l
[root@Betty tcprstat] #
[root@Betty tcprstat] # yum -y install automake
|
1
2
3
4
5
6
|
[root@Betty tcprstat] # ./bootstrap
configure.ac:24: error: Autoconf version 2.61 or higher is required configure.ac:24: the top level
autom4te: /usr/bin/m4 failed with exit status: 63
aclocal: autom4te failed with exit status: 63
[root@Betty tcprstat] #
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
[root@Betty tcprstat] # ./bootstrap
configure.ac:80: warning: AC_CONFIG_SUBDIRS: you should use literals autoconf /status .m4:1106: AC_CONFIG_SUBDIRS is expanded from...
configure.ac:80: the top level
configure.ac:80: warning: AC_CONFIG_SUBDIRS: you should use literals autoconf /status .m4:1106: AC_CONFIG_SUBDIRS is expanded from...
configure.ac:80: the top level
configure.ac:80: warning: AC_CONFIG_SUBDIRS: you should use literals autoconf /status .m4:1106: AC_CONFIG_SUBDIRS is expanded from...
configure.ac:80: the top level
configure.ac:30: installing './compile'
configure.ac:26: installing './install-sh'
configure.ac:26: installing './missing'
Makefile.am: installing './INSTALL'
src /Makefile .am: installing './depcomp'
configure.ac:80: warning: AC_CONFIG_SUBDIRS: you should use literals autoconf /status .m4:1106: AC_CONFIG_SUBDIRS is expanded from...
configure.ac:80: the top level
[root@Betty tcprstat] #
|
1
2
|
[root@Betty tcprstat] # ./configure
[root@Betty tcprstat] # make
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
[root@Betty tcprstat] # ll
total 484 -rw-r--r-- 1 root root 38 Aug 23 16:02 AUTHORS -rw-r--r-- 1 root root 35147 Aug 23 16:02 COPYING -rw-r--r-- 1 root root 0 Aug 23 16:02 ChangeLog lrwxrwxrwx 1 root root 38 Aug 23 16:57 INSTALL -> /usr/local/share/automake-1 .14 /INSTALL
-rw-r--r-- 1 root root 25282 Aug 23 16:58 Makefile -rw-r--r-- 1 root root 922 Aug 23 16:02 Makefile.am -rw-r--r-- 1 root root 25101 Aug 23 16:57 Makefile. in
-rw-r--r-- 1 root root 914 Aug 23 16:02 NEWS -rw-r--r-- 1 root root 2730 Aug 23 16:02 README -rw-r--r-- 1 root root 81 Aug 23 16:02 TODO -rw-r--r-- 1 root root 41921 Aug 23 16:57 aclocal.m4 drwxr-xr-x 2 root root 4096 Aug 23 16:57 autom4te.cache -rwxr-xr-x 1 root root 926 Aug 23 16:02 bootstrap lrwxrwxrwx 1 root root 38 Aug 23 16:57 compile -> /usr/local/share/automake-1 .14 /compile
-rw-r--r-- 1 root root 3192 Aug 23 16:58 config.h -rw-r--r-- 1 root root 2940 Aug 23 16:57 config.h. in
-rw-r--r-- 1 root root 62239 Aug 23 16:58 config.log -rwxr-xr-x 1 root root 33714 Aug 23 16:58 config.status -rwxr-xr-x 1 root root 191969 Aug 23 16:57 configure -rw-r--r-- 1 root root 2643 Aug 23 16:02 configure.ac lrwxrwxrwx 1 root root 38 Aug 23 16:57 depcomp -> /usr/local/share/automake-1 .14 /depcomp
lrwxrwxrwx 1 root root 41 Aug 23 16:57 install -sh -> /usr/local/share/automake-1 .14 /install-sh
drwxr-xr-x 3 root root 4096 Aug 23 16:58 libpcap lrwxrwxrwx 1 root root 38 Aug 23 16:57 missing -> /usr/local/share/automake-1 .14 /missing
drwxr-xr-x 3 root root 4096 Aug 23 16:59 src -rw-r--r-- 1 root root 23 Aug 23 16:58 stamp-h1 [root@Betty tcprstat] #
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
[root@Betty tcprstat] # cd src/
[root@Betty src] # ll
total 1780 -rw-r--r-- 1 root root 46379 Aug 23 16:58 Makefile -rw-r--r-- 1 root root 1800 Aug 23 16:02 Makefile.am -rw-r--r-- 1 root root 52447 Aug 23 16:57 Makefile. in
-rw-r--r-- 1 root root 3006 Aug 23 16:02 capture.c -rw-r--r-- 1 root root 1057 Aug 23 16:02 capture.h -rw-r--r-- 1 root root 4015 Aug 23 16:02 functions.c -rw-r--r-- 1 root root 1019 Aug 23 16:02 functions.h -rw-r--r-- 1 root root 4325 Aug 23 16:02 local -addresses.c
-rw-r--r-- 1 root root 1065 Aug 23 16:02 local -addresses.h
-rw-r--r-- 1 root root 10157 Aug 23 16:02 output.c -rw-r--r-- 1 root root 1315 Aug 23 16:02 output.h -rw-r--r-- 1 root root 3970 Aug 23 16:02 process-packet.c -rw-r--r-- 1 root root 1139 Aug 23 16:02 process-packet.h -rw-r--r-- 1 root root 7845 Aug 23 16:02 stats- hash .c
-rw-r--r-- 1 root root 1480 Aug 23 16:02 stats- hash .h
-rw-r--r-- 1 root root 10411 Aug 23 16:02 stats.c -rw-r--r-- 1 root root 1958 Aug 23 16:02 stats.h -rwxr-xr-x 1 root root 280074 Aug 23 16:59 tcprstat -rw-r--r-- 1 root root 10976 Aug 23 16:59 tcprstat-capture.o -rw-r--r-- 1 root root 10720 Aug 23 16:59 tcprstat-functions.o -rw-r--r-- 1 root root 13816 Aug 23 16:59 tcprstat- local -addresses.o
-rw-r--r-- 1 root root 23528 Aug 23 16:59 tcprstat-output.o -rw-r--r-- 1 root root 13776 Aug 23 16:59 tcprstat-process-packet.o -rwxr-xr-x 1 root root 1019964 Aug 23 16:59 tcprstat-static -rw-r--r-- 1 root root 16544 Aug 23 16:59 tcprstat-stats- hash .o
-rw-r--r-- 1 root root 27720 Aug 23 16:59 tcprstat-stats.o -rw-r--r-- 1 root root 19080 Aug 23 16:59 tcprstat-tcprstat.o -rw-r--r-- 1 root root 5970 Aug 23 16:02 tcprstat.c -rw-r--r-- 1 root root 1339 Aug 23 16:02 tcprstat.h -rw-r--r-- 1 root root 10976 Aug 23 16:59 tcprstat_static-capture.o -rw-r--r-- 1 root root 10720 Aug 23 16:59 tcprstat_static-functions.o -rw-r--r-- 1 root root 13816 Aug 23 16:59 tcprstat_static- local -addresses.o
-rw-r--r-- 1 root root 23528 Aug 23 16:59 tcprstat_static-output.o -rw-r--r-- 1 root root 13776 Aug 23 16:59 tcprstat_static-process-packet.o -rw-r--r-- 1 root root 16544 Aug 23 16:59 tcprstat_static-stats- hash .o
-rw-r--r-- 1 root root 27720 Aug 23 16:59 tcprstat_static-stats.o -rw-r--r-- 1 root root 19080 Aug 23 16:59 tcprstat_static-tcprstat.o [root@Betty src] #
|
【 用户手册 】
tcprstat 是一个免费、开源的 TCP 分析工具,可以用来观测网络通信状态以及计算 request 和 response 之间的延迟。通过它可以获得应答时间统计信息并将其显示输出。输出格式类似于 Unix 中各种 -stat 工具的模式,如 vmstat、iostat、mpstat 。该工具可以选择观测指定 port 上的通信负载,这种方式使其在针对单实例 daemon 进程 request-response 时间测量上具有实际意义,例如针对 mysqld、httpd、memcached 等。
tcprstat 的优点:
- 轻量级。无需写和分析大块日志文件。
- request 和 response 之间时间间隔的精度为微秒。
- 输出结果易于导入到 spreadsheet 中,易于通过命令行脚本进行处理,易于通过 gnuplot 进行绘图。
- 协议无关性。可被用于各种具有 request-response 模式的 client-server 协议模型。
tcprstat 是与 tcpstat 相近的工具,但是其专注于 response 时间的测量,而不是网络通信负载的量和包大小。所以它是更加符合目标驱动性能优化(Goal-Driven Performance Optimization)的技术。
下面是一个 tcprstat 输出样例,内容显示的是 MySQL 服务器的 3306 端口上的网络通信情况。
# 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
内容以每次一行、一行一秒的形式输出,输出持续了 5 秒时间。每一行都包含了时间戳,且包含了与 query 对应的 response 的时间。列输出中包含了标准的 response 时间值,以微秒为单位。同时还给出了各种 95% 和 99% 应答时间的值。
response 时间值的计算是通过测量最后收到包和随后第一个发出包之间的花费时间来计算的。仅包含 TCP 控制信息的特定类型的包会被忽略。
运行 tcpstat 需要 root 权限。
最简单的用法是所有参数都采用默认值来执行该工具。默认情况下,其会测量一次 10 秒时间长度的 TCP 通信量,并输出显示内容头和一行统计信息值。
# timestamp count max min avg med stddev 95_max 95_avg 95_std 99_max 99_avg 99_std 1283265068 23892 425546 30 505 161 6240 835 186 102 4179 261 429
实际使用中,你通常会选择一个指定的 port 来进行测量,并设置其迭代执行次数,以及改变默认的 10 秒长度的测量时间间隔。为了完成这些设置,需要使用下列参数:
-
-p <port> 选择一个端口。
-
-i <secs> 设置测量的时间间隔,以秒为单位。
-
-n <iter> 迭代执行的次数;0 意味着无限循环。
例如,为了以一秒为时间间隔持续观察 Sphinx 通信状况,需要执行:
1
|
# tcprstat -p 3312 -i 1 -n 0 |
tcprstat 的输出内容可以被改变:包含或者省略其所测量得到的网络通信各的种类型统计信息。默认输出的列包含了一些在大多场景下有用的项。输出可以通过格式代码 %C 来进行控制,其中 C 是单个字符。下表中给出了各种格式代码和其对应的输出含义。
Format Code | Header | Default? | Meaning |
---|---|---|---|
%n | count | y | 在迭代期间完成的 request 个数 |
%a | avg | y | 平均 response 时间 |
%s | sum | y | response 时间的总和 |
%x | sqs | response 时间的平方和 | |
%m | min | y | 最小 response time |
%M | max | y | 最大 response time |
%h | med | y | 中间 response time |
%S | stddev | y | response 时间值标准差 |
%v | var | response 时间的总体方差 | |
%I | iter# | 迭代次数 | |
%t | elapsed | 从第一次迭代开始流逝的秒数 | |
%T | timestamp | y | Unix 时间戳 |
%% | % 字符 | ||
\t | tab 字符 | ||
\n | 换行字符 | ||
95,99 | Adds a prefix | y | 百分比指示符 |
你能够通过自定义控制选项 -f 来改变 tcpstat 的输出格式。例如,为了输出每秒向 MySQL 服务器 3306 端口发送的 request 数,执行下面的命令:
# tcprstat -f '%n\n' -p 3306 -t 1 -n 0 count 2212 2070 ...
你同样可以使用百分比指示符,以显示占 response 时间总体值 N% 的统计值。该工具当前默认仅支持 95% 和 99% 两种输出。如果想要输出任意百分比值的统计信息,则需要在 % 字符和格式代码之间插入指定的百分比值。默认的列输出中将会包含相应的百分比头部信息。下面的列子中以微秒为单位,输出了最大、95%、99% response 时间的值:
# tcprstat -f '%M\t%95M\t%99M\n' -p 3306 -t 1 -n 0 max 95_max 99_max 31221 411 3001 52721 495 2828 12173 507 1513 ...
tcpstat 不仅能够对实时网络通信进行分析,还能够对通过 tcpdump 创建的网络通信抓包文件进行分析。这也就使得在微秒可以在某台机器上进行网络通信转包,而在另外的机器上在任意的时间点对其进行分析。为了将网络包存放下来以备日后分析,需要在执行 tcpdump 时指定 -w 参数来确定保存文件名。之后,tcprstat 可以使用 -r 选项从上述文件中读取并分析网络通信内容。
tcprstat 通常情况下,能够根据本地网卡接口上绑定的一系列ip地址,确定收到的 request 和发出的 response 之间的配对关系。但是,从文件中获取信息进行分析的时候可能会无法正确处理,因为该文件是从一个不同的 host 上获取到的。在这种情况下,你可以使用 -l 选项自定义指定一组 ip 地址用于分析文件内容。
命令行选项
下面是一份完整的 tcpstat 命令行选项清单。你也总是可以通过 --help 选项获取到完整的命令行选项及其相应的使用信息。
Option Name | Short Name | Type | Default Value | Meaning |
---|---|---|---|---|
--format | -f | string |
”%T\t%n\t%M\t%m\t%a\t%h\t%S \t%95M\t%95a\t%95S\t%99M\t%99a\t%99S\n” |
格式控制字串 |
--[no]header | string | Enabled | 如果没有指定任何参数,tcpstat 会根据 --format 选项自动产生显示输出头部信息。如果指定了参数,tcpstat 将使用该参数对应的头作为输出头。如果指定了 --no-header 选项,tcpstat 将不显示输出头信息。 | |
--help | 显示程序信息和用法。 | |||
--interval | -t | integer | 10 | tcpstat 在连续两行输出之间等待的时间间隔,以秒为单位。 |
--iterations | -n | integer | 1 | tcpstat 在程序退出前,需要执行迭代的次数;0 表示无限。 |
--local | -l | string | 指定以逗号分隔的用作本地ip地址的列表,用以取代默认的从操作系统获取的ip地址列表。 | |
--port | -p | integer | 指定用于捕获网络通信的 TCP 端口,如果未指定则捕获所有端口。 | |
--read | -r | string | 从 pcap 文件中读取信息。而不是从网络上实时获取 | |
--version | 显示版本信息 |