原文:https://blog.csdn.net/monkeynote/article/details/45867803
作为一个系统管理员,有时候需要搞清楚一台机器上的哪个进程占用了较高的网络带宽。如果没有专用的工具,这并非易事。在这篇文章中,我们将要介绍这样的一款工具。在此之前呢,我们会尽量采用其它方法来获取某个进程占用多少带宽的相关信息。
我建议读者们也分享一些类似的命令行技巧或工具。
在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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
默认情况下,它会将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:~#
- 1
- 2
- 3
或者,你也可以使用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)
- 1
- 2
- 3
- 4
- 5
- 6
你还可以使用和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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
我们使用的-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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
jnettop 命令在你希望监测一个特定的source和destination之间的流量的时候很有用。它给出了我们需要找到的那个进程所使用的端口信息。
不过还有专门为此目的设计的更好的工具。这就是nethogs。它和根据网络用途将进程排好序的top 命令很类似,很容易安装和使用。
如果你是在ReadHat/Centos系统上运行,那么你需要安装EPEL yum repo来安装nethogs。对Ubuntu用户来说,只需要用apt-get搞定。
root@ubuntu2:~# apt-get install nethogs
- 1
- 2
从nethogs 的man帮助文档上,你可以找到它的描述
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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
在它的输出结果中,给出了如下信息。这些详细的信息足够我们找到每个进程使用网络的情况。
- PID(进程ID)
- 运行该进程的用户
- 命令行或程序
- 流量将要去往网络接口
- 发送的字节数
- 接收的字节数
如果观察上面的输出结果,默认是按照由高到低排序的。
和top 命令一样,你也可以指定一个refresh rate,这样它会在屏幕上刷新结果。使用-d 选项即可。
root@ubuntu2:~# nethogs -d 1
- 1
- 2
现在它就会每秒刷新一次了。
和top 命令一样,它也有几个交互式命令。这些命令可以将输出结果按照发送或者接受数据的大小排序,将输出的方式从kb 更改成mb 等等。在交互式控制台敲入 m,显示结果会在kb/s, kb, b, mb之间切换。按下r会按照接收流量排序。按下s会按照发送流量排序。
请多多分享一下和nethogs类似的工具,或者其他有意思的方法可以找出每个进程占用网络的情况。