查看Linux每個進程的流量和帶寬


原文: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類似的工具,或者其他有意思的方法可以找出每個進程占用網絡的情況。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM