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

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

參數 網絡 顯示 進程信息 流量閥 isp 工具 misc ret

因為公司會有人時不時去拉取備份日誌或者包等,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

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