很高興回答您的問題我是林創云小編,如果我的回答對你有幫助歡迎給我評論留言或者點贊加個關注!
1、利用vmstat工具監控CPU詳細信息,然后基于/proc/stat計算CPU利用率進行監控,超過80報警并提取出占用cpu最高的前十進程。
vmstat是Linux系統監控工具,使用vmstat命令可以得到關于進程、內存、內存分頁、堵塞IO、traps及CPU活動的信息。
r:運行隊列中的進程數;b:等待IO的進程數。
swpd:已用虛擬內存大小(k);free:空閑內存大小;buff:已用緩沖大小;cache:已用緩存大小。
si:每秒從交換區寫入內存的大小(kb/s);so:每秒從內存寫入交換分區的大小。
bi:每秒讀取的塊數;bo每秒寫入的塊數。
in:每秒中斷數,包括時鐘中斷;cs:每秒上下文切換數。
us(usertime):用戶進程執行消耗cpu時間;sy(systemtime):系統進程執行消耗cpu時間;id:空閑時間(包括IO等待時間);wa:等待IO時間。
/proc/stat:
這個文件包含了所有CPU活動的信息,該文件中的所有值都是從系統啟動開始累計到當前時刻。可以利用其中信息計算cpu的利用率。
每行每個參數的意思為(以第一行為例,單位:jiffies,1jiffies=0.01秒):
user(62124):從系統啟動開始累計到當前時刻,用戶態的CPU時間,不包含nice值為負進程。
nice(11):從系統啟動開始累計到當前時刻。
system(47890):從系統啟動開始累計到當前時刻,nice值為負的進程所占用的CPU時間。
idle(8715270):從系統啟動開始累計到當前時刻,除硬盤IO等待時間以外其它等待時間。
iowait(84729):從系統啟動開始累計到當前時刻,硬盤IO等待時間。
irq(0):從系統啟動開始累計到當前時刻,硬中斷時間。
softirq(1483):從系統啟動開始累計到當前時刻,軟中斷時間。
CPU時間=user+nice+system+idle+iowait+irq+softirq。
CPU利用率=(idle2-idle1)/(cpu2-cpu1)*100。
psaux:
顯示其他用戶啟動的進程(a)
查看系統中屬于自己的進程(x)
啟動這個進程的用戶和啟動時間(u)
代碼如下:
#!/bin/bash
#
CPU_us=$(vmstat|awk'{print$13}'|sed-n'$p')
CPU_sy=$(vmstat|awk'{print$14}'|sed-n'$p')
CPU_id=$(vmstat|awk'{print$15}'|sed-n'$p')
CPU_wa=$(vmstat|awk'{print$16}'|sed-n'$p')
CPU_st=$(vmstat|awk'{print$17}'|sed-n'$p')
CPU1=`cat/proc/stat|grep'cpu'|awk'{print$2""$3""$4""$5""$6""$7""$8}'`
sleep5
CPU2=`cat/proc/stat|grep'cpu'|awk'{print$2""$3""$4""$5""$6""$7""$8}'`
IDLE1=`echo$CPU1|awk'{print$4}'`
IDLE2=`echo$CPU2|awk'{print$4}'`
CPU1_TOTAL=`echo$CPU1|awk'{print$1+$2+$3+$4+$5+$6+$7}'`
CPU2_TOTAL=`echo$CPU2|awk'{print$1+$2+$3+$4+$5+$6+$7}'`
IDLE=`echo"$IDLE2-$IDLE1"|bc`
CPU_TOTAL=`echo"$CPU2_TOTAL-$CPU1_TOTAL"|bc`
#echo-e"IDLE2:$IDLE2\nIDLE1:$IDLE1\nCPU2:$CPU2_TOTAL\nCPU1:$CPU1_TOTAL"
#echo-e"IDLE:$IDLE\nCPU:$CPU_TOTAL"
RATE=`echo"scale=4;($CPU_TOTAL-$IDLE)/$CPU_TOTAL*100"|bc|awk'{printf"%.2f",$1}'`
echo-e"us=$CPU_us\tsy=$CPU_sy\tid=$CPU_id\twa=$CPU_wa\tst=$CPU_st"
echo"CPU_RATE:${RATE}%"
CPU_RATE=`echo$RATE|cut-d.-f1`
#echo"CPU_RATE:$CPU_RATE"
if[$CPU_RATE-ge80]
thenecho"CPUWarn"
psaux|grep-vUSER|sort-rn-k3|head
fi
執行效果
2、利用free工具監控內存利用率,超過80報警并提取出占用內存最高的前十進程。
代碼如下:
#!/bin/bash
#
total=$(free-m|sed-n'2p'|awk'{print$2}')
used=$(free-m|sed-n'2p'|awk'{print$3}')
free=$(free-m|sed-n'2p'|awk'{print$4}')
shared=$(free-m|sed-n'2p'|awk'{print$5}')
buff=$(free-m|sed-n'2p'|awk'{print$6}')
cached=$(free-m|sed-n'2p'|awk'{print$7}')
rate=`echo"scale=2;$used/$total"|bc|awk-F.'{print$2}'`
echo-e"total\tused\tfree\tshared\tbuffer\tavailable"
echo-e"${total}M\t${used}M\t${free}M\t${shared}M\t${buff}M\t${cached}M\nrate:${rate}%"
if[$rate-ge80]
thenecho"MemoryWarn"
psaux|grep-vUSER|sort-rn-k4|head
fi
執行效果
3、利用df命令監控磁盤利用率,超過80報警。
df:顯示磁盤分區上的可使用的磁盤空間。
-h以更易讀的方式顯示;
-P使用POSIX的輸出格式。
#!/bin/bash
#
DEV=`df-hP|grep'^/dev/*'|cut-d''-f1|sort`
forIin$DEV
dodev=`df-Ph|grep$I|awk'{print$1}'`
size=`df-Ph|grep$I|awk'{print$2}'`
used=`df-Ph|grep$I|awk'{print$3}'`
free=`df-Ph|grep$I|awk'{print$4}'`
rate=`df-Ph|grep$I|awk'{print$5}'`
mount=`df-Ph|grep$I|awk'{print$6}'`
echo-e"$I:\tsize:$size\tused:$used\tfree:$free\trate:$rate\tmount:$mount"
F=`echo$rate|awk-F%'{print$1}'`
if[$F-ge80];then
echo"$mountWarn"
elseecho"It'sOK"
fi
done
執行效果
CPU物理信息
查看物理cpu個數:
cat/proc/cpuinfo|grep"physicalid"|uniq|wc-l
查看cpu核數:
cat/proc/cpuinfo|grep"cpucores"|uniq
查看邏輯cpu個數:
cat/proc/cpuinfo|grep"processor"|wc-l