本章介绍一些在Linux上可用的网络性能工具。我们主要关注分析单个设备/系统网络流量的工具,而非全网管理工具。虽然在完全隔离的情况下评估网络性能通常是无意义的(节点不会与自己通信),但是,调查单个系统在网络上的行为对确定本地配置和应用程序的问题是有帮助的。此外,了解单系统的网络流量特性也有助于找到其他有问题的系统,以及造成网络性能降低的本地硬件和应用程序错误。
阅读本章后,你将能够:
Linux和其他主流操作系统中的网络流量被抽象为一系列的硬件和软件层次。链路层,也就是最低一层,包含网络硬件,如以太网设备。在传送网路流量时,这一层并不区分流量类型,而仅仅以尽可能快的速度发送和接收数据(或帧)。
链路层的上面是网络层。这一层使用互联网协议(IP)和网际控制报文协议(ICMP)在机器间寻址并路由数据包。IP/ICMP尽其最大努力尝试在机器之间传递数据包,但是它们不能保证数据包是否能真正达到其目的地。
网络层的上面是传输层,它定义了传输控制协议(TCP)和用户数据报协议(UDP)。TCP是一个可靠协议,它可以保证消息通过网络送达,如果消息无法送达它就会产生一个错误。TCP的同级协议UDP,则是一个不可靠协议,它无法保证信息能够送达(为了获得最高的数据传输速率)。UDP和TCP为IP增加了“服务”的概念。UDP和TCP接收有编号“端口”的消息。按照惯例,每个类型的网络服务都被分配了不同的编号。例如,超文本传输协议(HTTP)通常为端口80,安全外壳(SSH)通常为端口22,文件传输协议(FTP)通常为端口23。在Linux系统中,文件/etc/services定义了全部的端口以及它们提供的服务类型。
最上一层为应用层。这一层包含了各种应用程序,它们使用下面各层在网络上传输数据包。这些应用程序包括:Web服务器、SSH客户端,甚至是P2P文件共享客户端,比如BitTorrent。
在Linux内核实现或控制的是最低三层(链路层、网络层和传输层)。内核可以提供每层的性能统计信息,包括数据流经每一层时的带宽使用情况信息和错误计数信息。本章介绍的工具就能使你提取并查看这些统计信息。
在网络层次结构的最低几层,Linux可以侦测到流经链路层的数据流量的速率。链路层,通常是以太网,以帧序列的形式将信息发送到网络上。即便是其上层次的信息片段的大小比帧大很多,链路层也会将它们分割为帧,再发送到网络上。数据帧的最大尺寸被称为最大传输单位(MTU)。你可以使用网络配置工具,如ip或ifconfig来设置MTU。对以太网而言,最大大小一般为1500字节,虽然有些硬件支持的巨型帧可以高达9000字节。MTU 的大小对网络效率有直接影响。链路层上的每一个帧都有一个小容量的头部,因此,使用大尺寸的MTU就提高了用户数据对开销(头部)的比例。但是,使用大尺寸的MTU,每个数据帧被损坏或丢弃的几率会更高。对清洁物理链路来说,大尺寸MTU通常会带来更好的性能,因为它需要的开销更小;反之,对嘈杂的链路来说,更小的MTU则通常会提升性能,因为,当单个帧被损坏时,它要重传的数据更少。
在物理层,帧流经物理网络,Linux内核可以收集大量有关帧数量和类型的不同统计数据:
对TCP或UDP流量而言,Linux使用套接字/端口来抽象两台机器的连接。当与远程机器连接时,本地应用程序用一个网络套接字来打开远程机器上的一个端口。如前所述,常见网络服务都有约定的端口号,因此,给定的应用程序就能连接到远程机器的正确端口上。比如,端口80通常用于HTTP。在加载一个Web页面时,浏览器就连接到远程机器的80端口上。远程机器上的Web服务器监听80端口上的连接,当连接发生时,Web服务器就为Web页面的传输设置该连接。
Linux网络性能工具可以跟踪流经特定网络端口的数据量。由于每个服务的端口号具有唯一性,因此有可能确定流向特定服务的物理流量。
本节介绍能够诊断性能问题的Linux网络性能工具。我们先从确定最底层网络性能(物理统计信息)的工具开始,然后逐步增加可以调查其上各层的工具。
mii-tool是以太网专用硬件工具,主要用于设置以太网设备,但它也可以提供有关当前设置的信息。这个信息,诸如链接速度和双工设置,对于追踪性能不佳设备的成因是非常有用。
使用mii-tool时需要根访问权限。其调用命令行如下:
mii -tool [-v] [device]
mii -tool输出指定设备的以太网设置。如果没有指定设备,那么mii -tool就会显示所有可用以太网设备的信息。若使用了-v选项,mii -tool将显示被提供或协商的网络功能的详细信息。
清单7.1显示的是系统上eth0的配置信息。第一行告诉我们网络设备正在使用100BASE-T全双工连接。接下来的几行描述了机器网卡的功能,以及该网卡检测到的线路另一端网络设备的功能。
mii-tool提供了关于如何配置以太网设备物理层的底层信息。
在配置和显示以太网设备统计数据方面,ethtool提供了与mii-tool相似的功能。不过,ethtool更加强大,包含了更多配置选项和设备统计信息。
ethtool在使用时需要根访问权限,其调用使用如下命令行:
ethtool [device]
ethtool输出给定的以太网设备的配置信息。如果没有特别指定设备,ethtool就会输出系统中所有以太网设备的统计信息。ethtool的主页详细说明了修改当前以太网设置的选项。
清单7.2显示了系统内eth0的配置信息。虽然该设备支持多种不同的速度和链接设置,但它当前连接到的是一个全双工,1000Mbps的链路。
ethtool运行简单,它能迅速提供配置不当的网络设备的有关信息。
ifconfig的主要工作就是在Linux机器上安装和配置网络接口。它还提供了系统中所有网络设备的基本性能统计信息。ifconfig几乎在所有联网的Linux机器上都是可用的。
ifconfig用如下命令行调用:
ifconfig [device]
如果没有指定设备,ifconfig就会显示所有活跃的网络设备。表7-1解释了ifconfig提供的性能统计项。
尽管ifconfig主要用于网络配置,但由它提供的适当数量的统计信息也能使你确定系统中每一个网络设备的健康和性能状况。
清单7.3显示了来自系统所有设备的网络性能统计信息。这里,我们有一个以太网卡(eth0)和一个环回(lo)设备。本例中,以太网卡接收数据量约为790Mb,发送数据量约为319Mb。
ifconfig提供的统计数据显示的是自系统启动开始的累计数值。如果你将一个网络设备下线,之后又让其上线,其统计数据也不会重置。如果你按规律的间隔来运行ifconfig,就可以发现各种统计数据的变化率。这一点可以通过watch命令或shell脚本来自动实现,这两种方式我们将在下一章讨论。
一些网络工具,如ifconfig,正在被淘汰,取而代之的是新的命令:ip。ip不仅可以让你对Linux联网的多个不同方面进行配置,还可以显示每个网络设备的性能统计信息。
提取性能统计数据时,用如下命令行调用ip:
ip -s [-s] link
如果你用上述选项调用ip,它就会输出系统中所有网络设备的统计信息,包括环回(lo)设备和简单互联网转换(sit0)设备。设备sit0允许将IPv6的数据包封装到IPv4的数据包中,并保持下来,这样可以缓解IPv4和IPv6之间的转换。如果ip中还有一个-s,它将会提供底层以太网更加详细的统计信息。表7-2对ip提供的部分性能统计信息进行了说明。
ip是一个非常灵活的Linux网络配置工具,虽然它的主要功能是对网络进行配置,但你也可以用它来提取底层设备的统计数据。
清单7.4给出了系统中所有设备的网络性能统计信息。这里,我们有一个以太网卡,一个环回设备,和sit0通道设备。本例中,以太网卡接收数据大约为820Mb,发送数据大约为799Mb。
与ifconfig非常相似的是,ip提供的是自系统启动开始的总的系统统计数据。如果使用watch(下一章讨论),你就可以监控这些数值是如何随着时间发生变化的。
前面的章节已经讨论过,sar是最灵活的Linux性能工具之一。它可以监控许多不同的事情,归档统计数据,甚至还能用其他工具可用的格式来显示信息。sar并不能总是与专门领域性能工具一样来提供尽可能多的详细信息,但它能给出一个很好的总体概况。
网络性能统计信息并无不同。和ip以及ifconfig一样,sar提供了链路级的网络性能数据。但是,它同时还提供了一些关于传输层打开的套接字数量的基本信息。
sar使用如下命令行来收集网络统计信息:
sar [-N DEVIEDEVISOCKIFULL] [DEVICE] [interval] [count]
sar收集多种不同类型的性能统计数据。表7-3解释了一些命令行选项,sar使用它们来显示网络性能统计信息。
表7-4给出了sar提供的网络性能选项。
考虑到sar能收集到全部统计信息,它确实为单点提供了最系统级的性能统计数据。
在清单7.5中,我们查看了系统中所有网络设备的发送和接收统计信息。就像你能看到的,设备eth0是最活跃的。在第一个采样,eth0每秒接收的数据大约为63000字节(rxbyt/s),发送的数据大约为45000字节(txbyt/s)。未发送或接收压缩数据包(txcmp、rxcmp)。(压缩数据包通常出现在SLIP或PPP连接中)。
在清单7.6中,我们查看了系统中开放套接字的数量。我们可以看到开放套接字以及TCP、RAW和UDP套接字的总数。sar还能显示IP数据包分片的数量。
sar提供了对系统性能的一个很好的概览。但是,当我们要调查一个性能问题时,我们实际上想要了解的是哪些进程或服务消耗了特定的资源。sar不会提供这方面的详细信息,但它确实让我们观察到了整个系统的网络I/O统计信息。
gkrellm是一个图形化监视器,它使你能够观察到多种不同的系统性能统计信息。它为各种统计信息绘制图表,包括CPU使用情况、磁盘I/O,以及网络使用情况。它可以通过“主题”来改变外观,甚至可以使用插件来监控默认版本中不包含的事件。
gkrellm提供的信息与sar、ip和ipconfig类似,但与它们不同的是,它提供的是数据的图形视图。此外,它还提供流经特定UDP和TCP端口流量的有关信息。这是我们看到的第一个可以显示具有不同网络带宽消耗量的服务的工具。
gkrellm用如下命令行调用:
gkrellm
gkrellm没有命令行选项用于配置其监控的统计信息。启动gkrellm之后,所有的配置都是图形化的。调出配置界面有两种方法:你可以右键点击gkrellm标题栏并选择Configuration,或者当光标在窗口的任何位置时按下F1。这两种操作都可以调出配置窗口(如图7-1所示)。
图7-2显示的是网络配置窗口。它用于配置哪些统计信息以及哪些服务显示在gkrellm 的最终输出窗口。
你可以将gkrellm配置为监控特定范围TCP端口的活动。这样你就能够监控服务,如HTTP或FTP,使用的确切端口,并测量它们使用的带宽量。在图7-2中,我们将gkrellm 配置为监控被BitTorrent(BT)P2P应用和Web服务器(HTTP)使用的端口。
gkrellm是一个灵活而强大的图形化性能监控工具。它使你能够观察到当前系统的执行情况,以及其性能随时间的变化。使用gkrellm最困难的地方在于阅读小的默认文本。不过,gkrellm的外观定制起来很容易,因此我们也可以推测这个缺点修正起来也比较容易。
如前所述,gkrellm可以监控多种不同类型的事件。在图7-3中,我们对输出进行了选择,因此只显示了与网络流量及其使用有关的统计数据。
从图7-3中可以看到,顶部的两个图是端口的使用带宽(BT 和HTTP),端口已经在配置部分进行了设置,底部的两个图则分别是两个设备(eth0和lo)的统计数据。图中可见,有少量BitTorrent(BT)流量,但是没有Web服务器流量(HTTP)。以太网设备eth0之前有一些大的活动,但是现在已经平静下来。eth0 中较浅的阴影部分表示的是接收的字节数,而较深的阴影部分表示的是发送的字节数。
gkrellm是一个功能强大的图形化工具,利用它可以一眼就判断出系统的状态。
iptraf是一个实时网络监控工具。它提供了相当多的模式来监控网络接口和流量。iptraf 是一种控制台应用程序,但其用户界面则是基于光标的一组菜单和窗口。
与本章前面所述其他工具一样,iptraf可以提供有关每个网络设备发送帧速率的信息。同时,它还能够显示TCP/IP数据包的类型和大小信息,以及哪些端口被用于网络流量。
iptraf用如下命令行调用:
iptraf [-d interface] [-s interface] [·t ]
如果调用iptraf时不带参数,就会显示一个菜单,让你选择监控界面以及想要监控的信息类型。表7-5对命令行选项进行了说明,这些选项用于观察特定接口或网络服务上的网络流量。
iptraf还有更多模式和配置选项。详细信息请参阅其附带文档。
当用如下命令行调用iptraf时,它创建的输出如图7-4所示:
[rootewintermute tmp]# iptraf -d etho ·t 1
这条命令指定iptraf显示以太网设备eth0的详细信息并在运行1分钟后退出。此例中,我们可以看到网络设备eth0的接收速率为186.8kbps,发送速率为175.5kbps。
图7-5所示的是下一条命令,它要求iptraf显示每个UDP和TCP端口上的网络流量信息。调用命令如下:
[rootewintermute etherape·0.9.0]# iptraf -s etho -t 10
因为常用服务的TCP和UDP端口是固定的,所以,你可以利用这些信息来确定每个服务处理了多少流量。图7-5显示,有29kb的HTTP数据从eth0发送出来,有25kb则被其接收。
由于iptraf是基于控制台的应用程序,因此,它不需求X服务器或X服务器库。即使iptraf不能用鼠标来控制,它也是易于使用和配置的。
netstat是一种基本的网络性能工具,它几乎出现在每一个联网的Linux机器上。可以用它抽取的信息包括:当前正在使用的网络套接字的数量和类型,以及有关流入和流出当前系统的UDP和TCP数据包数量的特定接口统计数据。它还能将一个套接字回溯到其特定进程或PID,这在试图确定哪个应用程序要对网络流量负责时是很有用的。
netstat用如下命令行调用:
netstat [-p] [-c] [-interfaces=] [-s] [-t] [-u] [-w]
如果netstat调用时不带任何参数,它将显示系统范围内的套接字使用情况以及Internet 域和UNIX域套接字的信息。(UNIX域套接字用于本机的进程通信。)为了能检索所有其可以显示的统计信息,需要从根目录运行netstat。表7-6中的命令行选项可以用于修改netstat 显示信息的类型。
netstat还可以使用其他未在表中列出的命令行选项,更多信息参见netstat帮助手册。
清单7.7要求netstat显示活跃的TCP连接并持续更新该信息。每一秒netstat都将显示新的TCP网络统计数据。netstat不允许设置监控时长,因此如果被杀死或中断(Ctrl-C),它就只能停止。
清单7.8再次要求netstat显示TCP套接字的信息,但是,这一次我们还要求它给出与该套接字相关的程序。本例中,我们可以看到应用程序SSH和mozilla-bin发起了TCP连接。
清单7.9要求netstat提供启动后系统已接收的UDP流量统计信息。
清单7.10要求netstat提供流经接口eth0的网络流量的相关信息。
netstat提供了大量的,与运行的Linux系统的套接字和接口相关的网络性能统计信息。它是唯一能将被使用套接字映射回其使用者进程PID的网络性能工具,因此,它是非常有用的。
etherape(基于Windows的网络工具etherman的双关语)为当前网络流量提供了可视化信息。默认情况下,它观察的是流经网络的全部网络流量,而不只是当前机器收发的那些包。不过,它也可以被配置为仅显示当前机器的网络信息。
etherape(界面和文档)不够完美,但它提供了独一无二的视图来显示网络是如何连接的、被请求服务的类型,以及哪些节点请求了服务。在ehterape创建的图中,节点代表的就是网络上的系统。通信的节点之间用线连接,节点间网络流量越大则线的规模也越大。当某个系统的网络使用量增加时,代表该系统的圆圈也会变大。不同系统之间的连线用不同的颜色来区分两者之间使用的通信协议。
etherape利用libpcap库来捕捉网络包,因此,它必须作为根用户运行。etherape用如下命令行调用:
etherape [-n] [-i ]
表7-7解释了部分命令行选项,它们可以用来改变etherape监控的接口,或者决定是否在每个节点上显示解析主机名。
总之,etherape的文档相当少。etherape说明页给出了一些可以改变其外观和行为的命令行,但是,最好的学习方法就是使用它。一般说来,etherape是网络可视化的相当不错的方法。
图7-6显示的是etherape对一个相对简单的网络的监控。如果我们匹配一下协议的颜色
与最大圆圈的颜色,我们会发现该节点产生了大量的SSH流量。从图上来看,要确定哪个节点导致了这些SSH流量是很困难的。虽然没有显示,如果我们双击这个大圆圈,etherape 就会新建一个窗口来显示与该流量相关的节点的统计信息。我们可以用这些信息来调查网络流量的每个生成者以及它们的节点名称。
etherape的输出会周期性的更新。如果网络流量发生了变化,则图形就会更新。观察网络流量发现它是如何使用的,以及如何随时间变化,是一件非常有趣的事情。
本章的主要内容是如何使用Linux网络性能工具来监控从底层网络接口到高层应用,流经整个系统的网络流量。本章首先介绍的工具可以查询当前物理链接设置(mii-tool、ethtool),以及监控流经底层接口数据包的类型和数量(ifconfig、ip、sar、gkrellm、iptraf、netstat、etherape)。接着介绍的工具可以显示不同类型的IP流量(gkrellm、iptraf、netstat、etherape)和每种流量的数量(gkrellm、iptraf、etherape)。本章还介绍了一种工具(netstat)用来将IP套接字的使用映射到接收/发送每种类型流量的进程上。最后,本章给出了一个网络可视化工具,它可以将流经网络的数据类型和数量与其流经节点之间的关系可视化(etherape)。
下一章将会介绍几个常用的Linux工具,它们能让性能工具的使用变得更加容易。这些工具本身不是性能工具,但是,它们使得使用性能工具变得更加容易接受。同时,它们有助于把工具得到的结果进行可视化和分析,并且还可以把更多的重复性任务进行自动化。