1. 程式人生 > >vmstat 命令的用法說明(總)

vmstat 命令的用法說明(總)

vmstat 命令的用法說明

用途

報告虛擬記憶體統計資訊。

語法

vmstat [ -f ] [ -i ] [ -s ] [ -I ] [ -t ] [ -v ] [ PhysicalVolume ... ] [ Interval [ Count ] ]

描述

vmstat 命令報告關於核心執行緒、虛擬記憶體、磁碟、陷阱和 CPU 活動的統計資訊。由 vmstat 命令生成的報告可以用於平衡系統負載活動。系統範圍內的這些統計資訊(所有的處理器中)都計算出以百分比表示的平均值,或者計算其總和。

如果呼叫 vmstat 命令時不帶標誌,則報告包含系統啟動後虛擬記憶體活動的摘要。如果指定 -f

 標誌,則 vmstat 命令報告自從系統啟動後派生的數量。PhysicalVolume 引數指定物理卷的名稱。

Interval 引數指定每個報告之間的時間量(以秒計)。第一個報告包含系統啟動後時間的統計資訊。後續報告包含自從前一個報告起的時間間隔過程中所收集的統計資訊。如果沒有指定 Intervalvmstat 命令生成單個報告然後退出。Count 引數只能和 Interval 引數一起指定。如果指定了 Count 引數,其值決定生成的報告數目和相互間隔的秒數。如果 Interval 引數被指定而沒有 Count 引數,則連續生成報告。Count 引數不允許為 0。 引數,

在 AIX 4.3.3 及更新版本包含有此方法的增強,用於計算 CPU 等待磁碟 I/O 所花時間(wio

作業系統更早的版本中使用的該方法在 SMP 上會給出誇張的 wio 時間報告。 時間)的百分比。某些情況下,AIX 4.3.2 以及該

AIX 4.3.2 和更早版本中使用的方法如下:在每個處理器的每一次時鐘中斷(每個處理器一秒鐘 100 次),確定上一個 10 毫秒時間要歸入四種類別(usr/sys/wio/idle)中的哪一個。如果在時鐘中斷的時候,CPU 正忙於 usr 方式,那麼 usr 將獲取該時鐘週期新增到其類別中。如果在時鐘中斷的時候,CPU 正忙於核心方式,那麼 sys 類別獲取該時鐘週期。如果 CPU 不忙的話,則檢測是否有磁碟 I/O 正在進行。如果有任何正在進行的磁碟 I/ O,則累加 wio 類別。如果沒有磁碟 I/O 正在進行且 CPU 不忙,則 idle 類別獲取該時鐘週期。由於所有的空閒 CPU 都被歸入 wio 類別,而不管正在等待 I/O 的執行緒數量,所以會產生誇大的 wio 時間報告。例如,只有一個 I/O 執行緒的系統可能會報告 90% 以上的 wio 時間,而不管它擁有的 CPU 數量。sar

%wio)、vmstatwa)和 iostat% iowait)命令報告 wio 時間。

作業系統 AIX 4.3.3 及其更新版本使用的方法如下:如果一個未完成的 I/O 在空閒的 CPU 上啟動,則作業系統 AIX 4.3.3 中的更改將只把該 CPU 標記成 wio。當只有少量執行緒在進行 I/O 而系統其它部分是空閒的,此方法能報告低得多的 wio 時間。例如,一個有四個 CPU 和一個正在進行 I/O 的執行緒的系統將報告最多 25% 的 wio 時間。有 12 個 CPU 和一個正在進行 I/O 的執行緒的系統只報告最大為 8% 的 wio 時間。NFS 客戶機通過 VMM 讀取/寫入,biods 在 VMM 中花費的等待 I/O 完成的時間現在報告為 I/O 等待時間。

核心為核心執行緒、調頁和中斷活動維護統計資訊,vmstat 命令通過使用perfstat 核心擴充套件來對其進行訪問。磁碟輸入/輸出統計資訊由裝置驅動程式維護。對於磁碟,利用活動時間和傳送資訊數量來確定平均傳送速率。活動時間的百分數根據報告期間驅動器忙的時間量來計算。

由 vmstat 命令生成的以下報告示例包含欄標題及其描述:

kthr:核心執行緒狀態在取樣間隔期間每秒鐘更改一次。

r 置於執行佇列中的核心執行緒數目。
b 置於等待佇列(等待資源、等待輸入/輸出)的核心執行緒數目。

記憶體:關於使用虛擬記憶體和實記憶體的資訊。如果虛擬頁已經被訪問的話,虛擬頁可以被認為是活動的。一頁為 4096 個位元組。

avm 活動虛擬頁。
fre 空閒列表的大小。 注: 大部分實記憶體都用作檔案系統資料的快取記憶體。對於保持較小的空閒列表,這是很正常的。

:關於缺頁故障和調頁活動的資訊。這些是間隔的平均值,以秒為單位給出。

