1. 程式人生 > >nethogs結合zabbix 監控每個程序流量使用情況

nethogs結合zabbix 監控每個程序流量使用情況

因為公司會有人時不時去拉取備份日誌或者包等,zabbix和阿里雲都會出現流量告警,但具體是哪個使用者或者哪個程序使用的流量,不知道,告警出現後,登入伺服器檢視,流量已經下來了,檢視起來比較繁瑣,所以直接弄一個程序流量告警,超過閥值,把程序號,使用者,進出流量大小都輸出出來

NetHogs是一款開源、免費的,終端下的網路流量監控工具,它可監控Linux的程序或應用程式的網路流量。NetHogs只能實時監控程序的網路頻寬佔用情況。NetHogs支援IPv4和IPv6協議,支援本地網絡卡以及PPP連結。

1.安裝nethogs
我是 centos6,安裝epel源使用一下版本
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm


centos7的話,使用
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

2.使用nethogs
NetHogs提供互動式控制指令:
m : Cycle between display modes (kb/s, kb, b, mb) 切換網速顯示單位
r : Sort by received. 按接收流量排序
s : Sort by sent. 按傳送流量排序
q : Quit and return to the shell prompt. 退出NetHogs命令工具

NetHogs 命令列引數
常用的引數:
-d delay for refresh rate. 資料重新整理時間 如nethogs -d 1 就是每秒重新整理一次
-h display available commands usage. 顯示命名幫助、使用資訊
-p sniff in promiscious mode (not recommended).
-t (追蹤模式)在控制檯定時重新整理各程序的收發頻寬,使用管道命令>即可實現輸出重定向
-V prints Version info.
-c 刷5次結束

#關鍵命令,使用以下命令進行重定向
nethogs -c 5 -d 2 -t
這裡-c刷5次,是因為,前面一次會逐漸把有流量的程序打印出來,但前面幾次的時候,會獲取不到全部,所有我列印了5次,時間間隔2秒,差不多能把所有程序流量打印出來了,若還覺得少了,可以增大時間

#編寫一下兩個指令碼來實現
#第一個: 這個指令碼,實現執行兩次,時間間隔是20秒,執行命令有10秒(輸出5次,每次2秒),則輸出兩次剛好1分鐘,然後加入計劃任務,1分鐘執行一次這個指令碼,當然,這裡的頻率,可以自行調整

!/bin/bash
count=0
while [ $count -lt 2 ]
do
    count=$(($count+1))
    /usr/sbin/nethogs -t -d 2 -c 5 > /tmp/flow_nethogs.tmp
    if [[ $count == 2 ]];then
        exit
    else
        sleep 20
    fi
done

#第二個:使用zabbix來讀取這個日誌檔案,每分鐘執行兩次,或者更多,判斷最後一次(也就是第5次,獲取最完整的一次) 流量大小來進行輸出

#!/usr/bin/python
#coding=utf-8
#讀取 nethogs.logs日誌,獲取流量過大的程序

#日誌路徑
log_path="/tmp/flow_nethogs.tmp"
file = open(log_path,"r")
message = file.read()
file.close()
#設定流量閥值大小,大於閥值則輸出內容
max_flow = 2048
#以Refreshing: 為分隔符,得到陣列
mes_sp = message.split("Refreshing:")
#得到陣列的最後一個元素,去掉空行
resu_str = mes_sp[len(mes_sp) - 1].strip("\n")
#以換行符分割資料
resu_li = resu_str.split("\n")
for proc in resu_li:
    proc_li = proc.split("\t")
    if len(proc_li) == 3:
        proc_name = proc_li[0]
        proc_send = proc_li[1]
        proc_rec = proc_li[2]
        if float(proc_send) > max_flow or float(proc_rec) > max_flow:
            print "程序:" + proc_name + ", 傳送: " + proc_send + " KB/sec, " + "接收: " + proc_rec + " KB/sec"

超過閥值,則輸出程序資訊,沒有超出,則不會輸出任何資料,所以在zabbix裡面,告警設定成 值不為空,則告警

備註:nethogs針對伺服器業務程序較少的一種 不會佔用多少資源,若過多,會佔用資源,可以先根據自己的環境來測測看,nethogs方法比較簡單,可以直接獲取程序資訊等,還有一個工具是iftop,這個工具就沒這麼耗費資源了,但程序資訊等,需要自己寫命令查詢,後面繼續更新iftop結合zabbix來監控!!!o( ̄︶ ̄)o