QCon全球软件开发大会8折优惠倒计时,购票立减¥1760!了解详情 >>> 了解详情
写点什么

性能之巅:Linux 网络性能分析工具

2015 年 11 月 19 日

编者按: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 将业界普遍承认的性能方法、工具和指标收集于本书之中。阅读本书,你能洞悉系统运作的方式,学习到分析和提高系统与应用程序性能的方法,这些性能方法同样适用于大型企业与云计算这类最为复杂的环境的性能分析与调优。

2015 年 11 月 19 日 03:1414143

评论

发布
暂无评论
发现更多内容

Kindle的又一用处

孙苏勇

读书

LeetCode题解:515. 在每个树行中找最大值,DFS,JavaScript,详细注释

Lee Chen

算法 LeetCode 前端进阶训练营

分布式事务框架 seata-golang 通信模型详解

阿里巴巴云原生

go golang 数据库 微服务 云原生

区块链加速产业革命,打造畜禽养殖业发展新途径

CECBC区块链专委会

养殖业

海阔天空的游戏出海,HMS生态提供的风帆与通路

脑极体

Redis为什么用跳表而不用平衡树?

Java架构师迁哥

训练营第八周总结

大脸猫

极客大学架构师训练营

Singleton手绘

raox

极客大学架构师训练营

架构师训练营第三周课后作业

万有引力

与技术总监另起炉灶的CTO | 法庭上的CTO(8)

赵新龙

CTO 法庭上的CTO

架构师养成第三课

万有引力

实践出真知!华为Android面试真题解析,附超全教程文档

欢喜学安卓

android 程序员 面试 移动开发

跨专业零基础校招拿到网易18K*13薪Java岗offer全过程复盘总结

Java架构师迁哥

开除AI伦理学家,谷歌如何从“不作恶”到“不宽容”?

脑极体

Github上标星82.1K+star面试笔记,可以帮你搞定95%以上的Java面试,已经帮助多人拿下offer

云流

学习 程序员 面试 计算机

《人工智能:一种现代的方法(第3版)》PDF

计算机与AI

人工智能 学习

云上的移动性能测试平台

应用研发平台EMAS

阿里云 测试 移动研发平台

什么是802.11ax(Wi-Fi 6)

如何判断一个区块链项目是否优质?

CECBC区块链专委会

开源代码

腾讯T3大牛手把手教你!从外包月薪5K到阿里月薪15K,分享一点面试小经验

欢喜学安卓

android 程序员 面试 移动开发

一周信创舆情观察(11.30~12.6)

统小信uos

【得物技术】MySQL多表关联同步到ES的实践

得物技术

MySQL 原理 配置 ES 多表join

腾讯T1~T9级别工程师具备专业的能力及知识点总结。

Linux服务器开发

程序员 腾讯 工程师 Linux服务器开发 岗位级别

架构之书:审美与《重构》

lidaobing

架构

复盘不止复盘,更是个人认知升级加速器?

Alan

复盘 思维 技术人应知的创新思维模型 28天写作

多国探路数字货币

CECBC区块链专委会

数字货币

使用Tomcat Native提升Tomcat IO效率

程序那些事

tomcat nio 异步IO 程序那些事 bio

生产环境全链路压测建设历程之六 淘宝网2012年双十一的痛

数列科技杨德华

Serverless 如何落地?揭秘阿里核心业务大规模落地实现

阿里巴巴云原生

阿里巴巴 阿里云 Serverless 开发者 云原生

架构师训练营第 1 期 - 第十二周总结

Todd-Lee

极客大学架构师训练营

学习笔记丨Linux中数据提取相关命令

Liuchengz.

Linux ubuntu #Ubuntu

移动应用开发的下一站

移动应用开发的下一站

性能之巅:Linux网络性能分析工具-InfoQ