编者按:InfoQ 开设新栏目“品味书香”,精选技术书籍的精彩章节,以及分享看完书留下的思考和收获,欢迎大家关注。本文节选自格雷格著《性能之巅:洞悉系统、企业与云计算》中第10.6 节,介绍了其中Linux 部分网络性能分析工具的使用方法。
本文介绍基于Linux 操作系统的网络性能分析工具。它们的使用策略参见前面的部分。
本节介绍的工具列于下表中。
Linux
Solaris
描述
netstat
netstat
多种网络栈和接口统计信息
sar
统计信息历史
ifconfig
ifconfig
接口配置
ip
dladm
网络接口统计信息
nicstat
nicstat
网络接口吞吐量和使用率
ping
ping
测试网络连通性
traceroute
traceroute
测试网络路由
pathchar
pathchar
确定网络路径特征
tcpdump
snoop/tcpdump
网络数据包嗅探器
Wireshark
Wireshark
图形化网络数据包检查器
DTrace, perf
DTrace
TCP/IP 栈跟踪:连接、数据包、丢包、延时
本文将仅介绍 Linux 系统中的前 7 个网络性能分析工具。一开始是系统层面的统计数据,进而向下挖掘到包嗅探和事件跟踪。完整的功能请参考这些工具的文档,包括 Man 手册。
netstat
基于使用的选项,_netstat(8)命令能报告多种类型的网络统计数据,就像具有多种功能的 _ 组合工具。选项介绍如下:
- **(默认):** 列出连接的套接字。
- _-a__:_ 列出所有套接字的信息。
- _-s__:_ 网络栈统计信息。
- _-i__:_ 网络接口信息。
- _-r__:_ 列出路由表。
其他选项能修改输出,例如 _-n_ 不解析 IP 地址为主机名,以及 _-v_(可用时)显示冗长的详细信息。
一个 _netstat(8)_ 接口统计信息的示例如下:
数据列包括网络接口(Iface)、MTU_,_ 以及一系列接收(RX-)和传输(TX-)的指标。
- _OK__:_ 成功传输的数据包。
- _ERR__:_ 错误数据包。
- _DRP__:_ 丢包。
- _OVR__:_ 超限。
丢包和超限是网络接口 _ 饱 __ 和 _ 的指针,并且能和错误一起用 USE 方法检查。
-c_ 连续模式能与-i_ 一并使用,每秒输出这些累积的计数器。它提供计算数据包速率的数据。
下面是一个 _netstat(8)_ 网络栈统计数据(片段)的示例:
输出列出了多项按协议分组的网络数据,主要是来自 TCP 的。所幸的是,其中多数有较长的描述性名称,因此它们的意思显而易见。不幸的是这些输出缺乏一致性而且有拼写错误,用程序处理这段文字比较麻烦。
许多与性能相关的指标以加粗强调,用以指出可用的信息。其中许多指标要求对 TCP 行为的深刻理解,包括近些年引入的的最新功能和算法。下面是一些值得查找的示例指标。
- 相比接收的总数据包更高速的包转发率:检查服务器是否应该转发(路由)数据包。
- 开放的被动连接:监视它们能显示客户机连接负载。
- 相比发送的数据段更高的数据段重传输率:能支持网络的不稳定。这可能是意料之中的(互联网客户)。
- 套接字缓冲超限导致的数据包从接收队列中删除:这是网络饱和的标志,能够通过增加套接字缓冲来修复——前提是有足够的系统资源支持应用程序。
一些统计信息名称包括拼写错误。如果其他的监视工具建立在同样的输出上,简单地修复它们可能有问题。这类工具最好能从 /proc 资源读取这些统计信息,它们是 /proc/net/snmp 和 /proc/net/netstat。例如:
/proc/net/snmp 统计信息也用于 SNMP 管理信息库(MIB),它提供关于每个统计信息的用途的更进一步的文档。扩展的统计信息在 /proc/net/netstat 中。
_netstat(8)_ 可以接受以秒为单位的时间间隔,它按每个时间间隔连续地输出累加的计数器。后期处理这些输出可以计算每个计数器的速率。
sar
系统活动报告工具 _sar(1)_ 可以观测当前活动并且能配置为保存和报告历史统计数据。第 4 章中介绍过它,并且本书的多个章节在需要时也会提及它。
Linux版本用以下选项提供网络统计信息。
- _-n DEV__:_ 网络接口统计信息。
- _-n EDEV__:_ 网络接口错误。
- _-n IP__:_IP 数据报统计信息。
- _-n EIP__:_IP 错误统计信息。
- _-n TCP__:_TCP 统计信息。
- _-n ETCP__:_TCP 错误统计信息。
- _-n SOCK__:_ 套接字使用。
提供的统计信息见下表。
选项
统计信息
描述
单位
-n DEV
rxpkg/s
接收的数据包
数据包 /s
-n DEV
txpkt/s
传输的数据包
数据包 /s
-n DEV
rxkB/s
接收的千字节
千字节 /s
-n DEV
txkB/s
传输的千字节
千字节 /s
-n EDEV
rxerr/s
接收数据包错误
数据包 /s
-n EDEV
txerr/s
传输数据包错误
数据包 /s
-n EDEV
coll/s
碰撞
数据包 /s
-n EDEV
rxdrop/s
接收数据包丢包(缓冲满)
数据包 /s
-n EDEV
txdrop/s
传输数据包丢包(缓冲满)
数据包 /s
-n EDEV
rxfifo/s
接收的数据包 FIFO 超限错误
数据包 /s
-n EDEV
txfifo/s
传输的数据包 FIFO 超限错误
数据包 /s
-n IP
irec/s
输入的数据报文(接收)
数据报文 /s
-n IP
fwddgm/s
转发的数据报文
数据报文 /s
-n IP
orq/s
输出的数据报文请求(传输)
数据报文 /s
-n EIP
idisc/s
输入的丢弃(例如,缓冲满)
数据报文 /s
-n EIP
odisc/s
输出的丢弃(例如,缓冲满)
数据报文 /s
-n TCP
active/s
新的主动 TCP 连接(connect())
连接数 /s
-n TCP
active/s
新的被动 TCP 连接(listen())
连接数 /s
-n TCP
active/s
输入的段(接收)
段 /s
-n TCP
active/s
输出的段(接收)
段 /s
-n ETCP
active/s
主动 TCP 失败连接
连接数 /s
-n ETCP
active/s
TCP 段重传
段 /s
-n SOCK
totsck
使用中的总数据包
sockets
-n SOCK
ip-frag
当前队列中的 IP 数据片
fragments
-n SOCK
tcp-tw
TIME-WAIT 中的 TCP 套接字
sockets
这里,许多统计信息名称包括方向和计量单位:_rx_ 是“接收”,_i_ 是“输入”,seg_ 是“段”,依此类推。完整的列表参考 Man 手册,它包括 ICMP、UDP、NFS 和 IPv6 在内的统计信息以及对应的 SNMP 名称的说明(例如,ipInReceives 对应 _irec/s)。
以下示例是每秒打印的 TCP 统计信息:
输出显示被动连接率(入站)接近 30/s。
网络接口统计信息列(NET)列出所有接口,然而通常只对一个接口感兴趣。以下示例利用 _awk(1)_ 过滤输出:
这显示出传输和发送的网络吞吐量。这里双向的速率都超过了 2MB/s。
ifconfig
_ifconfig(8)_ 命令能手动设置网络接口。它也可以列出所有接口的当前配置。用它来检查系统、网络以及路由设置有助于静态性能调优。
Linux版本的输出包括以下这些统计信息:
这些计数器与之前介绍的 _netstat -i_ 命令一致。_txqueuelen_ 是这个接口发送队列的长度。Man 手册介绍了这个数值的调优:
对于速度较低的高延时设备(调制解调器连接,ISDN),设置较小的值有助于预防高速的大量传输影响如 telnet 在内的交互通信。
Linux 中,_ifconfig(8)_ 已经被 _ip(8)_ 命令淘汰。
ip
Linux 的 _ip(8)_ 命令能配置网络接口和路由,并且观测它们的状态和统计信息。例如,显示连接统计信息:
除了添加了接收(RX)和传输(TX)字节,这些计数器与之前介绍的 _netstat -i_ 命令一致。这利于方便地观测吞吐量,不过 _ip(8)不提供按时间间隔输出报告的方式(利用 _sar(1))。
nicstat
最初为基于 Solaris 的系统编写,_nicstat(1)_ 这个开源工具输出包括吞吐量和使用率在内的网络接口统计信息。_nicstat(1)_ 延续传统的资源统计工具 _iostat(1M)_ 和 _mpstat(1M)_ 的风格。用 C 和 Perl 编写的版本可用于基于 Solaris 和 Linux 的系统 [3]。
例如以下的 1.92 Linux 版本的输出:
最前面的输出是自系统启动以来的总结,紧接着是按时间间隔的总结。这里的时间间隔总结显示了 _eth4_ 接口的使用率为 35%(这里报告的是当前 RX 或者 TX 方向的最大值), 并且读速度为 42MB/s。
字段包括接口名称(Int)、最大使用率(%Util)、反映接口饱和度的统计信息(Sat),以及一系列带前缀的统计信息:_r_ 是“读”(接收)而 _w_ 是“写”(传输)。
- _KB/s__:_ 千字节每秒。
- _Pk/s__:_ 数据包每秒。
- _Avs/s__:_ 平均数据包大小,以字节为单位。
该版本支持多种选项,包括 _-z_ 用来忽略数值为 0 的行(闲置的接口)以及 _-t_ 显示 TCP 统计信息。
由于能提供使用率和饱和度数值,_nicstat(1)_ 特别适用于 USE 方法。
ping
_ping(8)_ 命令发送 ICMP echo 请求数据包测试网络连通性。例如:
输出显示每个包的往返时间(rtt)并总结各种统计信息。由于时间戳是由 _ping(8)_ 命令自己计量的,其中包括获取时间戳到处理网络 I/O 的整个 CPU 代码路径执行时间。
与应用程序协议相比,路由器可能以较低的优先级处理 ICMP 数据包,因而延时可能比通常情况下有更高的波动。
traceroute
_traceroute(8)_ 命令发出一系列数据包实验性地探测到一个主机当前的路由。它的实现利用了递增每个数据包 IP 协议的生存时间(TTL),从而导致网关顺序地发送 ICMP 超时响应报文,向主机揭示自己的存在(如果防火墙没有拦截它们)。
例如测试一个加利福尼亚的主机与一个弗吉尼亚的目标间当前的路由:
每一跳显示连续的三个 RTT,它们可用作网络延时统计信息的粗略数据源。类似 _ping(8)_,由于发送低优先级的数据包,它可能会显示出比其他应用程序协议更高的延时。
也可以把显示的路径作为静态性能调优的研究对象。网络被设计为动态的并且能响应故障。路径的变化可能会降低性能。
书籍介绍
《性能之巅:洞悉系统、企业与云计算》基于 Linux 和 Solaris 系统阐述了适用于所有系统的性能理论和方法,Brendan Gregg 将业界普遍承认的性能方法、工具和指标收集于本书之中。阅读本书,你能洞悉系统运作的方式,学习到分析和提高系统与应用程序性能的方法,这些性能方法同样适用于大型企业与云计算这类最为复杂的环境的性能分析与调优。
评论