re 頁面排程程式輸入/輸出列表。
pi 從調頁空間排程進的頁面。
po 調出到調頁空間的頁面。
fr 釋放的頁(頁面替換)。
sr 通過頁替換演算法掃描的頁面。
cy 按頁替換演算法的時鐘週期。

故障:取樣間隔平均每秒的捕獲和中斷率。

in 裝置中斷
sy 系統呼叫。
cs 核心執行緒上下文切換。

Cpu:CPU 使用時間故障百分比。

us 使用者時間。
sy 系統時間。
id CPU 空閒時間。
wa CPU 空閒時間,在此期間系統有未完成的磁碟/NFS I/O 請求。請參閱上面的詳細描述。

磁碟:每秒向指定物理卷提供的傳送數目,該過程在取樣間隔中發生。PhysicalVolume 引數可以用於指定一到四個名稱。每個指定驅動器的傳送統計資訊按指定順序給出。該計數代表向物理裝置的請求數。它並不暗示讀取或寫入的資料量。幾個邏輯請求可以組合成為一個物理請求。

如果指定一個 -I 標誌,I/O 定向檢視將會出現以下欄目變化。

kthr 除了欄 r 和 b之外,欄 p 也將顯示。
p
每秒等待實際物理 I/O 的執行緒數。
將顯示新欄 fi 和 fo,代替 re 和 cy 欄。
fi
每秒調入的檔案。
fo
每秒調出的檔案。

標誌

