在Linux下有很多系統性能分析工具,比較常見的有top、free、ps、time、timex、uptime等。下文將介紹幾個較爲重要的性能分析工具vmstat、iostat和sar及其使用。
用vmstat監視內存使用情況
vmstat是Virtual Meomory Statistics(虛擬內存統計)的縮寫,可對操作系統的虛擬內存、進程、CPU活動進行監視。它是對系統的整體情況進行統計,不足之處是無法對某個進程進行深入分析。
vmstat的語法如下:
vmstat [-V] [-n] [delay [count]]
其中,-V表示打印出版本信息;-n表示在週期性循環輸出時,輸出的頭部信息僅顯示一次;delay是兩次輸出之間的延遲時間;count是指按照這個時間間隔統計的次數。對於vmstat輸出各字段的含義,可運行man vmstat查看。
用iostat監視I/O子系統情況
iostat是I/O statistics(輸入/輸出統計)的縮寫,iostat工具將對系統的磁盤操作活動進行監視。它的特點是彙報磁盤活動統計情況,同時也會彙報出CPU使用情況。同vmstat一樣,iostat也有一個弱點,就是它不能對某個進程進行深入分析,僅對系統的整體情況進行分析。
iostat的語法如下:
iostat [ -c | -d ] [ -k ] [ -t ] [ -V ] [ -x [ device ] ] [ interval [ count ] ]
其中,-c爲彙報CPU的使用情況;-d爲彙報磁盤的使用情況;-k表示每秒按kilobytes字節顯示數據;-t爲打印彙報的時間;-v表示打印出版本信息和用法;-x device指定要統計的設備名稱,默認爲所有的設備;interval指每次統計間隔的時間;count指按照這個時間間隔統計的次數。
iostat一般的輸出格式如下:
Linux 2.6.18-128.el5 (rac1) 08/20/2010
avg-cpu: %user %nice %system %iowait %steal %idle
0.07 0.00 0.06 0.01 0.00 99.86
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 2.32 8.36 71.07 1526179 12969146
sda1 0.00 0.01 0.00 2231 10
sda2 1.04 2.61 41.72 476291 7613088
sda3 0.00 0.01 0.00 1756 0
sda4 0.00 0.00 0.00 9 0
sda5 1.28 5.73 29.35 1045323 5356048
sdb 8.46 112.82 52.52 20586955 9584357
sdb1 0.05 0.32 0.00 58933 0
sdb2 2.99 2.00 1.00 364212 181792
sdb3 5.07 110.47 39.65 20158185 7234830
sdb4 0.00 0.00 0.00 5 0
sdb5 0.35 0.00 11.88 893 2167735
sdb6 0.00 0.00 0.00 387
對於輸出中各字段的含義,iostat的幫助中有詳細的說明。
vmstat 命令報告虛擬內存統計信息和CPU負荷:頁面調度,交換,任務交換,CPU利用率。命令的語法是:
vmstat [-cisS] [d1 d2 d3 d4] [interval [count]]
當不用選項時,vmstat顯示一條曲線表示自從系統啓動後活動的信息。如果指定interval(時間間隔),接下來的線是重複顯示最後的interval期間活動的情況,直到用戶中斷命令執行。當同時提供計數器時,統計信息按時間計數來顯示。
如果指定了一個磁盤名(如d1,d2,等等。),這些磁盤得到優先顯示。通常,系統上的前4個磁盤設備是顯示的,因爲只有四個設備能在一線條上顯示,這個選項允許性能分析員修改缺省顯示選項。(*磁盤名通常隨id,sd,xd,或xy (取決於類型和I/0界面)加一個數字,如id0,sd2,xd1等等命名而定。)
,vmstat 命令顯示若干字段信息:
procs 報表下面三種狀態的進程數:
r--在運行隊列中等候運行
b--被資源阻塞(I/0,頁面調度,等等.)
w--可運行但是被換出的
memory 報告虛擬內存和實存信息:
swap--以千字節爲單位的當前可用交換空間的數量
free--以千字節爲單位的頁自由表大小
page 報告每秒頁面調度活動數量的信息:
re-從自由表回收頁
mf--次要的錯誤;地址空間或硬件地址轉換錯誤
pi--頁入的千字節數
po -頁出的千字節數
fr- 釋放的千字節數
de--以千字節爲單位的可接受的短期內存不足數
sr--頁由時鐘算法掃描
disk 可以爲四個磁盤報告每秒磁盤I/O的數量
faults 報告每秒系統軟件中斷和硬件中斷的速率
in-設備中斷,不包括系統時鐘中斷
sy-系統調用
cs-CPU任務(上下文)交換
cpu-- CPU故障時間的百分比,在多處理器系統上,這是全部處理器的平均值:
us- 用戶時間
sy-- 系統時間
id-- 閒置時間
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空閒的時間
FIELD DESCRIPTIONS
Procs
r: The number of processes waiting for run time.
b: The number of processes in uninterruptable sleep.
w: The number of processes swapped out but otherwise runnable.
Thisfield is calculated, but Linux never desperation swaps.
Memory
swpd: the amount of virtual memory used (kB).
free: the amount of idle memory (kB).
buff: the amount of memory used as buffers (kB).
Swap
si: Amount of memory swapped in from disk (kB/s). 虛擬內存的頁導入(從SWAP DISK導入RAM)
so: Amount of memory swapped to disk (kB/s). 虛擬內存的頁導出.
(從RAM到SWAP DISK)
IO
bi: Blocks sent to a block device (blocks/s).
bo: Blocks received from a block device (blocks/s).
System
in: The number of interrupts per second, including the clock.
cs: The number of context switches per second.
: CPU
These are percentages of total CPU time.
us: user time
sy: system time
id: idle time
如果 r經常大於 4 ,且id經常少於40,表示cpu的負荷很重。
如果pi,po 長期不等於0,表示內存不足。
如果disk 經常不等於0, 且在 b中的隊列 大於3, 表示 io性能不好。
由vmstat看服務器
說明:由於STATSPACK並不能獲取全面分析性能問題所需要的所有信息,所以需要擴展其收集服務器的統計信息。(本文環境REDHAT Linux7.2)
VMSTAT介紹
通過STATSPACK收集服務器信息,主要通過收集VMSTAT的信息來展現服務器狀況。VMSTAT工具是最常見的UNIX監控工具,可以展現給定時間間隔的服務器的狀態值。
一般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)