裏介紹下以vmstat爲基礎的系統監控腳本/root/monitor.sh
此腳本設計思想與功能實現:
①此腳本設計爲Nagios監控補遺,Nagios是即時監控服務器狀態並即時報警,但美中不足的不能記錄其狀態及日誌,所以設計此腳本;
②此腳本已在FreeBSD上成功調試運行,亦適用於RHEL/Centos系統;
③這裏以常用生產服務器HPDL380G6(英特爾至強[email protected]雙四核)爲依據,r的閥值爲4;
腳本內容如下
#!/bin/bash
while :
do
vmr=`vmstat | tail -1 | awk '{print $1}'`
if [ ${vmr} -gt 4 ]
then
date >> /root/monitor.txt
vmstat >> /root/monitor.txt
netstat -anp >> /root/monitor.txt
ps -aux>> /root/monitor.txt
last >> /root/monitor.txt
tail -10 /var/log/messages >> /root/monitor.txt
fi
sleep 60
done
此腳本可放至後臺運行 sh /root/monitor.sh & ,如遇CPU繁忙的情況,它會自動記載系統日誌等以供分析。
這裏補充下vmstat的詳細信息。這部分資料參考南非蜘蛛,如有問題可諮詢本文作者撫琴煮酒:[email protected]。
用vmstat監視內存使用情況
vmstat是Virtual Meomory Statistics(虛擬內存統計)的縮寫,可對操作系統的虛擬內存、進程、CPU活動進行監視。它是對系統的整體情況進行統計,不足之處是無法對某個進程進行深入分析。
vmstat的語法如下:
vmstat [-V] [-n] [delay [count]]
其中,-V表示打印出版本信息;-n表示在週期性循環輸出時,輸出的頭部信息僅顯示一次;delay是兩次輸出之間的延遲時間;count是指按照這個時間間隔統計的次數。對於vmstat輸出各字段的含義,可運行man vmstat查看。
vmstat命令有四個可選標誌可供使用。如果機器有虛擬地址緩存-c標誌就改變輸出報告緩存刷新統計數據。報告包括自從系統啓動後每種緩存刷新全部總量。六個緩存類型是用戶,上下文,區域,段,頁,部分頁。
-i標誌 使輸出變爲報告中斷的數量。如果給出設備名,如d1,d2等,監控將在設備級*執行,(*注,參閱第十二章有關打開設備級監控的信息。)並報告每個給定設備的統計信息。
修改"普通"報告來顯示交換而非頁面調度活動的信息。這選項改變顯示的兩個字段:si(換入)和so(換出)替代了re和mf字段。
值得注意是,interval 和count選項對-i或-s選項是非法的。
vmstat 參數詳解
procs: r-->在運行隊列中等待的進程數 b-->在等待io的進程數 w-->可以進入運行隊列但被替換的進程 memoy swap-->現時可用的交換內存(k表示) free-->空閒的內存(k表示) pages re--》回收的頁面 mf--》非嚴重錯誤的頁面 pi--》進入頁面數(k表示) po--》出頁面數(k表示) fr--》空餘的頁面數(k表示) de--》提前讀入的頁面中的未命中數 sr--》通過時鐘算法掃描的頁面 disk 顯示每秒的磁盤操作。 s表示scsi盤,0表示盤號 fault 顯示每秒的中斷數 in--》設備中斷 sy--》系統中斷 cy--》cpu交換 cpu 表示cpu的使用狀態 cs--》用戶進程使用的時間 sy--》系統進程使用的時間 id--》cpu空閒的時間
如果 r經常大於 4 ,且id經常少於40,表示cpu的負荷很重。
如果pi,po 長期不等於0,表示內存不足。
如果disk 經常不等於0, 且在 b中的隊列 大於3, 表示 io性能不好。
由vmstat看服務器
一般VMSTAT工具的使用是通過兩個數字參數來完成的,第一個參數是採樣的時間間隔數,單位是秒,第二個參數是採樣的次數。如:
[oracle@brucelau oracle]$ vmstat 1 2 procs memory swap io system CPU r b w swpd free buff cache si so bi bo in cs us sy id 1 0 0 0 271844 186052 255852 0 0 2 6 102 10 0 0 100 0 0 0 0 271844 186052 255852 0 0 0 0 104 11 0 0 100
(注:目前系統幾乎空閒,並且不同操作系統VMSTAT輸出內容有所不同)
目前說來,對於服務器監控有用處的度量主要有:
r(運行隊列) pi(頁導入) us(用戶CPU) sy(系統CPU) id(空閒)
通過VMSTAT識別CPU瓶頸
r(運行隊列)展示了正在執行和等待CPU資源的任務個數。當這個值超過了CPU數目,就會出現CPU瓶頸了。
獲得CPU個數的命令(LINUX環境):
cat /proc/cpuinfo|grep processor|wc –l
當r值超過了CPU個數,就會出現CPU瓶頸,解決辦法大體幾種:
1. 最簡單的就是增加CPU個數
2. 通過調整任務執行時間,如大任務放到系統不繁忙的情況下進行執行,進爾平衡系統任務
3. 調整已有任務的優先級
通過VMSTAT識別CPU滿負荷
首先需要聲明一點的是,vmstat中CPU的度量是百分比的。當us+sy的值接近100的時候,表示CPU正在接近滿負荷工作。但要注意的是,CPU滿負荷工作並不能說明什麼,UNIX總是試圖要CPU儘可能的繁忙,使得任務的吞吐量最大化。唯一能夠確定CPU瓶頸的還是r(運行隊列)的值。
通過VMSTAT識別RAM瓶頸
數據庫服務器都只有有限的RAM,出現內存爭用現象是Oracle的常見問題。
首先察看RAM的數量,命令如下(LINUX環境):
[root@brucelau root]#free total used free shared buffers cached Mem: 1027348 873312 154036 185736 187496 293964 -/+ buffers/cache: 391852 635496 Swap: 2096440 0 2096440
當然可以使用top等其他命令來顯示RAM。
當內存的需求大於RAM的數量,服務器啓動了虛擬內存機制,通過虛擬內存,可以將RAM段移到SWAP DISK的特殊磁盤段上,這樣會出現虛擬內存的頁導出和頁導入現象,頁導出並不能說明RAM瓶頸,虛擬內存系統經常會對內存段進行頁導出,但頁導入操作就表明了服務器需要更多的內存了,頁導入需要從SWAP DISK上將內存段複製回RAM,導致服務器速度變慢。
解決的辦法有幾種:
1. 最簡單的,加大RAM
2. 改小SGA,使得對RAM需求減少
3. 減少RAM的需求(如:減少PGA)