注: 如果在命令列中輸入了 -f(或 -s)標誌,系統將僅接受 -f(或 -s)標誌,將忽略其它標誌。如果同時指定了 -f 和 -s 標誌,系統將僅接受第一個標誌,忽略第二個標誌。
-f 報告從系統啟動後的派生數目。
-i 顯示從系統啟動後每個裝置造成的中斷數目。
-I 用新的輸出欄顯示 I/O 定向檢視,p 在標題 kthr 下;欄 fi 和 fo 在標題頁面下,而不是欄下;re 和 cy 在頁標題中。
-s 將總數結構中的內容寫入到標準輸出,該結構包含從系統初始化後調頁事件的絕對計數。-s-v 標誌一起使用。如下描述了這些事件: 標誌只能與
地址翻譯錯誤
每次發生地址轉換頁面故障時增加。解決頁面故障可能需要 I/O,也可能不需要。儲存保護頁面故障(失去鎖定)不包含在此計數之內。
入頁
隨虛擬記憶體管理器讀入的每頁增加。計數隨調頁空間和檔案空間的入頁增加。它和出頁統計資訊一起表示實際 I/O(由虛擬記憶體管理器啟動)的總量。
出頁
隨虛擬記憶體管理器寫出的每頁增加。計數隨調頁空間和檔案空間的出頁而增加。它和入頁統計資訊一起表示實際 I/O(由虛擬記憶體管理器啟動)的總量。
調頁空間入頁
只隨 VMM 啟動的來自調頁空間的入頁而增加。
調頁空間出頁
只隨 VMM 啟動的來自調頁空間的出頁而增加。
總回收
當不啟用一個新的 I/O 請求也可以滿足地址翻譯錯誤時增加。如果頁面以前已經被 VMM 請求過的,但是 I/O 還沒有完成;或者頁面被預讀演算法提前提取,但是被故障段隱藏了;或者如果頁面已經被放入空閒列表中,但還沒有重新使用,則會發生此情況。
零填充頁面故障
如果頁面故障針對的是工作儲存器,且可以通過指定一個幀並以零填充幀來滿足它的話,則該值增加。
可執行填充頁面故障
隨著每個指令頁面故障而增加。
用時鐘檢查頁面
VMM 利用時鐘演算法實施偽最近最少使用(1ru)的頁面替換模式。時鐘檢查過的頁面是 aged。為每個時鐘檢查過的頁面增加此計數值。
時鐘指標的轉動
隨著每次 VMM 時鐘旋轉而增加(即在每一次完整的記憶體掃描後)。
用時鐘釋放的頁面
隨著時鐘演算法從實記憶體中選擇釋放的每一個頁面而增加。
回溯
隨著解決前一個頁面故障時出現的每一個頁面故障而增加。(必須首先解決新的頁面故障,然後可以回溯到最初的頁面故障。)
鎖定丟失
VMM 通過除去對頁面的定址能力來強制併發性鎖定。鎖定丟失可能產生一個頁面故障,每當此類情況發生時,此計數增加。
空閒幀等待
在收集可用幀時,每次 VMM 等待一個程序時增加。
擴充套件 XPT 等待
每次正在進行提交而使得 VMM 等待一個程序時,隨著正在被訪問的段而增加。
暫掛 I/O 等待
每次 VMM 等待一個程序時隨著要完成的入頁 I/O 而增加。
啟動 I/O
隨著每個被 VMM 啟動的讀取或寫入 I/O 請求而增加。此計數應該與入頁和出頁的總數相等。
iodones
在每次完成 VMM I/O 請求時增加。
CPU 上下文交換
隨著每次 CPU 上下文交換而增加(新程序的分派)。
裝置中斷
每次硬體中斷時增加。
軟體中斷
每次軟體中斷時增加。一次軟體中斷是一個類似於硬體中斷(儲存一些狀態和伺服器例程分支)的機器指令。系統呼叫用軟體中斷指令來完成,該指令轉換控制到系統呼叫處理程式例程。
陷阱
不通過作業系統來維護。
syscalls
隨著每次系統呼叫而增加。
-t 列印 vmstat 的每一輸出行旁邊的時間戳記。時間戳記按照 HH:MM:SS 格式顯示。 注: 如果指定了 -f-s 或 -i 標誌,將不列印時間戳記。
-v 將虛擬記憶體管理器維護的不同統計資訊寫入標準輸出。-v 標誌只能與 -s 標誌一起使用。
記憶體頁
實記憶體的大小(以 4 KB 的頁面數目計)。
lruable 頁
要用於替換的 4 KB 頁面的數目。此數目不包含被用於 VMM 內部頁和用於核心文字的固定部分的頁面。
空閒頁面
空閒 4 KB 頁面的數目。
記憶體池
指定記憶體池數目的調整引數(使用 vmo 管理)。
固定頁面
固定的 4 KB 頁面的數目。
maxpin 百分比
指定能被固定的實記憶體百分數的調整引數(使用 vmo 管理)。
minperm 百分比
實記憶體百分比的調整引數(使用 vmo 管理)。它指定一臨界點,低於此臨界點時阻止頁面重新排程演算法使用檔案頁面。
maxperm 百分比
實記憶體百分比的調整引數(使用 vmo 管理)。它指定一臨界點,高於此臨界點時頁面取走演算法只取走檔案頁面。
numperm 百分比
當前由檔案快取記憶體使用的記憶體百分數。
檔案頁面
當前由檔案快取記憶體使用的 4 KB 頁面的數目。
壓縮百分比
由壓縮頁面使用的記憶體百分數。
壓縮頁面
壓縮記憶體頁面的數目。
numclient 百分數
被客戶機頁面佔用的記憶體百分數。
maxclient 百分數
指定能用於客戶機頁面的最大記憶體百分數的調整引數(使用 vmo 管理)。
客戶機頁面
客戶機頁面的數目。
已排程的遠端出頁
排程用於客戶機檔案系統的出頁的數目。
無 pbuf 而阻塞的暫掛磁碟 I/O
沒有可用 pbuf 而阻塞的暫掛磁碟 I/O 請求的數目。Pbuf 是用於儲存邏輯卷管理器層上的 I/O 請求的固定的記憶體緩衝區。
無 psbuf 而阻塞的調頁空間 I/O
沒有可用 psbuf 而阻塞的調頁空間 I/O 請求的數目。Psbuf 是用於儲存虛擬記憶體管理器層上的 I/O 請求的固定記憶體緩衝區。
-v (由 -v顯示的統計資訊,接上頁)
無 fsbuf 而阻塞的檔案系統 I/O
沒有可用 fsbuf 而阻塞的檔案系統 I/O 請求的數目。Fsbuf 是用於儲存檔案系統層上的 I/O 請求的固定記憶體緩衝區。
無 fsbuf 而阻塞的客戶機檔案系統 I/O
沒有可用 fsbuf 而阻塞的客戶機檔案系統 I/O 請求的數目。NFS(網路檔案系統)和 VxFS(Veritas)是客戶機檔案系統。Fsbuf 是用於儲存檔案系統層上的 I/O 請求的固定記憶體緩衝區。
無 fsbuf 而阻塞的外部頁面排程程式檔案系統 I/O
沒有可用 fsbuf 而被阻塞的外部頁面排程程式客戶機檔案系統 I/O 請求的數目。JFS2 是一個外部頁面排程程式客戶機檔案系統。Fsbuf 是用於儲存檔案系統層上的 I/O 請求的固定記憶體緩衝區。

示例

  1. 要顯示引導後的統計資訊摘要,請輸入:
    vmstat
  2. 要顯示 2 秒時間間隔的 5 個摘要,請輸入:
    vmstat 2 5

    第一次摘要包含引導後的時間統計資訊。

  3. 要顯示引導後包括邏輯磁碟 scdisk13 和 scdisk14 的統計資訊摘要,請輸入:
    vmstat scdisk13 scdisk14
  4. 要顯示派生統計資訊,請輸入:
    vmstat  -f
  5. 要顯示各事件的計數,請輸入:
    vmstat -s
  6. 要顯示 vmstat的每一輸出欄旁邊的時間戳記,請輸入:
    vmstat -t
  7. 要以另一套輸出欄顯示新的 I/O 定向檢視,請輸入:
    vmstat -I
  8. 要顯示所有可用的 VMM 統計資訊,請輸入:
    vmstat -vs

檔案

/usr/bin/vmstat 包含 vmstat 命令。


來源:http://www.eygle.com/digest/2007/07/vmstat_man_page.html




昨天說到使用vmstat檢視FreeBSD的記憶體真實使用情況,其實vmstat在Ubuntu LInux系統下,也是一個非常不錯的檢視系統資訊的命令,其顯示的資訊要比top命令全的多,而且可以同時看到cpu、記憶體、硬碟等不同的系統資源的使用情況!

  其實vmstat是Virtual Meomory Statistics(虛擬記憶體統計)的縮寫,可對作業系統的虛擬記憶體、程序、CPU活動進行監視。它是對系統的整體情況進行統計,不足之處是無法對某個程序進行深入分析。

  vmstat的語法如下:

  vmstat [-V] [-n] [delay [count]]

  其中,-V表示打印出版本資訊;-n表示在週期性迴圈輸出時,輸出的頭部資訊僅顯示一次;delay是兩次輸出之間的延遲時間;count是指按照這個時間間隔統計的次數。對於vmstat輸出各欄位的含義,可執行man vmstat檢視。

[[email protected] ~]# vmstat 2 2
procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
r  b   swpd   free   buff  cache   si   so    bi    bo   in    cs us sy id wa
0  0      0 323016   4160  18064    0    0    11     4 1004    27  0 10 89  0
0  0      0 323016   4160  18064    0    0     0     0   53     4  0 10 90  0

  下面給出了各個引數的不同含義:

procs: 
r-->在執行佇列中等待的程序數 
b-->在等待io的程序數 
w-->可以進入執行佇列但被替換的程序 

memoy 
swap-->現時可用的交換記憶體(k表示) 
free-->空閒的記憶體(k表示) 
buff-->被用來做為快取的記憶體數,單位:KB
cache-->被用來做為檔案讀寫快取的記憶體數,單位:KB

swap
si-->從磁碟交換到記憶體的交換頁數量,單位:KB/秒
so-->從記憶體交換到磁碟的交換頁數量,單位:KB/秒

IO
bi-->磁碟塊入
bo-->磁碟塊出

System 
in-->每秒的中斷數,包括時鐘中斷
cs-->每秒的環境(上下文)切換次數

CPU 
按 CPU 的總使用百分比來顯示 
us-->使用者程序使用的時間
sy-->系統程序使用的時間
id-->cpu空閒的時間

pages
re-->回收的頁面 
mf-->非嚴重錯誤的頁面 
pi-->進入頁面數(k表示) 
po-->出頁面數(k表示) 
fr-->空餘的頁面數(k表示) 
de-->提前讀入的頁面中的未命中數 
sr-->通過時鐘演算法掃描的頁面 

disk 顯示每秒的磁碟操作。 
s表示scsi盤,0表示盤號 
fault 顯示每秒的中斷數 
in-->裝置中斷 
sy-->系統中斷 
cy-->cpu交換

  如果fre對於page列,re,pi,po,cy維持於比較穩定的狀態,PI率不超過5,如果有pagin發生,那麼關聯頁面必須先進行 pageout在記憶體相對緊張的環境下pagein會強制對不同的頁面進行steal操作。如果系統正在讀一個大批的永久頁面,你也許可以看到po和pi 列會出現不一致的增長,這種情景並不一定表明系統負載過重,但是有必要對應用程式的資料訪問模式進行見檢查。在穩定的情況下,掃描率和重置率幾乎相等,在 多個程序處理使用不同的頁面的情況下,頁面會更加不穩定和雜亂,這時掃描率可能會比重置率高出。

  faults列,in,sy,cs會不斷跳躍,這裡沒有明確的限制,唯一的就是這些值最少大於100 cpu列,us,sys,id和wa也是不確定的,最理想的狀態是使cpu處於100%工作狀態,但這隻適合單使用者的情況下。

  如果在多使用者環境中us+sys>80,程序就會在執行佇列中花費等待時間,響應時間和吞吐量就會下降。wa>40表明磁碟io沒有也許存在不合理的平衡,或者對磁碟操作比較頻繁

  如果 r經常大於 4 ,且id經常少於40,表示cpu的負荷很重。

  如果pi,po 長期不等於0,表示記憶體不足。

  如果disk 經常不等於0, 且在 b中的佇列 大於3, 表示 io效能不好。



linux命令vmstat介紹


