Linux運維之監控CPU和內存的日志工具


一、監控CPU和內存的日志工具的使用

1、阿里雲提供了一個監控CPU和內存的腳本,因free版本不同的原因,腳本中的內容有做細微的修改,腳本內容如下:

#!/bin/bash
#When the free memory very less ,this script to collect CPU/memory usage information and dmessage information. 
#Version 1.0 time:2014-3-11
#Version 2.0 time:2014-12-23
#Version 3.0 time:2020-07-12

logfile=/tmp/$0.log

check_os_release()
{
  while true
  do
    os_release=$(grep "Red Hat Enterprise Linux Server release" /etc/issue 2>/dev/null)
    os_release_2=$(grep "Red Hat Enterprise Linux Server release" /etc/redhat-release 2>/dev/null)
    if [ "$os_release" ] && [ "$os_release_2" ]
    then
      if echo "$os_release"|grep "release" >/dev/null 2>&1
      then
        os_release=redhat
        echo "$os_release"
      else
        os_release=""
        echo "$os_release"
      fi
      break
    fi
    os_release=$(grep "Aliyun Linux release" /etc/issue 2>/dev/null)
    os_release_2=$(grep "Aliyun Linux release" /etc/aliyun-release 2>/dev/null)
    if [ "$os_release" ] && [ "$os_release_2" ]
    then
      if echo "$os_release"|grep "release" >/dev/null 2>&1
      then
        os_release=aliyun
        echo "$os_release"
      else
        os_release=""
        echo "$os_release"
      fi
      break
    fi
    os_release_2=$(grep "CentOS" /etc/*release 2>/dev/null)
    if [ "$os_release_2" ]
    then
      if echo "$os_release_2"|grep "release" >/dev/null 2>&1
      then
        os_release=centos
        echo "$os_release"
      else
        os_release=""
        echo "$os_release"
      fi
      break
    fi
    os_release=$(grep -i "ubuntu" /etc/issue 2>/dev/null)
    os_release_2=$(grep -i "ubuntu" /etc/lsb-release 2>/dev/null)
    if [ "$os_release" ] && [ "$os_release_2" ]
    then
      if echo "$os_release"|grep "Ubuntu" >/dev/null 2>&1
      then
        os_release=ubuntu
        echo "$os_release"
      else
        os_release=""
        echo "$os_release"
      fi
      break
    fi
    os_release=$(grep -i "debian" /etc/issue 2>/dev/null)
    os_release_2=$(grep -i "debian" /proc/version 2>/dev/null)
    if [ "$os_release" ] && [ "$os_release_2" ]
    then
      if echo "$os_release"|grep "Linux" >/dev/null 2>&1
      then
        os_release=debian
        echo "$os_release"
      else
        os_release=""
        echo "$os_release"
      fi
      break
    fi
    break
    done
}

rhel_fun()
{
  while true
  do
    #vm_mem=$(free -m|grep "buffers/cache"|awk '{print $4}')
    vm_mem=$(free -m|grep "Mem"|awk '{print $7}')
    cpu=$(top -bn2|grep "Cpu(s)"|awk '{print $8}'|awk -F'%' '{print $1}'|tail -n1)
    check_cpu=$(echo "$cpu <20" |bc)
    if [[ $vm_mem -le 100 ]] || [[ $check_cpu -eq 1  ]]
    then
      echo "======================================================" >>$logfile
      date >>$logfile
      echo "======================================================" >>$logfile
      echo "The memory is too less." >>$logfile
      free -m >>$logfile
      echo "=======================CPU info========================" >>$logfile
      (ps aux|head -1;ps aux|sort -nrk3|grep -v "RSS") >>$logfile
      echo "=======================Memory info=====================" >>$logfile
      (ps aux|head -1;ps aux|sort -nrk6|grep -v "RSS") >>$logfile
      date >>$logfile
      echo "=======================Dmesg info=====================" >>$logfile
      dmesg >>$logfile
      dmesg -c
    fi
    sleep 10
  done
}

debian_fun()
{
  while true
  do
    vm_mem=$(free -m|grep "buffers/cache"|awk '{print $4}')
    cpu=$(top -bn2|grep "Cpu(s)"|awk '{print $5}'|awk -F'%' '{print $1}'|tail -n1)
    check_cpu=$(echo "$cpu <20" |bc)
    if [[ $vm_mem -le 100 ]] || [[ $check_cpu -eq 1  ]]
    then
      echo "======================================================" >>$logfile
      date >>$logfile
      echo "======================================================" >>$logfile
      echo "The memory is too less." >>$logfile
      free -m >>$logfile
      echo "=======================CPU info========================" >>$logfile
      (ps aux|head -1;ps aux|sort -nrk3|grep -v "RSS") >>$logfile
      echo "=======================Memory info=====================" >>$logfile
      (ps aux|head -1;ps aux|sort -nrk6|grep -v "RSS") >>$logfile
      date >>$logfile
      echo "=======================Dmesg info=====================" >>$logfile
      dmesg >>$logfile
      dmesg -c
    fi
    sleep 10
  done
}

check_os_release

case "$os_release" in
redhat|centos|aliyun)
  yum install bc -y
  rhel_fun
  ;;
debian|ubuntu)
  apt-get install bc -y
  debian_fun
  ;;
esac
View Code

2、上傳到/tmp目錄中

3、執行如下命令並后台運行該腳本

cd /tmp
nohup bash get_cpu_mem_info.sh &

4、該工具會在/tmp目錄下生成一個以腳本名字命名的日志文件,實時記錄系統的CPU、內存的使用情況,等到系統異常時可以用於分析日志。

二、監控CPU和內存的日志工具的詳解

logfile=/tmp/$0.log:$0表示Shell本身的文件名

check_os_release():該函數檢測的是Linux是屬於哪種發行版本

rhel_fun():

  1、vm_mem獲取的是Mem行available值

  2、cpu:該變量是top連續運行兩次之后匹配%Cpu(s)這一行,id這一列的值,結果是兩行,取最后一行

  3、check_cpu:將cpu計算出來的值與20進行比較,再通過管道符給bc進行計算,如果是真返回1,如果是假返回0

  4、if [[ $vm_mem -le 100 ]] || [[ $check_cpu -eq 1  ]]:如果變量vm_mem小於等於100則繼續執行,如若不是,則變量check_cpu與1進行比較,如果等於1則執行then之后的命令,否則直接sleep10s,然后繼續循環比較。

  5、ps aux|head -1;ps aux|sort -nrk3|grep -v "RSS":ps aux|head -1獲取行首信息,以便后續命令倒序更好查看;sort -nrk3對第三個域(%CPU這一列)數值進行相反的順序排序;grep -v "RSS"因為超出8行以后會多顯示一行行首,為了排版好看,不要多余無用數據,所以加-v排除這一行。

  6、dmesg:該命令顯示Linux內核的環形緩沖區信息,我們可以從中獲得諸如系統架構、CPU、掛載的硬件,RAM等多個運行級別的大量的系統信息。當計算機啟動時,系統內核(操作系統的核心部分)將會被加載到內存中。在加載的過程中會顯示很多的信息,在這些信息中我們可以看到內核檢測硬件設備

 

1) dmesg 是一個顯示內核緩沖區系統控制信息的工具;比如系統在啟動時的信息會寫到/var/log/

2) dmesg 命令顯示Linux內核的環形緩沖區信息,我們可以從中獲得諸如系統架構、CPU、掛載的硬件,RAM等多個運行級別的大量的系統信息。當計算機啟動時,系統內核(操作系統的核心部分)將會被加載到內存中。在加載的過程中會顯示很多的信息,在這些信息中我們可以看到內核檢測硬件設備

3) dmesg 命令設備故障的診斷是非常重要的。在dmesg命令的幫助下進行硬件的連接或斷開連接操作時,我們可以看到硬件的檢測或者斷開連接的信息

 

【備注】: 

dmesg用來顯示內核環緩沖區(kernel-ring buffer)內容,內核將各種消息存放在這里。在系統引導時,內核將與硬件和模塊初始化相關的信息填到這個緩沖區中。內核環緩沖區中的消息對於診斷系統問題 通常非常有用。在運行dmesg時,它顯示大量信息。通常通過less或grep使用管道查看dmesg的輸出,這樣可以更容易找到待查信息。

1) 如果發現硬盤性能低下,可以使用dmesg來檢查它們是否運行在DMA模式:dmesg | grep DMA

2) 可以用來探測系統內核模塊的加載情況,比如要檢測ACPI的加載情況,使用dmesg | grep acpi

3) 可以使用mail -s "Boot Log Of xxx Server" user@xxx.com < messages來發送這些日志信息

————————————————
關於dmesg,原文鏈接:https://blog.csdn.net/Jerry_1126/article/details/54643018
還有一篇關於dmesg的詳細使用,見:https://linuxize.com/post/dmesg-command-in-linux/,翻譯見此鏈接


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM