shell 監控cpu,memory,load average,記錄到log,當負載壓力時,發電郵通知管理者。
平均負載是指系統的運作隊列的平均使用率,也可以認為是可運作程序的平均數。
一般的程序需要消耗CPU、記憶體、磁盤I/O、網絡I/O等資源,在這種情況下,平均負載就不是單獨指的CPU使用情況。即記憶體、磁盤、網絡等因素也可以影響系統的平均負載值。
在單核處理器中,平均負載值為1或者小于1的時候,系統處理程序會非常輕松,即負載很低。當達到3的時候,就會顯得很忙,達到5或者8的時候就不能很好的處理程序了(其中5和8目前還是個争議的門檻值,為了保守起見,建議選擇低的)。
舉例說明:
比如我的伺服器是兩顆CPU,每顆CPU有6個核,相當于12核的處理器。如果負載小于12,說明伺服器使用率較低。如果負載大于12小于36,說明伺服器使用率比較高,這個時候就應該考慮優化業務或者更換更快的CPU。如果負載大于36小于60,甚至超過60,則說明該伺服器很危險,随時可能發生問題。經過上面的分析,我們用以下指令擷取系統的平均負載值。
# top
# uptime
# w
平均負載值部分如:load average: 0.08, 0.03, 0.00.這些數值是指系統在最後1/5/15分鐘的平均負載.那麼我們判斷負載過高,要以哪個值為準呢?根據經驗:我們應該把重點放在5/15分鐘的平均負載,因為1分鐘的平均負載太頻繁,一瞬間的高并發就會導緻該值的大幅度改變。其中top的第一行與uptime的結果相同
uptime
top
[[email protected] ~]# uptime
20:15:58 up 7 min, 1 user, load average: 0.00, 0.10, 0.08
其中
20:15:58 up 系統啟動時間
7 min 系統線上運作時間
load average 分别記錄一分鐘、五分鐘、十五分鐘的系統平均負載
主要是判斷CPU的使用情況,現在的CPU都是多核心、多線程的模式。是以最終取決于總線程數。比如我們公司的CPU,是2個單元,每個單元是4核8線程。那麼負載因子16的時候才算100%。
檢視CPU資訊使用
cat /proc/cpuinfo
如果隻想得到線程數,則
grep 'model name' /proc/cpuinfo | wc -l
原理:
1.擷取cpu,memory,load average的數值
2.判斷數值是否超過自定義的範圍,例如(CPU>90%,Memory<10%,load average>2)
3.如數值超過範圍,發送電郵通知管理者。發送有時間間隔,每小時隻會發送一次。
4.将數值寫入log。
5.設定crontab 每30秒運作一次。
ServerMonitor.sh
[plain] view plain copy
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5Gcu82Yp9VRE90Qvw1c0V2czF2LcRXZu5ibkN3YuUGZvN2Lc9CX6MHc0RHaiojIsJye.png)
- #!/bin/bash
- # 系統監控,記錄cpu、memory、load average,當超過規定數值時發電郵通知管理者
- # *** config start ***
- # 目前目錄路徑
- ROOT=$(cd "$(dirname "$0")"; pwd)
- # 目前伺服器名
- HOST=$(hostname)
- # log 檔案路徑
- CPU_LOG="${ROOT}/logs/cpu.log"
- MEM_LOG="${ROOT}/logs/mem.log"
- LOAD_LOG="${ROOT}/logs/load.log"
- # 通知電郵清單
- NOTICE_EMAIL='[email protected]'
- # cpu,memory,load average 記錄上一次發送通知電郵時間
- CPU_REMARK='/tmp/servermonitor_cpu.remark'
- MEM_REMARK='/tmp/servermonitor_mem.remark'
- LOAD_REMARK='/tmp/servermonitor_loadaverage.remark'
- # 發通知電郵間隔時間
- REMARK_EXPIRE=3600
- NOW=$(date +%s)
- # *** config end ***
- # *** function start ***
- # 擷取CPU占用
- function GetCpu() {
- cpufree=$(vmstat 1 5 |sed -n '3,$p' |awk '{x = x + $15} END {print x/5}' |awk -F. '{print $1}')
- cpuused=$((100 - $cpufree))
- echo $cpuused
- local remark
- remark=$(GetRemark ${CPU_REMARK})
- # 檢查CPU占用是否超過90%
- if [ "$remark" = "" ] && [ "$cpuused" -gt 90 ]; then
- echo "Subject: ${HOST} CPU uses more than 90% $(date +%Y-%m-%d' '%H:%M:%S)" | sendmail ${NOTICE_EMAIL}
- echo "$(date +%s)" > "$CPU_REMARK"
- fi
- }
- # 擷取記憶體使用情況
- function GetMem() {
- mem=$(free -m | sed -n '3,3p')
- used=$(echo $mem | awk -F ' ' '{print $3}')
- free=$(echo $mem | awk -F ' ' '{print $4}')
- total=$(($used + $free))
- limit=$(($total/10))
- echo "${total} ${used} ${free}"
- local remark
- remark=$(GetRemark ${MEM_REMARK})
- # 檢查記憶體占用是否超過90%
- if [ "$remark" = "" ] && [ "$limit" -gt "$free" ]; then
- echo "Subject: ${HOST} Memory uses more than 90% $(date +%Y-%m-%d' '%H:%M:%S)" | sendmail ${NOTICE_EMAIL}
- echo "$(date +%s)" > "$MEM_REMARK"
- fi
- }
- # 擷取load average
- function GetLoad() {
- load=$(uptime | awk -F 'load average: ' '{print $2}')
- m1=$(echo $load | awk -F ', ' '{print $1}')
- m5=$(echo $load | awk -F ', ' '{print $2}')
- m15=$(echo $load | awk -F ', ' '{print $3}')
- echo "${m1} ${m5} ${m15}"
- m1u=$(echo $m1 | awk -F '.' '{print $1}')
- local remark
- remark=$(GetRemark ${LOAD_REMARK})
- # 檢查是否負載是否有壓力
- if [ "$remark" = "" ] && [ "$m1u" -gt "2" ]; then
- echo "Subject: ${HOST} Load Average more than 2 $(date +%Y-%m-%d' '%H:%M:%S)" | sendmail ${NOTICE_EMAIL}
- echo "$(date +%s)" > "$LOAD_REMARK"
- fi
- }
- # 擷取上一次發送電郵時間
- function GetRemark() {
- local remark
- if [ -f "$1" ] && [ -s "$1" ]; then
- remark=$(cat $1)
- if [ $(( $NOW - $remark )) -gt "$REMARK_EXPIRE" ]; then
- rm -f $1
- remark=""
- fi
- else
- remark=""
- fi
- echo $remark
- }
- # *** function end ***
- cpuinfo=$(GetCpu)
- meminfo=$(GetMem)
- loadinfo=$(GetLoad)
- echo "cpu: ${cpuinfo}" >> "${CPU_LOG}"
- echo "mem: ${meminfo}" >> "${MEM_LOG}"
- echo "load: ${loadinfo}" >> "${LOAD_LOG}"
- exit 0
crontab
[plain] view plain copy
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5Gcu82Yp9VRE90Qvw1c0V2czF2LcRXZu5ibkN3YuUGZvN2Lc9CX6MHc0RHaiojIsJye.png)
- * * * * * /home/xxxx/ServerMonitor.sh
- * * * * * sleep 30; /home/xxxx/ServerMonitor.sh