查看linux每个进程的流量和带宽

原文 http://www.slashroot.in/find-network-traffic-and-bandwidth-usage-process-linux,译者FJ. 请联系fj_wind(at)126.com 作为一个系统管理员,有时候需要搞清楚一台机器上的哪个进程占用了较高的网络带宽。如果没有专用的工具,这并非易事。在这篇文章中,

原文 http://www.slashroot.in/find-network-traffic-and-bandwidth-usage-process-linux,译者FJ. 请联系fj_wind(at)126.com

作为一个系统管理员,有时候需要搞清楚一台机器上的哪个进程占用了较高的网络带宽。如果没有专用的工具,这并非易事。在这篇文章中,我们将要介绍这样的一款工具。在此之前呢,我们会尽量采用其它方法来获取某个进程占用多少带宽的相关信息。

我建议读者们也分享一些类似的命令行技巧或工具。

在Linux桌面上有许多的图形用户界面工具使用一些基于GUI的小程序来获取这类信息,但是大多数都只给出了整个系统所消耗的总带宽(没有显示单独某个进程的情况)。生产环境中的服务器不可能有基于GUI工具来获取这些信息,因此我们只会讨论一些命令行工具或者技巧。

第一种方法是使用iptraf 或 iftop 来确定发送流量最大的端口,然后从列表中找出哪个进程运行在该端口之上。我多次采用过这种方法,均达到了目的。

如果你刚听说 iftop 和 iptraf,我推荐你阅读下面这篇文章,解释了这两种工具如何使用。

阅读:Iptraf and Iftop command usage and examples

首先使用根据你使用的发行版选择YUM 或者apt-get 安装好iptraf 或 iptop。然后使用iptraf 命令找出流量使用情况和接口、端口信息。iptraf 会给出如下所示的输出。结果给出了两样东西,源地址和网络端口号。在第一次出现的welcome屏幕上按下Enter,就可以看见具体的选项了。一旦你选择了在所有接口之上的“IP traffic monitor”选项,你会看到如下的输出结果。

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

默认情况下,它会将connections按照每种usage排好序。我这儿可以很容易的找出哪个进程在使用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)
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。在ubuntu上可以用apt-get install 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 命令在你希望监测一个特定的source和destination之间的流量的时候很有用。它给出了我们需要找到的那个进程所使用的端口信息。

不过还有专门为此目的设计的更好的工具。这就是nethogs。它和根据网络用途将进程排好序的top 命令很类似,很容易安装和使用。
如果你是在ReadHat/Centos系统上运行,那么你需要安装EPEL yum repo来安装nethogs。对Ubuntu用户来说,只需要用apt-get搞定。

root@ubuntu2:~# apt-get install nethogs

从nethogs 的man帮助文档上,你可以找到它的描述

DESCRIPTION

NetHogs is a small ‘net top’ tool. Instead of breaking the traffic down
per protocol or per subnet, like most such tools do, it groups band‐
width by process - and does not rely on a special kernel module to be
loaded. So if there’s suddenly a lot of network traffic, you can fire
up NetHogs and immediately see which PID is causing this, and if it’s
some kind of spinning process, kill it.

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)
  • 运行该进程的用户
  • 命令行或程序
  • 流量将要去往网络接口
  • 发送的字节数
  • 接收的字节数

如果观察上面的输出结果,默认是按照由高到低排序的。

和top 命令一样,你也可以指定一个refresh rate,这样它会在屏幕上刷新结果。使用-d 选项即可。

root@ubuntu2:~# nethogs -d 1

现在它就会每秒刷新一次了。

和top 命令一样,它也有几个交互式命令。这些命令可以将输出结果按照发送或者接受数据的大小排序,将输出的方式从kb 更改成mb 等等。在交互式控制台敲入 m,显示结果会在kb/s, kb, b, mb之间切换。按下r会按照接收流量排序。按下s会按照发送流量排序。

请多多分享一下和nethogs类似的工具,或者其他有意思的方法可以找出每个进程占用网络的情况。

知秋君
上一篇 2024-08-28 20:02
下一篇 2024-08-28 19:36

相关推荐