原文: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帮助文档上,你可以找到它的描述

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
  • 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类似的工具,或者其他有意思的方法可以找出每个进程占用网络的情况。

查看Linux每个进程的流量和带宽的更多相关文章

  1. 查看linux连接进程占用的实时流量 -nethogs

    1.安装nethogs yum -y install nethogs 2.安装完成后,就可以执行命令 nethogs 3.实时查看进程流量,来个图显示 图中会显示当前的nginx产生的流量有多少都会清 ...

  2. 查看linux的进程到底用了多少内存

    1. 在linux下,查看一个运行中的程序, 占用了多少内存, 一般的命令有    (1). ps aux:      其中  VSZ(或VSS)列 表示,程序占用了多少虚拟内存.          ...

  3. 查看Linux某个进程打开的文件句柄(file descriptor)数量

    先找到进程的pid 然后: lsof -p [pid] | wc -l 或者 ls /proc/[pid]/fd | wc -l 查看系统总共使用中的文件描述符数量: lsof | wc -l ref ...

  4. 查看linux 下进程运行时间(转)

    原文地址:http://blog.csdn.net/tspangle/article/details/11731317 可通过ps 来查看,通过参数 -o 来查看 如: ps -eo pid,tty, ...

  5. 查看linux僵尸进程

    top ps -A -o stat,ppid,pid,cmd | grep -e '^[zZ]' kill -HUP 进程号

  6. linux工具类之流量监视

    iptraf        好用 yum install iptrafiptraf  is an ncurses-based IP LAN monitor that generates various ...

  7. nethogs 查看 Linux 进程的网络使用

    有时候我们客户会发现服务器或 VPS 网络慢,进一步发现大量带宽被占用,一些客户到这里为止就不知道怎么办了.有什么简单办法能找出哪个程序(或者进程)占用了带宽呢?Linux 监控流量的小工具不少,如 ...

  8. Linux下查看某一进程所占用内存的方法

    Linux下查看某一个进程所占用的内存,首先可以通过ps命令找到进程id,比如 ps -ef | grep kafka 可以看到kafka这个程序的进程id 可以看到是2913,现在可以使用如下命令查 ...

  9. linux查看主机端口进程命令

    1.查看主机信息 # more /etc/hosts # Do not remove the following line, or various programs # that require ne ...

随机推荐

  1. vector容器类型

    vector容器是一个模板类,可以存放任何类型的对象(但必须是同一类对象).vector对象可以在运行时高效地添加元素,并且vector中元素是连续存储的. vector的构造   函数原型: tem ...

  2. C语言指针系列 - 一级指针.一维数组,二级指针,二维数组,指针数组,数组指针,函数指针,指针函数

    1. 数组名 C语言中的数组名是一个特殊的存在, 从本质上来讲, 数组名是一个地址, 我们可以打印一个指针的值,和打印一个数组的值来观察出这个本质: int nArray[10] ={ 0 }; in ...

  3. 9.18 New Start

    好久没上cnblogs,今天提示我说园龄已经2年1个月了.今天就用一个日记的形式开始第一篇博客吧.我以后比较精髓的文章就放在cnblogs,csdn博客也继续会更新,不过也会慢慢提高文章质量. 今天是 ...

  4. UVA 12563 Jin Ge jin Qu [h] ao 劲歌金曲 (01背包)

    每首只能唱一次,而且中间不能不唱歌,所以先把状态赋值为-1,以区别合法状态和非法状态,在唱歌曲目最多的条件下,离开时间应该尽量晚. 状态定义f[i][j]考虑前i首歌唱歌时间为j的最大唱歌曲目 #in ...

  5. 1.JOIN和UNION区别

    1.JOIN和UNION区别join 是两张表做交连后里面条件相同的部分记录产生一个记录集,union是产生的两个记录集(字段要一样的)并在一起,成为一个新的记录集 . JOIN用于按照ON条件联接两 ...

  6. Luogu P4463 [国家集训队] calc

    WJMZBMR的题果然放在几年后看来仍然挺神,提出了一种独特的优化DP的方式 首先我们想一个暴力DP,先定下所有数的顺序(比如强制它递增),然后最后乘上\(n!\)种排列方式就是答案了 那么我们容易想 ...

  7. (三)VMware harbor使用http访问

    参考:https://www.cnblogs.com/biglittleant/p/7283738.html harbor使用http访问 如果使用http启动harbor需要在docker中配置-- ...

  8. WPF显示尺寸与设备无关问题

    WPF单位 WPF窗口以及其中的所有元素都是用与设备无关的单位进行度量.一个与设备无关的单位被定义为1/96英寸.WPF程序统一用下面一个公式来定义物理单位尺寸: [ 物理单位尺寸(像素)] = [ ...

  9. HTML5服务器发送事件(Server-Send Events)

    HTML5服务器发送事件是允许获得来自服务器的更新. server-sent事件-单向传递消息,表示网页自动获取来自服务器的更新. 其中有一个重要的对象,eventsource对象是用来接收服务器发送 ...

  10. 安装pycharm 2018.3 Professional Edition

    1.下载pycharm 2018.3 Professional 2.下载破解补丁,Gitee仓库 或 直接下载(Direct download link) ,并放到pycharm目录下的\bin目录( ...