Linux下常见网络流量查看方法与工具
2010-10-19 13:53:47 阿炯

本文介绍了一些可以用来监控网络使用情况的Linux命令行工具,这些工具可以监控通过网络接口传输的数据,并测量目前哪些数据所传输的速度,入站流量和出站流量分开来显示。

一些命令可以显示单个进程所使用的带宽,这样用户很容易发现过度使用网络带宽的某个进程,这些工具使用不同的机制来制作流量报告。比如nload等一些工具可以读取"proc/net/dev"文件,以获得流量统计信息;而一些工具使用pcap库来捕获所有数据包,然后计算总数据量,从而估计流量负载;还可以使用ethtool来查看或设置网口的属性。下面是按功能划分的命令名称:
监控总体带宽使用――nload、bmon、slurm、bwm-ng、cbm、speedometer和netload
监控总体带宽使用(批量式输出)――vnstat、ifstat、dstat和collectl
每个套接字连接的带宽使用――iftop、iptraf、TCPtrack、pktstat、netwatch和trafshow
每个进程的带宽使用――nethogs

nload
安装nload:Fedora和Ubuntu在默认软件库里面就有nload,CentOS用户则需要从Epel软件库获得nload。

iftop
iftop可测量通过每一个套接字连接传输的数据;它采用的工作方式有别于nload。iftop使用pcap库来捕获进出网络适配器的数据包,然后汇总数据包大小和数量,搞清楚总的带宽使用情况。虽然iftop报告每个连接所使用的带宽,但它无法报告参与某个套按字连接的进程名称/编号(ID)。不过由于基于pcap库,iftop能够过滤流量,并报告由过滤器指定的所选定主机连接的带宽使用情况。

iftop -n:n选项可以防止iftop将IP地址解析成主机名,解析本身就会带来额外的网络流量。

iptraf
iptraf是一款交互式、色彩鲜艳的IP局域网监控工具。它可以显示每个连接以及主机之间传输的数据量。

nethogs
nethogs是一款小巧的"net top"工具,可以显示每个进程所使用的带宽,并对列表排序,将耗用带宽最多的进程排在最上面。万一出现带宽使用突然激增的情况,用户迅速打开nethogs,就可以找到导致带宽使用激增的进程。nethogs可以报告程序的进程编号(PID)、用户和路径。

bmon
bmon(带宽监控器)是一款类似nload的工具,它可以显示系统上所有网络接口的流量负载。输出结果还含有图表和剖面,附有数据包层面的详细信息。bmon支持许多选项,能够制作HTML格式的报告。

slurm
slurm是另一款网络负载监控器,可以显示设备的统计信息,还能显示ASCII图形。它支持三种不同类型的图形,使用c键、s键和l键即可激活每种图形。slurm功能简单,无法显示关于网络负载的任何更进一步的详细信息。

tcptrack
tcptrack类似iftop,使用pcap库来捕获数据包,并计算各种统计信息,比如每个连接所使用的带宽。它还支持标准的pcap过滤器,这些过滤器可用来监控特定的连接。

vnstat
vnstat与另外大多数工具有点不一样。它实际上运行后台服务/守护进程,始终不停地记录所传输数据的大小。之外,它可以用来制作显示网络使用历史情况的报告。运行没有任何选项的vnstat,只会显示自守护进程运行以来所传输的数据总量。想实时监控带宽使用情况,请使用"-l"选项(实时模式)。然后,它会显示入站数据和出站数据所使用的总带宽量,但非常精确地显示,没有关于主机连接或进程的任何内部详细信息。vnstat更像是一款制作历史报告的工具,显示每天或过去一个月使用了多少带宽。它并不是严格意义上的实时监控网络的工具。

bwm-ng
bwm-ng(下一代带宽监控器)是另一款非常简单的实时网络负载监控工具,可以报告摘要信息,显示进出系统上所有可用网络接口的不同数据的传输速度。如果控制台足够大,bwm-ng还能使用curses2输出模式,为流量绘制条形图。