vmstat介紹
通過STATSPACK收集伺服器資訊,主要通過收集VMSTAT的資訊來展現伺服器狀況。VMSTAT工具是最常見的UNIX監控工具,可以展現給定時間間隔的伺服器的狀態值。
一般VMSTAT工具的使用是通過兩個數字引數來完成的,第一個引數是取樣的時間間隔數,單位是秒,第二個引數是取樣的次數。如:
[[email protected] oracle]$vmstat 2
procs ———–memory———- —swap– —–io—- –system– —-cpu—-
r b   swpd   free   buff cache   si   so    bi    bo   in    cs us sy id wa
0 0 195804   3812 40616 1598656    0    0     0     0 1024 66976 0 0 100 0
0 0 195804   3812 40616 1598656    0    0     0    12 1048 66961 0 0 100 0
0 0 195804   3812 40616 1598656    0    0     0    28 1054 67067 0 0 100 0
0 0 195804   3812 40616 1598656    0    0     0     0 1020 66988 0 0 100 0
(注:目前系統幾乎空閒,並且不同作業系統VMSTAT輸出內容有所不同)
目前說來,對於伺服器監控有用處的度量主要有:
r(執行佇列)

pi(頁匯入)

us(使用者CPU)

sy(系統CPU)

id(空閒)
(如果r經常大於4 ,且id經常少於40,表示cpu的負荷很重。)

(如果bi,bo 長期不等於0,表示記憶體不足)

通過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環境):
[[email protected] ~]$ free
             total       used       free     shared    buffers     cached
Mem:       2074924    2071112       3812          0      40616    1598656
-/+ buffers/cache:     431840    1643084
Swap:      3068404     195804    2872600

當然可以使用top等其他命令來顯示RAM。
當記憶體的需求大於RAM的數量,伺服器啟動了虛擬記憶體機制,通過虛擬記憶體,可以將RAM段移到SWAP DISK的特殊磁碟段上,這樣會 出現虛擬記憶體的頁匯出和頁匯入現象,頁匯出並不能說明RAM瓶頸,虛擬記憶體系統經常會對記憶體段進行頁匯出,但頁匯入操作就表明了伺服器需要更多的記憶體了, 頁匯入需要從SWAP DISK上將記憶體段複製回RAM,導致伺服器速度變慢。

解決的辦法有幾種:
1. 最簡單的,加大RAM
2. 改小SGA,使得對RAM需求減少
3. 減少RAM的需求(如:減少PGA)



關於vmstat,top,ps aux檢視的cpu佔用率不一致的問題

問題:
用vmstat,top,和ps aux三個命令檢視程序對cpu的佔用率,數值差異很大。

例:
用 vmstat 檢視系統cpu空閒率, id是cpu的空閒率,可以看出,空閒率一直在73%以上
用 ps aux 統計兩個compress程序的cpu佔用率,長時間恆定在15.5%和28.9%
用 top統計兩個compress程序的cpu佔用率,可以看出是一個動態變化的過程
(命令執行結果後面有顯示)

這三個命令查出的cpu利用率不統一
首先,ps aux中兩個compress程序佔用cpu 15.5%+28.9%>40%,再加上其它程序,為
何vmstat檢視cpu空閒率id還能一直大於73%
其次,top命令顯示的程序compress的cpu佔用率和ps顯示的數值差別很大,ps的
cpu佔用率雷打不動,一直是恆定值,
top的比較動態, 難道ps aux顯示的程序cpu佔用率不可靠?
最後,這三個命令查出的cpu佔用率相互之間均不統一,用哪一個更可靠?例如輸入如下命令,粗體字是cpu佔用率

$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
r   b swpd free buff   cache si so bi bo in cs us sy id wa
0   0 432 802660   28724 5747324 0 0 204 770 0     0   6   3 90   2
3   0 432 799196   28724 5747392 0 0     0 152 1455 681   2   2 96   0
0   0 432 802420   28724 5747460 0 0     0 480 1599   1892 10   8 82 0
0   0 432 802292   28724 5747664 0 0     0 440 1859   6179 14 13 73 0
2   0 432 797636   28724 5752084 0 0     0 240 1403   3419   8   7 85   0
1   0 432 798732   28724 5751268 0 0     0 448 1506   4608 10   8 81   0
2   0 432 797924   28724 5752084 0 0     0 192 1752   4332 11 10 79   0
0   0 432 802076   28724 5747936 0 0     0 280 1705   1527 14   6 79 0

$ps aux | grep compress
USER    PID %CPU %MEM VSZ   RSS TTY    STAT START TIME COMMAND
img    6569 15.5   0.2 36716 16540 ?    S Aug12 230:57 ./bin/compress 8014
img    6570 28.9   0.2 54592 22524 ?    S Aug12 430:28 ./bin/compress 8004  

