CPU飆升?教你1分鐘抓取佔用系統資源的程式

java06051515發表於2020-03-05

CPU和記憶體資源動不動就飆升?


導致部署在上面的網站訪問特別慢,透過監控只能看到資源的使用率,並不能監控到哪些程式在佔用cpu和記憶體資源。

透過統計訪問量和分析日誌發現並不足以導致資源飆升?

我們的運維小哥哥整理了一個shell指令碼用來收集哪些程式在作怪

1、話不多直接放出指令碼內容,由於磁碟IO也有可能導致網站訪問慢和導致資源瓶頸,所以一併抓取出

#!/bin/bash
#獲取佔用IO的程式資訊
function io_monitor(){
  out=`pidstat -d 1 1 | grep Average | sed -n '2,$p' | sed ':a;N;$!ba;s/\n/,/g'`
  declare -A io_map
  i=1
  total_read=0
  total_write=0
  while ((1==1)); do
      if [ "$out" == "" ]; then
          break;
      fi
      tmp=`echo $out | cut -d "," -f $i`
      if [ "$tmp" == "" ]; then
          break;
else
          read_val=`echo $tmp | awk '{print $4}' | cut -d"." -f 1`
          write_val=`echo $tmp | awk '{print $5}' | cut -d"." -f 1`
          cmd_val=`echo $tmp | awk '{print $8}'`
          total_read=$(($total_read+$read_val))
          total_write=$(($total_write+$write_val))
          map_val=$read_val","$write_val
          io_map[$cmd_val]=$map_val
          ((i++))
      fi
      if [[ $out =~ .*,.* ]]; then
          continue
      else
          break
      fi
  done
  if [ $total_read -gt 10240 ] || [ $total_write -gt 10240 ];then
      echo "--------------$(date +"%m-%d %H:%M:%S")--------------------" >> io.log
      for key in ${!io_map[*]};do
          val=${io_map[$key]}
          val_arr=(${val//,/ })
          if [ ${val_arr[0]} -gt 0 ] || [ ${val_arr[1]} -gt 0 ];then
              echo "task_name:$key   IO_read(kB/s):${val_arr[0]}     IO_write(kB/s):${val_arr[1]}" >> io.log
          fi
      done
  fi
}
#獲取佔用CPU和記憶體的資訊
function cpu_Mem_monitor(){
  cpu_us=`sar -u 1 1 | sed -n '$p' | awk '{print $3}' | cut -d"." -f 1`
  cpu_sy=`sar -u 1 1 | sed -n '$p' | awk '{print $5}' | cut -d"." -f 1`
  mem_total=$(free -m | grep Mem | awk '{print $2}')
  mem_used=$(free -m | grep Mem | awk '{print $3}')
  mem_rate=`echo "scale=2;$mem_used/$mem_total" | bc | awk -F. '{print $2}'`
  sum_cpu=$(($cpu_us+$cpu_sy))
  if [ $sum_cpu -gt 80 ] || [ $mem_rate -gt 80 ];then
      echo "--------------$(date +"%m-%d %H:%M:%S")--------------------" >> cpu.log
      top -b -n 1 | head -n 30 >> cpu.log
  fi
}
#退出死迴圈的條件(可以選擇其他方式)
function exit_loop(){
  if [ -e "io.log" ] && [ -e "cpu.log" ]; then
      iolog_size=`du io.log | awk '{print $1}'`
      cpulog_size=`du cpu.log | awk '{print $1}'`
      total_size=$(($iolog_size+$cpulog_size))
      if [ $total_size -gt 1024000 ];then
          exit
      fi 
  fi
}
#每隔兩秒執行一次,以避免佔用太多系統資源(如果選擇計劃任務的方式,可以去掉while迴圈)
while [ 2 -gt 1 ]
do
  sleep 2
  io_monitor
  cpu_Mem_monitor
  exit_loop
done

2、將指令碼放到後臺持續執行

nohup bash monitor.sh > nohup.log 2>&1 &

作者:董雙磊


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559758/viewspace-2678744/,如需轉載,請註明出處,否則將追究法律責任。

相關文章