查找Linux中每个进程的网络流量和带宽使用情况

时间:2020-03-21 11:43:40  来源:igfitidea点击:

作为系统管理员,有时我们需要检查哪个进程占用了计算机上的高网络带宽。
如果没有为此目的而设计的任何标准工具,这并非易事。
在本文中,我们将研究一种这样的工具。
但是在查看该工具之前,我们将尝试使用其他方法来获取详细信息。

我要求我的读者分享可用于实现此目的的任何其他命令行技术/工具。

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将以发送形式对其进行排序。