$top | grep compress
PID USER    PR   NI   VIRT   RES   SHR S %CPU %MEM TIME+   COMMAND                                                       
6569 img    16 0 40956   20m 6632 R 10.7   0.3 231:10.12 compress                                                       
6570 img    16 0 54592   21m 2456 S 20.3   0.3 430:54.32 compress                                                       
6569 img    17 0 36740   16m 2456 S 10.3   0.2 231:10.43 compress                                                       
6570 img    16 0 54592   21m 2456 R 58.9   0.3 430:56.09 compress                                                       
6569 img    16 0 36716   16m 2456 R 53.9   0.2 231:12.05 compress                                                       
6570 img    16 0 58444   24m 4752 R 69.9   0.3 430:58.19 compress                                                       
6569 img    16 0 36716   16m 2456 S 60.2   0.2 231:13.86 compress                                                       
6570 img    16 0 54592   21m 2456 S 52.6   0.3 430:59.77 compress                                                       
6569 img    15 0 36716   16m 2456 S 45.3   0.2 231:15.22 compress                                                        

大概看了些原始碼,補充一下:
top,ps,vmstat都是根據系統的proc檔案進行計算的,其中vmstat,top都使用了/proc/stat檔案,而ps,top也使用了/proc/*/stat檔案進行計算。

1.vmstat對於cpu idle的計算方式比較複雜,但是顯示的為平均值,即使用cpu使用時間片的差值/時間間隔/cpu個數(為物理cpu數目*cpu核心數),其中時間間隔為vmstat後加的引數,如vmstat 10就為10s內的平均cpu 佔用率;

2.ps計算的為每個程序的cpu佔用時間,使用的為/proc/*/stat檔案,其中*為程序號,計算方式為使用cpu總的時間片數/Hertz,目前確認為對於每個物理cpu的佔用比率,因此在雙核機器上顯示的數值需要除以核心數2;

