最近客戶的網(wǎng)站出現(xiàn)卡慢現(xiàn)象,通過檢查,出問題是原因是因?yàn)閹挸跃o,所以讓客戶將服務(wù)器帶寬從原本的2m增加到4m的帶寬,網(wǎng)站速度一下就提升了。那么如何監(jiān)控網(wǎng)卡流量情況,linux有許多命令可以查看。比如iftop,sar等等。
這里,我想寫一個監(jiān)控網(wǎng)卡流量情況的腳本。統(tǒng)計每一分鐘的網(wǎng)卡流量情況,輸入到指定文件中。可以使用sar -n DEV 1 59查看一分鐘內(nèi)網(wǎng)卡平均流量。
此腳本的核心是獲取1分鐘內(nèi)網(wǎng)卡的平均流量。我們來看看sar這個命令會輸出哪些信息吧。
#?sar?-n?DEV?1?59 Linux?4.18.0-80.11.2.el8_0.x86_64?(30gk.com)??09/20/2020??_x86_64_?(4?CPU) 11:25:25?AM?????IFACE???rxpck/s???txpck/s????rxkB/s????txkB/s???rxcmp/s???txcmp/s??rxmcst/s???%ifutil 11:25:26?AM??????eth0?????16.00?????11.00??????1.26??????1.38??????0.00??????0.00??????0.00??????0.00 11:25:26?AM????????lo?????12.00?????12.00??????4.77??????4.77??????0.00??????0.00??????0.00??????0.00 11:25:26?AM?????IFACE???rxpck/s???txpck/s????rxkB/s????txkB/s???rxcmp/s???txcmp/s??rxmcst/s???%ifutil 11:25:27?AM??????eth0?????18.00?????23.00??????2.98?????28.85??????0.00??????0.00??????0.00??????0.00 11:25:27?AM????????lo?????12.00?????12.00??????4.77??????4.77??????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:?????????eth0??????8.56?????12.59??????1.07??????7.05??????0.00??????0.00??????0.00??????0.00 Average:???????????lo?????12.20?????12.20??????4.79??????4.79??????0.00??????0.00??????0.00??????0.00
我們需要的信息是AVERAGE: eth0這行。rxkb/s表示網(wǎng)卡每秒接受的字節(jié)數(shù),rxkb/s表示每秒發(fā)送的字節(jié)數(shù),他們的單位都是kb。我們待會要將它轉(zhuǎn)換為kbit/s,因?yàn)槿粘A?xí)慣用kbit/s表示網(wǎng)絡(luò)帶寬使用情況。
然后,我們需要過濾其他不需要的行,使用grep命令可以輕松辦到。首先grep過濾掉所有不含Average的行,然后過濾不含eth0的行。
#?sar?-n?DEV?1?59?|?grep?-i?average?|?grep?eth0 Average:?????????eth0??????7.44??????7.00??????0.83??????6.72??????0.00??????0.00??????0.00??????0.00
然后,使用awk命令過濾掉不需要的列,我們只需要第5列以及第6列信息;
#?sar?-n?DEV?1?4?|?grep?-i?average?|?grep?eth0?|?awk?'{print?$5*8"t"$6*8}' 28.32?182.96
至此,我們已經(jīng)獲取到了1分鐘內(nèi)eth0網(wǎng)卡的平均輸入輸出流量了,該腳本的核心問題解決了。下面貼出完整的代碼:
#!/bin/bash #?監(jiān)控網(wǎng)卡流量,并輸出到日志文件中 export?PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:~/bin export?LANG=en #?日志存放目錄 PATH_DIR=/root/netdatas/`date?+%F` #?日志文件名稱 FILE_NAME=`date?+%F`.log #?監(jiān)控的網(wǎng)卡名稱 NET_NAME=eth0 ? [?-d?PATH_DIR?]?||?mkdir?-p?$PATH_DIR ? while?[?1?];do ????date?+"%H:%M"?>>?$PATH_DIR/$FILE_NAME ? ????netinfo=$(sar?-n?DEV?1?59?|?grep?-i?average?|?grep?$NET_NAME?|? ????????awk?'{print?$5*8":"$6*8}'?) ????echo??"$NET_NAME?input:$(echo?$netinfo?|?cut?-d:?-f1)kbit/s"?>>?$PATH_DIR/$FILE_NAME ????echo?"$NET_NAME?output:$(echo?$netinfo?|?cut?-d:?-f2)kbit/s"?>>?$PATH_DIR/$FILE_NAME ????echo?'#########################'?>>?$PATH_DIR/$FILE_NAME done
該腳本的編寫非常的簡單,搞清楚了如何獲取1分鐘內(nèi)網(wǎng)卡流量就搞定了90%了。不過有點(diǎn)要注意,我服務(wù)器上的網(wǎng)卡名稱為eth0,你的可能名稱和我不一樣,所以如果你要使用該腳本,需要將所有的eth0改為你服務(wù)器上的網(wǎng)卡名。當(dāng)然,可以將網(wǎng)卡名稱當(dāng)做參數(shù)來傳遞給腳本,這里為了圖方便就沒有這么做了(主要原因是不想對輸入的網(wǎng)卡名做校驗(yàn))。
來驗(yàn)證下此腳本是否能正常運(yùn)行。執(zhí)行該腳本后,查看下日志里的內(nèi)容如下:
12:15 eth0?input:16.64kbit/s eth0?output:16.72kbit/s ######################### 12:16 eth0?input:16.72kbit/s eth0?output:17.12kbit/s ######################### 12:17 eth0?input:17.92kbit/s eth0?output:17.6kbit/s
可以看到,此腳本能正常運(yùn)行。