cbm:Color Bandwidth Meter
这是一款小巧简单的带宽监控工具,可以显示通过诸网络接口的流量大小。没有进一步的选项,仅仅实时显示和更新流量的统计信息。

speedometer
这是另一款小巧而简单的工具,仅仅绘制外观漂亮的图形,显示通过某个接口传输的入站流量和出站流量。

pktstat
pktstat可以实时显示所有活动连接,并显示哪些数据通过这些活动连接传输的速度。它还可以显示连接类型,比如TCP连接或UDP连接;如果涉及HTTP连接,还会显示关于HTTP请求的详细信息。

netwatch
netwatch是netdiag工具库的一部分,它也可以显示本地主机与其他远程主机之间的连接,并显示哪些数据在每个连接上所传输的速度。

trafshow
与netwatch和pktstat一样,trafshow也可以报告当前活动连接、它们使用的协议以及每条连接上的数据传输速度。它能使用pcap类型过滤器,对连接进行过滤。

netload
netload命令只显示关于当前流量负载的一份简短报告,并显示自程序启动以来所传输的总字节量,没有更多的功能特性。它是netdiag的一部分。

ifstat
ifstat能够以批处理式模式显示网络带宽。输出采用的一种格式便于用户使用其他程序或实用工具来记入日志和分析。

dstat
dstat是一款用途广泛的工具(用python语言编写),它可以监控系统的不同统计信息,并使用批处理模式来报告,或者将相关数据记入到CSV或类似的文件。

collectl
collectl以一种类似dstat的格式报告系统的统计信息;与dstat一样,它也收集关于系统不同资源(如处理器、内存和网络等)的统计信息。

上述几个使用方便的命令可以迅速检查Linux服务器上的网络带宽使用情况。不过,这些命令需要用户通过SSH登录到远程服务器。另外,基于Web的监控工具也可以用来实现同样的任务。ntop和darkstat是面向Linux系统的其中两个基本的基于Web的网络监控工具。除此之外还有企业级监控工具,比如nagios,它们提供了一批功能特性,不仅仅可以监控服务器,还能监控整个基础设施。下面将对部分工具的使用具体展开讲解。


1、bwbar
使用bwbar来查看当前流量与带宽使用情况。bwbar is a simple daemon which creatse a readout of current bandwidth usage, generally for inclusion on a webpage. The output appearin both a text file and a PNG format bargraph in the specified output directory, and is based on data gathered from the specified device and the specified maximum bandwidth.

下载地址

2、iftop

iftop是一款Linux下的实时网络流量监控工具,可以在以类unix为操作系统的服务器或VPS上安装使用,主要用来显示本机网络流量情况及各相互通信的流量集合,如单独同那台机器间的流量大小,非常适合于代理服务器和iptables服务器使用。类似于top的实时流量监控工具,无报表功能,需使用root运行。

iftop does for network usage what top(1) does for CPU usage. It listens to network traffic on a named interface and displays a table of current bandwidth usage by pairs of hosts.

安装iftop,必须先安装libpcap;pcap安装完成,再来安装iftop。

iftop界面说明:
首行是网络流量刻度。
第一行为带宽
连接列表,最后三个分别是2秒,10秒和40秒的平均流量
=>代表发送,<= 代表接收
最后三行表示发送,接收和全部的流量,第二列为你运行iftop到目前流量,第三列为峰值,第四列为平均值。

在iftop的图表中最后有三列流量的数值显示的说明:
其中第一列的意思是:在之前两秒钟的平均流量
第二列的意思是:在之前10秒钟一共的流量
最后一列的意思是:在之前的40秒钟五分之一的流量数值
中间是与其它机器的流量,有个白底的bar直观的标识流量变化,后三列数据分别表示:
1. preceding 2 seconds 过去两秒钟的流量(traffic)
2. around half that amount over the preceding 10s 过去十秒钟流量的一半
3. a fifth of that over the whole of the last 40s 过去40秒钟流量的五分之一

最下面3行
TX:发送流量
RX:接收流量
TOTAL:总流量
cumm:运行iftop以来的总流量
peak:峰值流量
rates:分别表示过去 2s 10s 40s时间内网卡总的平均流量

