1. 程式人生 > 實用技巧 >linux 實時監控網絡卡流量

linux 實時監控網絡卡流量

工作中,經常會遇到需要檢視伺服器的實時網絡卡流量,下面記錄幾種檢視實時流量的方法

命令sar -n DEV 1 2

sar命令包含在sysstat工具包中,可以基於網路介面統計流量資訊

  • 統計流量的命令
sar -n DEV 1 2
  • 命令說明
    -n 引數有6個不同的引數,DEV | EDEV | NFS | NFSD | SOCK | ALL
    • dev: 顯示網路介面資訊
    • EDEV:顯示關於網路錯誤的統計資料
    • NFS:統計活動的NFS客戶端的資訊
    • NFSD:統計NFS伺服器的資訊
    • SOCK:顯示套接字資訊
    • ALL:顯示所有5個開關

1 2 表示每一秒取一次值,總共取兩次值

  • 執行結果
root@ubuntu:~/ambari/ambari-admin# sar -n DEV 1 2
Linux 5.4.0-58-generic (ubuntu) 	12/30/2020 	_x86_64_	(2 CPU)

12:33:02 AM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
12:33:03 AM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
12:33:03 AM     ens33      2.00      3.00      0.12      0.50      0.00      0.00      0.00      0.00

12:33:03 AM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
12:33:04 AM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
12:33:04 AM     ens33      9.00     18.00      0.53      3.95      0.00      0.00      0.00      0.00

Average:        IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
Average:           lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:        ens33      5.50     10.50      0.32      2.23      0.00      0.00      0.00     

結果引數說明

  • IFACE:LAN介面
  • rxpck/s:每秒鐘接收的資料包
  • txpck/s:每秒鐘傳送的資料包
  • rxbyt/s:每秒鐘接收的位元組數
  • txbyt/s:每秒鐘傳送的位元組數
  • rxcmp/s:每秒鐘接收的壓縮資料包
  • txcmp/s:每秒鐘傳送的壓縮資料包
  • rxmcst/s:每秒鐘接收的多播資料包
  • rxerr/s:每秒鐘接收的壞資料包
  • txerr/s:每秒鐘傳送的壞資料包
  • coll/s:每秒衝突數
  • rxdrop/s:因為緩衝充滿,每秒鐘丟棄的已接收資料包數
  • txdrop/s:因為緩衝充滿,每秒鐘丟棄的已傳送資料包數
  • txcarr/s:傳送資料包時,每秒載波錯誤數
  • rxfram/s:每秒接收資料包的幀對齊錯誤數
  • rxfifo/s:接收的資料包每秒FIFO過速的錯誤數
  • txfifo/s:傳送的資料包每秒FIFO過速的錯誤數

命令cat /proc/net/dev

Linux 核心提供了一種通過 /proc 檔案系統,在執行時訪問核心內部資料結構、改變核心設定的機制。proc檔案系統是一個偽檔案系統,它只存在記憶體當中,而不佔用外存空間。它以檔案系統的方式為訪問系統核心資料的操作提供介面。使用者和應用程式可以通過proc得到系統的資訊,並可以改變核心的某些引數。由於系統的資訊,如程序,是動態改變的,所以使用者或應用程式讀取proc檔案時,proc檔案系統是動態從系統核心讀出所需資訊並提交的。/proc檔案系統中包含了很多目錄,其中/proc/net/dev 儲存了網路介面卡及統計資訊

  • 執行結果
root@ubuntu:~/ambari/ambari-admin# cat /proc/net/dev
Inter-|   Receive                                                |  Transmit
 face |bytes    packets errs drop fifo frame compressed multicast|bytes    packets errs drop fifo colls carrier compressed
    lo:  216018    2037    0    0    0     0          0         0   216018    2037    0    0    0     0       0          0
 ens33: 634272972  543746    0    0    0     0          0         0 36714114  359230    0    0    0     0       0          0

結果引數說明

  • face:LAN介面
  • bytes:收發的位元組數
  • packets:收發正確的包量
  • errs :收發錯誤的包量
  • drop:收發丟棄的包量

流量監控指令碼

#!/bin/bash

ethn=$1

while true
do
  RX_pre=$(cat /proc/net/dev | grep $ethn | sed 's/:/ /g' | awk '{print $2}')
  TX_pre=$(cat /proc/net/dev | grep $ethn | sed 's/:/ /g' | awk '{print $10}')
  sleep 1
  RX_next=$(cat /proc/net/dev | grep $ethn | sed 's/:/ /g' | awk '{print $2}')
  TX_next=$(cat /proc/net/dev | grep $ethn | sed 's/:/ /g' | awk '{print $10}')

  clear
  echo -e "\t RX `date +%k:%M:%S` TX"

  RX=$((${RX_next}-${RX_pre}))
  TX=$((${TX_next}-${TX_pre}))

  if [[ $RX -lt 1024 ]];then
    RX="${RX}B/s"
  elif [[ $RX -gt 1048576 ]];then
    RX=$(echo $RX | awk '{print $1/1048576 "MB/s"}')
  else
    RX=$(echo $RX | awk '{print $1/1024 "KB/s"}')
  fi

  if [[ $TX -lt 1024 ]];then
    TX="${TX}B/s"
  elif [[ $TX -gt 1048576 ]];then
    TX=$(echo $TX | awk '{print $1/1048576 "MB/s"}')
  else
    TX=$(echo $TX | awk '{print $1/1024 "KB/s"}')
  fi

  echo -e "$ethn \t $RX   $TX "

done

此指令碼採用第二種流量監控的方式來實現,可以自定義介面,可以根據流量大小自動顯示單位,預設採用間隔1s

用法:
將指令碼儲存為可執行指令碼檔案,比如叫netMonitor.sh
chmod +x ./netMonitor.sh 將檔案改成可執行指令碼
sudo ./netMonitor.sh ens33即可開始監看介面ens33流量,按ctrl+c退出

使用watch命令

使用watch命令,配合ifconfig、more /proc/net/dev、cat /proc/net/dev來實時監控。比如執行 watch -n 1 "ifconfig ens33"

Every 10.0s: ifconfig ens33                                                        ubuntu: Wed Dec 30 01:00:37 2020

ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.174.129  netmask 255.255.255.0  broadcast 192.168.174.255
        inet6 fe80::1dfc:fe80:fbb:2d8e  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:a0:1c:36  txqueuelen 1000  (Ethernet)
        RX packets 778847  bytes 966556456 (966.5 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 467526  bytes 45050559 (45.0 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0