查找Linux中每个进程的网络流量和带宽使用情况
作为系统管理员,有时我们需要检查哪个进程占用了计算机上的高网络带宽。
如果没有为此目的而设计的任何标准工具,这并非易事。
在本文中,我们将研究一种这样的工具。
但是在查看该工具之前,我们将尝试使用其他方法来获取详细信息。
我要求我的读者分享可用于实现此目的的任何其他命令行技术/工具。
Linux桌面上的大多数图形用户界面都具有基于GUI的applet,以获取此详细信息。
但是它们大多数仅显示系统的总网络使用情况(不显示每个进程的详细信息。
)。
无论如何,在生产服务器上,我们将没有基于GUI的工具来获取此类信息。
因此,我们将仅讨论实现此目的的命令行工具和技术。
第一种方法是使用iptraf或者iftop之类的工具来识别发送大量流量的端口,然后从列表中查找该特定端口上正在运行的端口。
尽管这是查找发送流量的过程的乏味方法,但我已多次使用此方法,并且可以达到目的。
首先由YUM或者apt-get安装iptraf或者iftop,具体取决于发行版。
然后触发iptraf命令,以通过接口和端口详细信息查找流量使用情况。
Iptraf命令将为我们提供如下所示的输出。
它显示了两件事,即源地址及其网络端口。
在第一个欢迎屏幕上按Enter键以查看可用选项。
选择带有所有接口的“ IP流量监视器”选项后,将显示如下输出。
IPTraf l TCP Connections (Source Host:Port) qqqqqqqqqq Packets qqq Bytes Flags Iface k xl192.168.190.129:22 > 462 95456 -PA- eth0 x xm192.168.190.1:49946 > 238 11688 --A- eth0 x x x x x x x x x x x x x x x x x x x x x m TCP: 1 entries qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq Active qj lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk x x
默认情况下,它将按使用情况对连接进行排序。
就我而言,我可以很容易地找出端口22上正在运行哪个进程(当然是ssh),但是我们可以通过以下netstat命令在该端口上找到该进程。
root@ubuntu2:~# netstat -tunp | grep 22 tcp 0 64 192.168.190.129:22 192.168.190.1:49946 ESTABLISHED 1104/sshd: ubuntu [ root@ubuntu2:~#
或者,我们也可以使用lsof命令来查找在该端口上运行的进程。
root@ubuntu2:~# lsof -i:22 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 671 root 3u IPv4 8584 0t0 TCP *:ssh (LISTEN) http://www.innotica.com/personal-loan-requirement sshd 671 root 4u IPv6 8595 0t0 TCP *:ssh (LISTEN) sshd 1104 root 3u IPv4 9170 0t0 TCP 192.168.190.129:ssh->192.168.190.1:49946 (ESTABLISHED) sshd 1120 ubuntu 3u IPv4 9170 0t0 TCP 192.168.190.129:ssh->192.168.190.1:49946 (ESTABLISHED)
我们还可以使用类似于我们使用iptraf来查找端口和接口发出的流量的方式的iftop工具。
如下所示。
root@ubuntu2:~# iftop -P 12.5kb 25.0kb 37.5kb 50.0kb 62.5kb mqqqqqqqqqqqqqqqvqqqqqqqqqqqqqqqvqqqqqqqqqqqqqqqvqqqqqqqqqqqqqqqvqqqqqqqqqqqqqqq 192.168.190.129:ssh => 192.168.190.1:49946 928b 1.13kb 1.67kb <= 160b 160b 192b 192.168.190.129:56386 => 192.168.190.2:domain 0b 0b 30b <= 0b 0b 30b 192.168.190.129:51953 => 192.168.190.2:domain 0b 0b 29b <= 0b 0b 29b 192.168.190.129:53003 => 192.168.190.2:domain 0b 0b 29b <= 0b 0b 29b qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq TX: cum: 4.40kB peak: 3.75kb rates: 928b 1.13kb 1.76kb RX: 698B 1.16kb 160b 160b 279b TOTAL: 5.08kB 4.83kb 1.06kb 1.29kb 2.03kb
我们在以上命令中使用的-P选项将打开iftop输出中的端口显示,我们需要找出在该端口上运行的进程。
现在,我们可以使用netstat或者lsof来查找该过程。
除了iftop和iptraf,我们还可以使用称为jnettop的工具。
我们可以通过简单的apt-get install jnettop命令轻松地在ubuntu中安装jnettop。
安装后,它将显示我们使用iptraf和iftop命令获得的类似详细信息。
其示例输出如下所示。
run 0:00:41 device eth0 pkt[f]ilter: none . [c]ntfilter: on [b]ps=bytes/s [l]ocal aggr: none [r]emote aggr: none [q]uit [h]elp [s]orting [p]ackets [.] pause [0]-[9] switch device LOCAL <-> REMOTE TXBPS RXBPS TOTALBPS (IP) PORT PROTO (IP) PORT TX RX TOTAL 192.168.190.129 <-> 192.168.190.1 252b/s 60b/s 312b/s 192.168.190.129 22 TCP 192.168.190.1 51394 11.4K 2.72K 14.1K UNKNOWNv4 <-> UNKNOWNv4 14b/s 20b/s 34b/s 0.0.0.0 0 ARP 0.0.0.0 0 42b 60b 102b qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq TOTAL 266b/s 80b/s 346b/s 11.7K 3.09K 14.8K
当我们要监视特定源和目标之间的流量时,jnettop命令非常适合。
但是它提供了我们所需的端口详细信息,以找出使用该端口的过程。
但是有一个更好的工具专门用于此目的。
和它的叫nethogs。
它与用于按网络使用情况对进程进行排序的top命令非常相似。
它非常容易安装和使用。
如果我们使用的是RedHat/Centos系统,则需要先安装EPEL Yum存储库,然后才能安装nethogs。
对于ubuntu用户,只需简单的apt-get命令即可。
root@ubuntu2:~# apt-get install nethogs
现在,从nethogs手册页中,我们可以找到该工具的以下说明。
描述
NetHogs是一个小的“ net top”工具。
而不是中断流量
像大多数此类工具一样,按照协议或者子网进行分组,
宽度取决于进程,并且不依赖于特殊的内核模块
已加载。
因此,如果突然有大量网络流量,我们可以触发
NetHogs并立即查看是由哪个PID引起的,如果是
某种旋转过程,将其杀死。
NetHogs命令的用法和示例
一旦安装了该工具,它就非常易于使用。
只需键入nethogs即可显示我们所需的一切。
请参见下面的示例输出。
root@ubuntu2:~# nethogs NetHogs version 0.8.0 PID USER PROGRAM DEV SENT RECEIVED 2214 root /usr/lib/apt/methods/http eth0 4.693 238.631 KB/sec 2051 ubuntu sshd: ubuntu@pts/1 eth0 3.442 0.310 KB/sec 1120 ubuntu sshd: ubuntu@pts/0 eth0 0.416 0.035 KB/sec 2213 root /usr/lib/apt/methods/http eth0 0.021 0.023 KB/sec ? root unknown TCP 0.000 0.000 KB/sec TOTAL 8.572 239.000 KB/sec
它在其输出中显示以下详细信息。
这些详细信息足以满足我们根据网络使用情况对流程进行排序的目的。
- PID(进程ID)
- 运行进程的用户
- 命令或者程序
- 流量将通过的网络接口
- 已发送字节
- 接收字节
如果看到上面的输出,则默认情况下,其输出从高到低排序...
与最常用的命令类似,我们也可以提供刷新率,该工具将在屏幕上刷新其统计信息。
可以在带有-d选项的nethogs中完成,如下所示。
root@ubuntu2:~# nethogs -d 1
现在它将每秒刷新一次。
与top相似,它也具有几个交互式命令。
这些可以用于以不同的顺序对输出进行排序,例如发送和接收,以及将输出方法从kb更改为mb等。
在交互式控制台运行时输入m将在kb/s,kb,b和mb之间切换。
按r将按接收到的形式对输出进行排序。
然后按s将以发送形式对其进行排序。