按h可以得到帮助,从帮助回到流量图也是按h

#iftop -i eth0 -n       就可以看到eth0网卡的流量状况:

iftop 相关命令 :
监控eth1的网卡的流量
# iftop -i eth1
以位元组(bytes)为单位显示流量(预设是位元bits):
$ iftop -B
直接显示IP, 不进行DNS反解:
$ iftop -n
直接显示连接埠编号, 不显示服务名称:
$ iftop -N
显示某个网段进出封包流量
$ iftop -F 192.168.1.0/24 or 192.168.1.0/255.255.255.0
其他参数可下 iftop -h 看说明.
进入iftop画面时, 可按 p 切换是否显示连接埠, n 切换显示IP或主机的domain name, N切换显示连接埠代号或名称, p暂停显示, b切换是否显示长条, B切换计算几秒内的平均流量, 其他按键可以按h观看说明.

常用的参数
-i设定监测的网卡,如:# iftop -i eth1
-B 以bytes为单位显示流量(默认是bits),如:# iftop -B
-n使host信息默认直接都显示IP,如:# iftop -n
-N使端口信息默认直接都显示端口号,如: # iftop -N
-F显示特定网段的进出流量,如# iftop -F 10.10.1.0/24或# iftop -F 10.10.1.0/255.255.255.0
-h(display this message),帮助,显示参数信息
-p使用这个参数后,中间的列表显示的本地主机信息,出现了本机以外的IP信息;
-b使流量图形条默认就显示;
-f这个暂时还不太会用,过滤计算包用的;
-P使host信息及端口信息默认就都显示;
-m设置界面最上边的刻度的最大值,刻度分五个大段显示,例:# iftop -m 100M

进入iftop画面后的一些操作命令(注意大小写)
按h切换是否显示帮助;
按n切换显示本机的IP或主机名;
按s切换是否显示本机的host信息;
按d切换是否显示远端目标主机的host信息;
按t切换显示格式为2行/1行/只显示发送流量/只显示接收流量;
按N切换显示端口号或端口服务名称;
按S切换是否显示本机的端口信息;
按D切换是否显示远端目标主机的端口信息;
按p切换是否显示端口信息;
按P切换暂停/继续显示;
按b切换是否显示平均流量图形条;
按B切换计算2秒或10秒或40秒内的平均流量;
按T切换是否显示每个连接的总流量;
按l打开屏幕过滤功能,输入要过滤的字符,比如ip,按回车后,屏幕就只显示这个IP相关的流量信息;
按L切换显示画面上边的刻度;刻度不同,流量图形条会有变化;
按j或按k可以向上或向下滚动屏幕显示的连接记录;
按1或2或3可以根据右侧显示的三列流量数据进行排序;
按<根据左边的本机名或IP排序;
按>根据远端目标主机的主机名或IP排序;
按o切换是否固定只显示当前的连接;
按f可以编辑过滤代码,这是翻译过来的说法,我还没用过这个!
按!可以使用shell命令,这个没用过!没搞明白啥命令在这好用呢!
按q退出监控。

官方网站

3、nload
nload is a console application which monitors network traffic and bandwidth usage in real time. It visualizes the in- and outgoing traffic using two graphs and provides additional info like total amount of transfered data and min/max network usage.

nload默认分为上下两块:上半部分是:Incoming也就是进入网卡的流量,下半部分是:Outgoing,也就是从这块网卡出去的流量,每部分都有当前流量(Curr),平均流量(Avg),最小流量(Min),最大流量(Max),总和流量(Ttl)这几个部分。另外也可以自己定义流量数值显示的单位。
使用‘/usr/local/nload/bin/nload –help’可以看到具体的相关参数了。

nload eth0 - 查看名叫eth0网卡的流量

可查看当前、平均、最小、最大、总共等的流量情况,单位为bit。设置下.nload文件也可以

