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(user time):使用者程序執行消耗cpu時間;sy(system time):系統程序執行消耗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。
ps aux:
顯示其他使用者啟動的程序(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}"`
sleep 5
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 -ge 80 ]
then echo "CPU Warn"
ps aux | grep -v USER | sort -rn -k3 | head
fi
執行效果
2、利用free工具監控記憶體利用率,超過80報警並提取出佔用記憶體最高的前十程序。
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 -ge 80 ]
then echo "Memory Warn"
ps aux | grep -v USER | sort -rn -k4 | head
3、利用df命令監控磁碟利用率,超過80報警。
df :顯示磁碟分割槽上的可使用的磁碟空間。
-h 以更易讀的方式顯示;
-P 使用POSIX的輸出格式。
DEV=`df -hP | grep "^/dev/*" | cut -d" " -f1 | sort`
for I in $DEV
do dev=`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 -ge 80 ];then
echo "$mount Warn"
else echo "It"s OK"
done
CPU物理資訊
檢視物理cpu個數:
cat /proc/cpuinfo | grep "physical id" | uniq | wc -l
檢視cpu核數:
cat /proc/cpuinfo | grep "cpu cores" | uniq
檢視邏輯cpu個數:
cat /proc/cpuinfo | grep "processor" | wc -l
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(user time):使用者程序執行消耗cpu時間;sy(system time):系統程序執行消耗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。
ps aux:
顯示其他使用者啟動的程序(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}"`
sleep 5
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 -ge 80 ]
then echo "CPU Warn"
ps aux | grep -v USER | 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 -ge 80 ]
then echo "Memory Warn"
ps aux | grep -v USER | sort -rn -k4 | head
fi
執行效果
3、利用df命令監控磁碟利用率,超過80報警。
df :顯示磁碟分割槽上的可使用的磁碟空間。
-h 以更易讀的方式顯示;
-P 使用POSIX的輸出格式。
#!/bin/bash
#
DEV=`df -hP | grep "^/dev/*" | cut -d" " -f1 | sort`
for I in $DEV
do dev=`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 -ge 80 ];then
echo "$mount Warn"
else echo "It"s OK"
fi
done
執行效果
CPU物理資訊
檢視物理cpu個數:
cat /proc/cpuinfo | grep "physical id" | uniq | wc -l
檢視cpu核數:
cat /proc/cpuinfo | grep "cpu cores" | uniq
檢視邏輯cpu個數:
cat /proc/cpuinfo | grep "processor" | wc -l