天天看点

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  

继续阅读