本文描述 tcprstat 工具的安装和使用。
========== 我是分割线 ==========
【安装】
tcprstat 的源码管理方式使用的是 bzr 。bzr 的简介和相应客户端的安装可以参考《 安装和使用 TPCC-MySQL 工具遇到的问题 》。
下载源码。
1 2 |
|
压缩备份。
1 |
|
查看相关文件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
README 中一句话说明:tcprstat 是一个基于 pcap 提取 TCP 应答时间信息的工具。
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 |
|
为 bootstrap 增加可执行权限后尝试执行。
1 2 3 4 |
|
查看 bootstrap 文件内容。
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 |
|
安装 automake 和 autoconf 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
安装成功后,重新执行 bootstrap ,发现不够。
1 2 3 4 5 6 |
|
只能卸载 yum 安装,然后通过源码安装 automake 和 autoconf ,安装成功后,执行 bootstrap 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
再执行
1 2 |
|
查看都生成了哪些文件。
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 |
|
进入 src 目录后可以看到生成了可执行程序。
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 |
|
【 用户手册 】
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 的输出内容可以被改变:包含或者省略其所测量得到的网络通信各的种类型统计信息。默认输出的列包含了一些在大多场景下有用的项。输出可以通过格式代码 %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 | 显示版本信息 |