天天看點

linux load 監控,負載監控 ,shell 監控cpu,memory,load average,記錄到log

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  

linux load 監控,負載監控 ,shell 監控cpu,memory,load average,記錄到log
linux load 監控,負載監控 ,shell 監控cpu,memory,load average,記錄到log
  1. #!/bin/bash  
  2. # 系統監控,記錄cpu、memory、load average,當超過規定數值時發電郵通知管理者  
  3. # *** config start ***  
  4. # 目前目錄路徑  
  5. ROOT=$(cd "$(dirname "$0")"; pwd)  
  6. # 目前伺服器名  
  7. HOST=$(hostname)  
  8. # log 檔案路徑  
  9. CPU_LOG="${ROOT}/logs/cpu.log"  
  10. MEM_LOG="${ROOT}/logs/mem.log"  
  11. LOAD_LOG="${ROOT}/logs/load.log"  
  12. # 通知電郵清單  
  13. NOTICE_EMAIL='[email protected]'  
  14. # cpu,memory,load average 記錄上一次發送通知電郵時間  
  15. CPU_REMARK='/tmp/servermonitor_cpu.remark'  
  16. MEM_REMARK='/tmp/servermonitor_mem.remark'  
  17. LOAD_REMARK='/tmp/servermonitor_loadaverage.remark'  
  18. # 發通知電郵間隔時間  
  19. REMARK_EXPIRE=3600  
  20. NOW=$(date +%s)  
  21. # *** config end ***  
  22. # *** function start ***  
  23. # 擷取CPU占用  
  24. function GetCpu() {  
  25.     cpufree=$(vmstat 1 5 |sed -n '3,$p' |awk '{x = x + $15} END {print x/5}' |awk -F. '{print $1}')  
  26.     cpuused=$((100 - $cpufree))  
  27.     echo $cpuused  
  28.     local remark  
  29.     remark=$(GetRemark ${CPU_REMARK})  
  30.     # 檢查CPU占用是否超過90%  
  31.     if [ "$remark" = "" ] && [ "$cpuused" -gt 90 ]; then  
  32.         echo "Subject: ${HOST} CPU uses more than 90% $(date +%Y-%m-%d' '%H:%M:%S)" | sendmail ${NOTICE_EMAIL}  
  33.         echo "$(date +%s)" > "$CPU_REMARK"  
  34.     fi  
  35. }  
  36. # 擷取記憶體使用情況  
  37. function GetMem() {  
  38.     mem=$(free -m | sed -n '3,3p')  
  39.     used=$(echo $mem | awk -F ' ' '{print $3}')  
  40.     free=$(echo $mem | awk -F ' ' '{print $4}')  
  41.     total=$(($used + $free))  
  42.     limit=$(($total/10))  
  43.     echo "${total} ${used} ${free}"  
  44.     local remark  
  45.     remark=$(GetRemark ${MEM_REMARK})  
  46.     # 檢查記憶體占用是否超過90%  
  47.     if [ "$remark" = "" ] && [ "$limit" -gt "$free" ]; then  
  48.         echo "Subject: ${HOST} Memory uses more than 90% $(date +%Y-%m-%d' '%H:%M:%S)" | sendmail ${NOTICE_EMAIL}  
  49.         echo "$(date +%s)" > "$MEM_REMARK"  
  50.     fi  
  51. }  
  52. # 擷取load average  
  53. function GetLoad() {  
  54.     load=$(uptime | awk -F 'load average: ' '{print $2}')  
  55.     m1=$(echo $load | awk -F ', ' '{print $1}')  
  56.     m5=$(echo $load | awk -F ', ' '{print $2}')  
  57.     m15=$(echo $load | awk -F ', ' '{print $3}')  
  58.     echo "${m1} ${m5} ${m15}"  
  59.     m1u=$(echo $m1 | awk -F '.' '{print $1}')  
  60.     local remark  
  61.     remark=$(GetRemark ${LOAD_REMARK})  
  62.     # 檢查是否負載是否有壓力  
  63.     if [ "$remark" = "" ] && [ "$m1u" -gt "2" ]; then  
  64.         echo "Subject: ${HOST} Load Average more than 2 $(date +%Y-%m-%d' '%H:%M:%S)" | sendmail ${NOTICE_EMAIL}  
  65.         echo "$(date +%s)" > "$LOAD_REMARK"  
  66.     fi  
  67. }  
  68. # 擷取上一次發送電郵時間  
  69. function GetRemark() {  
  70.     local remark  
  71.     if [ -f "$1" ] && [ -s "$1" ]; then  
  72.         remark=$(cat $1)  
  73.         if [ $(( $NOW - $remark )) -gt "$REMARK_EXPIRE" ]; then  
  74.             rm -f $1  
  75.             remark=""  
  76.         fi  
  77.     else  
  78.         remark=""  
  79.     fi  
  80.     echo $remark  
  81. }  
  82. # *** function end ***  
  83. cpuinfo=$(GetCpu)  
  84. meminfo=$(GetMem)  
  85. loadinfo=$(GetLoad)  
  86. echo "cpu: ${cpuinfo}" >> "${CPU_LOG}"  
  87. echo "mem: ${meminfo}" >> "${MEM_LOG}"  
  88. echo "load: ${loadinfo}" >> "${LOAD_LOG}"  
  89. exit 0  

crontab

[plain]  view plain  copy  

linux load 監控,負載監控 ,shell 監控cpu,memory,load average,記錄到log
linux load 監控,負載監控 ,shell 監控cpu,memory,load average,記錄到log
  1. * * * * * /home/xxxx/ServerMonitor.sh  
  2. * * * * * sleep 30; /home/xxxx/ServerMonitor.sh  

繼續閱讀