[root@localhost ~]# cat .nload
Version=”1″
AverageWindow=”300″
BarMaxIn=”51200″
BarMaxOut=”51200″
DataFormat=”MBit”
Devices=”eth0″
MultipleDevices=”[ ]”
RefreshInterval=”500″
TrafficFormat=”MBit”
Version=”1″

比较好的例子:
nload -o 20480 -i 204800 -u M

Nload provides network load graph
nload allow a system administrator to easily monitor the traffic going on its network. It provide both a graph of incoming and outgoing traffic as well as network data transfert statistics.

nload can be used straightforward by typing:
$nload

Once nload is started, you can exit the interface by typing either q or Ctrl-c.

By default, nload will display incoming and outgoing traffic in kBit/s and use eth0 as default network interface on a linux system, fxp0 on BSD, hme0 on Solaris and lan0 on HP-UX.

Monitoring more than 1 network interface:
Nload multiple interface on one screenIf you want to monitor more than on interface, or another one than the default one, you need to supply the network interface names at the end of the command, so for intance, if you want to monitor eth1 and lo, type:
$nload eth1 lo

you can then navigate from a network interface to another by using the following key shortcut:
To go to the:
* next interface use any of the following keys: ArrowRight, ArrowDown, PageDown, Enter, Tab or n
* previous interface: ArrowLeft, ArrowUp, PageUp or p

Some people might prefer to see all the devices status together in the same window. In that case, simply use the -m switch like this:
$nload -m eth1 lo

You can then use the previous key shortcuts to go to the previous and next pages if all the interfaces could not fit in a single window.

Options to use with nload:
nload comes with a bunch of switches which allow you to customize the output given by nload.

You can customize the 100% mark of the incoming bandwidth using -i XXX (where XXX is given in kBits/s) or -o YYY for outgoing traffic, default is 10240.Change the interval of update is done by adding -t SSS (where SSS is the time in milliseconds), default is 500 ms.

To change the type of unit displayed for the traffic numbers use -u h|b|k|m|g for human, bits, kilo, mega or giga bits, using H|B|K|M|G will make the output type being in Bytes, default is k.
-U will do the same but for the amount of data, default is M.

Examples:
monitoring interfaces eth0 and lo with unit type in kBit/s:
$nload eth0 lo

the same, but with both interface in the same windows:
$nload -m eth0 lo

monitoring eth0 with the max value for incoming bandwidth setted at 20kBit/s and max value for outgoing traffic at 15kBit/s with transfert unit type automatically handed by nload in Bit/s
$nload -i 20 -o 15 -u h eth0

Conclusion:
being a ncurse based application, nload is easy to use while monitoring remote hosts via ssh for instance. Moreover, it does not use much CPU or Memory ressources.

The graph provided by nload make it easy to check for bursts or traffic irregularity.

官方主页

4、nethogs

NetHogs是一个开源的命令行工具(类似于Linux的top命令),用来按进程或程序实时统计网络带宽使用率,能非常方便定位哪个进程流量过高,它属于epel里面软件包。它属于一个小型的net top工具,不像大多数工具那样拖慢每个协议或者是每个子网的速度而是按照进程进行带宽分组,不需要依赖载入某个特殊的内核模块。如果发生了网络阻塞可以启动NetHogs立即看到哪个PID造成的这种状况。
# nethogs eth0 -d 3 监控eth0并每3s刷新一次

根据输出的进程名字就能定位到流量过高的应用。有很多适用于Linux系统的开源网络监视工具。比如可以用命令iftop来检查带宽使用情况,netstat用来查看接口统计报告,还有top监控系统当前运行进程。但是如果想要找一个能够按进程实时统计网络带宽利用率的工具,那么值得一试。

语法
nethogs(选项)(参数)

选项
nethogs [-V] [-h] [-b] [-d seconds] [-v mode] [-c count] [-t] [-p] [-s] [device [device [device ...]]]
-V : 打印版本。
-h : 打印此帮助。
-b : bughunt模式 - 暗示tracemode。
-d : 延迟更新刷新率(以秒为单位)。 默认值为1。
-v : 视图模式(0 = KB/s,1 =总KB,2 =总B,3 =总MB),默认值为0。
-c : 更新次数。 默认为0(无限制)。
-t : tracemode.
-p : 混杂模式(不推荐)。
-s : 按发送列排序输出。
-a : 监控所有设备,甚至环回/停止。