3.top使用的是/proc/stat計算上面顯示的cpu佔用,使用/proc/*/stat計算每個程序佔用的時間。但是計算的方式有所不同,程式碼較為複雜,但是目前確認為預設顯示為Irix模式,即為相對於單個cpu core的佔用的時間,如雙核機器需要將該數值除以2*2計算,通過 shift+i可以進行切換;

通過上述說明可以解釋珺方發現的問題:
問題1:首先,ps aux中兩個compress程序佔用cpu 15.5%+28.9%>40%,再加上其它程序,為何vmstat檢視cpu空閒率id還能一直大於73%
ps的cpu佔用率需要除以雙核cpu數目為2,因此實際佔用為(15.5%+28.9% )/2=22.2% ,也就約等於100%-73%;

問題2:其次,top命令顯示的程序compress的cpu佔用率和ps顯示的數值差別很大,ps的cpu佔用率雷打不動,一直是恆定值,top的比較動態, 難道ps aux顯示的程序cpu佔用率不可靠?
ps和top相差的數值為2倍關係,因此顯示的佔用率相差很大,同時變化率也會較大;

問題3:最後,這三個命令查出的cpu佔用率相互之間均不統一,用哪一個更可靠?例如輸入如下命令,粗體字是cpu佔用率
這三個命令的佔用率是統一的,按照如下公式進行計算時資料是一致的:
vmstat 的100%-idle == ps的cpu佔用/cpu核心數 == top的cpu佔用/cpu核心數/物理cpu數目;





Linux下獲取CPU利用率和記憶體使用(C語言)

在Linux中如果要監視一個程序的執行情況,如檢視它的CPU使用效率和記憶體使用情況,就需要從系統的 /proc目錄的讀取一些系統資訊。然後分析得到結果,特別是在嵌入式中的應用程式這個功能就很重要。本文中的程式碼是從top命令的原始碼分析中獲得,並 做了部分修改,在FC6+GCC4.1除錯通過。從這個工程中我也獲得一些感悟。
1. Linux系統很優雅,如果在Windows中做這個功能就需要呼叫ActiveX控制元件。而在Linux中只需要讀取文字。
2.想完成什麼功能,如果不知道怎麼做,就想有沒有沒有其它的軟體有這個功能,如果有,檢視它的原始碼就可以了,然後定製自己需要的功能。
3.多想多看多做,學習技術的不二法門。

top命令原始碼下載:http://www.groupsys.com/top/download.shtml
工程下載:
 http://www.cppblog.com/Files/dyj057/mytop.zip 
下面是獲得系統CPU和記憶體情況的程式碼:

void 
get_system_info(info)
    
 
struct  system_info  * info;
{
    
 char  buffer[ 4096 + 1 
];
    
 int 
 fd, len;
    
 char  * 
p;
    
 int 
 i;

    
 /*  get load averages  */ 

    {
    fd 
 
=  open( " loadavg " , O_RDONLY);
    len 
 =  read(fd, buffer,  sizeof (buffer) - 1 
);
    close(fd);
    buffer[len] 
 =  ' \0 ' 
;

    info
 -> load_avg[ 0  =  strtod(buffer,  & 
p);
    info
 -> load_avg[ 1  =  strtod(p,  & 
p);
    info
 -> load_avg[ 2  =  strtod(p,  & 
p);
    p 
 =  skip_token(p);             /*  skip running/tasks  */ 

    p  
=  skip_ws(p);
    
 if  ( * 
p)
        info
 -> last_pid  = 
 atoi(p);
    
 else 

        info 
-> last_pid  =  - 1 ;
    }

    
 /*  get the cpu time info  */ 

    {
    fd 
 
=  open( " stat " , O_RDONLY);
    len 
 =  read(fd, buffer,  sizeof (buffer) - 1 
);
    close(fd);
    buffer[len] 
 =  ' \0 ' 
;

    p 
 =  skip_token(buffer);             /*  "cpu"  */ 

    cp_time[ 
0  =  strtoul(p,  & p,  0 );
    
    cp_time[
 1  =  strtoul(p,  & p,  0 
);
    cp_time[
 2  =  strtoul(p,  & p,  0 
);
    cp_time[
 3  =  strtoul(p,  & p,  0 
);

    
 /*  convert cp_time counts to percentages  */ 

    percentages( 
4 , cpu_states, cp_time, cp_old, cp_diff);
    }
    
    
 /*  get system wide memory usage  */ 

    {
    
 
char  * p;

    fd 
 =  open( " meminfo " 
, O_RDONLY);
    len 
 =  read(fd, buffer,  sizeof (buffer) - 1 
);
    close(fd);
    buffer[len] 
 =  ' \0 ' 
;

    
 /* 
 be prepared for extra columns to appear be seeking
       to ends of lines 
 */ 

    
    p 
 
=  buffer;
    p 
 = 
 skip_token(p);
    memory_stats[
 0  =  strtoul(p,  & p,  10 );  /*  total memory  */ 

    
    p 
 
=  strchr(p,  ' \n ' );
    p 
 = 
 skip_token(p);
    memory_stats[
 1  =  strtoul(p,  & p,  10 );  /*  free memory  */ 

    
    
    p 
 
=  strchr(p,  ' \n ' );
    p 
 = 
 skip_token(p);
    memory_stats[
 2  =  strtoul(p,  & p,  10 );  /*  buffer memory  */ 

    
    p 
 
=  strchr(p,  ' \n ' );
    p 
 = 
 skip_token(p);
    memory_stats[
 3  =  strtoul(p,  & p,  10 );  /*  cached memory  */ 
for (i  =  0 ; i <  8  ;i ++ ) {
        p
 ++ 
;
        p 
 =  strchr(p,  ' \n ' 
);
    }
    
    p 
 = 
 skip_token(p);
    memory_stats[
 4  =  strtoul(p,  & p,  10 );  /*  total swap  */ 

    
    p 
 
=  strchr(p,  ' \n ' );
    p 
 = 
 skip_token(p);
    memory_stats[
 5  =  strtoul(p,  & p,  10 );  /*  free swap  */ 

    
    }

    
 
/*  set arrays and strings  */ 
    info 
-> cpustates  =  cpu_states;
    info
 -> memory  = 
 memory_stats;
}

相關推薦

vmstat命令用法舉例

vmstat是Virtual Meomory Statistics(虛擬記憶體統計)的縮寫,可對作業系統的虛擬記憶體、程序、CPU活動進行監控。 他是對系統的整體情況進行統計,不足之處是無法對某個程序進行深入分析。vmstat 工具提供了一種低開銷的系統性能觀察方式。 因為v

vmstat 命令用法說明()

vmstat 命令的用法說明 用途 報告虛擬記憶體統計資訊。 語法 vmstat [ -f ] [ -i ] [ -s ] [ -I ] [ -t ] [ -v ] [ PhysicalVolume ... ] [ Interval [ Count ] ] 描述 vmstat 命令

Linux中find命令用法全匯,看完就沒有不會用的!

分用 想要 單個 ges 基本上 特定 cda size 以及 Linux 查找命令是Linux系統中最重要和最常用的命令之一。查找用於根據與參數匹配的文件指定的條件來搜索和查找文件和目錄列表的命令。查找可以在各種條件下使用,您可以通過權限,用戶,組,文件類型,日期,大小等

Linux vmstat命令實戰詳解

上下文切換 span 一次 過多 sta log 讀取文件 負載 監控 vmstat命令是最常見的Linux/Unix監控工具,可以展現給定時間間隔的服務器的狀態值,包括服務器的CPU使用率,內存使用,虛擬內存交換情況,IO讀寫情況。這個命令是我查看Linux/Unix最喜

wmic命令用法小例

brief isa 讀者 用戶名 creation not 詳細信息 services cname wmic就是wmic.exe,位於windows目錄底下,是一個命令行程序。WMIC可以以兩種模式執行:交互模式(Interactive mode)和非交互模式(Non-In

常用正則用法

匹配中文 def 第一次 一個數 exp 數學 開始 call 字符串類型 過目不忘JS正則表達式 正則表達式,有木有人像我一樣,學了好幾遍卻還是很懵圈,學的時候老明白了,學完了忘光了。好吧,其實還是練的不夠,所謂溫故而知新,可以為師矣,

Linux中more和less命令用法

時間 quit ron 忽略 分頁 page tab 易用 linux中 一、more命令 more功能類似 cat ,cat命令是整個文件的內容從上到下顯示在屏幕上。 more會以一頁一頁的顯示方便使用者逐頁閱讀,而最基本的指令就是按空白鍵(space)就往下一頁顯示,按

ubuntu 中wget (下載)命令用法

-i nload linux用戶 .cn 寬帶 not found ould 包括 nod 轉載自:http://www.cnblogs.com/wuheng1991/p/5332764.html Linux wget是一個下載文件的工具,它用在命令行下。 對於Lin

Jar命令用法

虛擬機 人的 程序 打包成 exe lin pat 自動安裝 常見 JAR文件 JAR文件 全稱:Java Archive File , 意思是Java檔案文件。通常JAR文件是一種壓縮文件,與常見的ZIP壓縮文件兼容,通常被稱為JAR包。 JAR文件和ZIP文件的區別:在

#26 Linux kernel(內核)詳解與uname、lsmod、modinfo、depmod、insmod、rmmod、modprobe...命令用法

linux kernel(內核)詳解與uname、lsmod、modinfo、depmod、insmod、rmmod、modprobe...命令用法Linux kernel: 內核設計流派: 單內核設計,但是充分借鑒了微內核體系設計的優點,為內核引入了模塊化機制,內核高度模塊化; 內核被模塊化之

LINUX 筆記-vmstat命令

runnable locks idle log linux 筆記 interrupt pre waiting logs procs -----------memory---------- ---swap-- -----io---- -system-- ------cp

tee命令用法

lin 常用 格式 保存到文件 不存在 多個 標準輸入 tee font 用途說明 在執行Linux命令時,我們可以把輸出重定向到文件中,比如 ls >a.txt,這時我們就不能看到輸出了,如果我們既想把輸出保存到文件中,又想在屏幕上看到輸出內容,就可以使用tee命

vmstat命令淺析

發送 調整 內存交換 mov 原理 目錄 大量 host 性能測試   vmstat命令是最常見的Linux/Unix監控工具,可以展現給定時間間隔的服務器的狀態值,包括服務器的CPU使用率,內存使用,虛擬內存交換情況,IO讀寫情況。這個命令是我查看Linux/Unix最喜

find命令用法整理

find命令find命令 可以定位文件,配合參數可以快速定位所要找的文件使用方法:find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]常用的幾個[expression]

關於linux的進階命令用法之來自noob的小結(1)

linux命令 寫的很雜,先這樣,下午再來細細排版與貼圖umask 查詢當前shell的mask值umask xxx 可以設置當前目錄的mask值vim .bashrc 可以編輯當前用戶shell的mask值並且永久保存,source 後生效-S 可以用rwx顯示出當前的去掉的

0.1 使用w查看系統負載 - 10.2 vmstat命令 - 10.3 top命令 - 10.4 sar命令 - 10.5 nload命令

使用 查看 系統負載 - 10.1 使用w查看系統負載 - 10.2 vmstat命令 - 10.3 top命令 - 10.4 sar命令 - 10.5 nload命令 # 10.1 使用w查看系統負載 ![mark](http://oqxf7c508.bkt.clouddn.com/blo

性能測試中vmstat命令的常見使用。

比較 程序 例如 -s read pen 負載 寫入 線程數 vmstat是Linux中常用的一個命令,尤其是在進行性能測試時,使用該命令,往往能輔助我們進行性能問題定位。 我們先看一下這個命令執行得到的數據。 [[email protected] ~]# vms

linux中wc命令用法

字節 統計字符 -- 幫助信息 linux系統 count 沒有 標準 讀取 Linux系統中的wc(Word Count)命令的功能為統計指定文件中的字節數、字數、行數,並將統計結果顯示輸出。 1.命令格式: wc [選項]文件... 2.命令功能: 統計指定文件中的字節

MySql之ALTER命令用法詳細解讀(轉)

修改表 pre const 命令使用 add ear 修改 blog rain 本文詳細解讀了MySql語法中Alter命令的用法,這是一個用法比較多的語法,而且功能還是很強大的。 USE learning;(自己要提前建好) CREATE TABLE student

Linux基礎之常見命令用法(一)

linux基礎命令入門(一)一、Linux文件目錄結構 在講述之前,先簡短的說說Windows文件結構,打開‘計算機’,看到的一個個的驅動器(盤符,例C盤、D盤等),點開其中任意盤符,看到的是一個個文件或文件夾,繼續打開...,每個盤都有自己的根目錄。若是把其打開過程畫下來,便可得到如下多棵倒樹並列的圖