device : 要监控的设备,默认是所有接口启动和运行,不包括环回。

当nethogs运行时,可使用交互命令(键盘快捷键):
q:退出
s:按(SENT)发送流量排序
r:按(RECEIVE)接收流量排序
m:在总(KB,B,MB)和KB/s模式之间切换

其他参数和用法
-d : 刷新间隔
-h : 帮助
-p : promiscious 模式
-t : trace模式
-V : 版本

在Debian/Ubuntu/Linux Mint下要执行NetHogs你必须拥有root权限:send列和received列显示的是按照每个进程的流量统计,总的收发数据带宽在最下方,而且可以用交互命令控制排序,下面将要讨论这些交互命令。

使用示例

以下就是NetHogs命令行的参数,用-d来添加刷新频率参数,device name 用来检测给定的某个或者某些设备的带宽(默认是eth0)。例如:设置5秒钟的刷新频率,键入如下命令即可:
nethogs -d 5

如果只用来监视设备(eth0)的网络带宽可以使用如下命令:
nethogs eth0

如果要同时监视eth0和eth1接口,使用以下命令即可:
nethogs eth0 eth1

关于NetHogs命令行工具的完整参数列表,可以参考NetHogs的手册,在终端里输入man nethogs来查看,更多信息请参考NetHogs项目主页。


官方主页


5、自写程序
#!/bin/bash
#上次更新:2010-10-07
#作者:郑炯
#测试网卡是否正常,网络不通畅的情况下...

#定义参照主机-机房测试地址
hostip='114.80.x.x'

#产生日期时间
datime="$(date +%F%t%T)"

#定义日志文件
logfile=/var/log/detnetcard/$(date +%F).log

#取得日志文件路径并建立之
plogfile=$(dirname $logfile)
if [ ! -d $plogfile ]
then
mkdir --parents --verbose $plogfile
if [ $? -ne 0 ]
then
echo "目录$plogfile创建失败!!" 2>&1
exit
fi
fi

#ping网关及网络此时流量检查,主函数
pingit(){
echo $datime>>$logfile
/usr/bin/fping -a -C 2 $hostip>>$logfile

NIC="eth0"
rx_before=$(/sbin/ifconfig $NIC|/bin/sed -n "8"p|/usr/bin/awk '{print $2}'|/usr/bin/cut -c7-)
tx_before=$(/sbin/ifconfig $NIC|/bin/sed -n "8"p|/usr/bin/awk '{print $6}'|/usr/bin/cut -c7-)
sleep 2
rx_after=$(/sbin/ifconfig $NIC|/bin/sed -n "8"p|/usr/bin/awk '{print $2}'|/usr/bin/cut -c7-)
tx_after=$(/sbin/ifconfig $NIC|/bin/sed -n "8"p|/usr/bin/awk '{print $6}'|/usr/bin/cut -c7-)
rx_result=$[(rx_after-rx_before)/256000]
tx_result=$[(tx_after-tx_before)/256000]

if [ $? -ne 0 ]
then
echo "Fuck!GateWay $hostip Unreachable" 2>&1>>$logfile
echo "In_Speed: "$rx_result"Mbps OUt_Speed: "$tx_result"Mbps">>$logfile
/bin/sync
#        /sbin/reboot
else
echo "NetWork is OK.">>$logfile
echo "In_Speed: "$rx_result"Mbps OUt_Speed: "$tx_result"Mbps">>$logfile
fi
}

#正式调用
pingit


##############

此脚本可能通过手动或cron调用,其将将会在目录'/var/log/detnetcard'下生成相关的文件,记录当时与某一地直通信的情况及当时的进出流量。也可以将其写进while语句来做近实时的输出。本站另外还有一篇关于在debian下流量查看工具介绍的文章。

该文章最后由 阿炯 于 2022-09-03 10:51:20 更新,目前是第 3 版。