Document #: 2811993L22000 Body: [标題] 如何使用vmstat指令監視 CPU 的使用情況 内容提要: CPU 處理單元是系統中最快的元件。在某一時間對單個程式來說,相對很少保持 100% 的 CPU 占用率(也就是說, 空閑 0% ,等待 0% )超過幾秒鐘。甚至在高負載的多使用者系統中,偶爾會出現一些 10 毫秒(ms )的時期,在其結 束時所有線程處于等待狀态。如果一個螢幕顯示在一段延長的時期内 CPU 占用率為 100% ,很有可能是陷入了死 循環。甚至如果該程式“僅僅”是占用較多資源,而不是崩潰了,也需要将它識别出來并進行處理。 說明: CPU 處理單元是系統中最快的元件。在某一時間對單個程式來說,相對很少保持 100% 的 CPU 占用率(也就是說, 空閑 0% ,等待 0% )超過幾秒鐘。甚至在高負載的多使用者系統中,偶爾會出現一些 10 毫秒(ms )的時期,在其結 束時所有線程處于等待狀态。如果一個螢幕顯示在一段延長的時期内 CPU 占用率為 100% ,很有可能是陷入了死 循環。甚至如果該程式“僅僅”是占用較多資源,而不是崩潰了,也需要将它識别出來并進行處理。 在這裡,要使用的工具是 vmstat 指令,該指令可提供關于各種系統資源和各種與之相關的性能問題的簡明資訊。 vmstat 指令報告了關于核心線程的統計資訊,包括處于運作和等待隊列中的、記憶體中的、頁面排程中的、磁盤中的、 中斷、系統調用、上下文切換和 CPU 活動的核心線程。所報告的 CPU 活動是使用者模式、系統模式、空閑時間和等待 磁盤 I/O 的百分比細分類目。 注:如果使用 vmstat 指令時不帶任何選項,或者隻帶有間隔和任意的計數參數,例如 vmstat 2 10 ,那麼第一行數 字為自系統重新開機以來的平均值。 作為一個 CPU 螢幕,vmstat 指令比 iostat 指令優先級要高,因為 vmstat 指令是滾動的,使得它的每報告一行的輸 出更容易掃描,并且如果有很多磁盤連接配接到系統中,由此所引起的開銷更少。 下面的例子會幫助您識别一個程式失控時或過度占用 CPU 以至于不能在一個多使用者環境中運作的情況。 -
# vmstat 2 kthr memory page faults cpu ----- ----------- ------------------------ ------------ ----------- r b avm fre re pi po fr sr cy in sy cs us sy id wa 1 0 22478 1677 0 0 0 0 0 0 188 1380 157 57 32 0 10 1 0 22506 1609 0 0 0 0 0 0 214 1476 186 48 37 0 16 0 0 22498 1582 0 0 0 0 0 0 248 1470 226 55 36 0 9 2 0 22534 1465 0 0 0 0 0 0 238 903 239 77 23 0 0 2 0 22534 1445 0 0 0 0 0 0 209 1142 205 72 28 0 0 2 0 22534 1426 0 0 0 0 0 0 189 1220 212 74 26 0 0 3 0 22534 1410 0 0 0 0 0 0 255 1704 268 70 30 0 0 2 1 22557 1365 0 0 0 0 0 0 383 977 216 72 28 0 0 2 0 22541 1356 0 0 0 0 0 0 237 1418 209 63 33 0 4 1 0 22524 1350 0 0 0 0 0 0 241 1348 179 52 32 0 16 1 0 22546 1293 0 0 0 0 0 0 217 1473 180 51 35 0 14 這個輸出結果顯示了在一個繁忙的多使用者系統中引入一個有死循環的程式所帶來的效果。最開始的三個報告(摘要已 被删除)表明系統穩定在使用者模式 50 —55% 、系統模式 30 —35% 和 I/O 等待 10 —15% 。當循環程式開始運作,所有的 CPU 周期被占用。因為循環程式不進行 I/O ,是以它可以占有前面因為 I/O 等待而未用的所有周期。更糟糕的是這意味 着,當一個有用程序放棄 CPU 的使用權時,這個程序總是準備占用 CPU 。因為死循環程式的優先級與所有其它前台進 程一樣,是以當另一個程序變得可排程時它也沒必要讓出 CPU 的使用權。該程式運作大約 10 秒鐘(五個報告),然後 由 vmstat 指令報告的活動恢複到較正常的模式。 CPU 統計資訊在裝置中斷負載很高的系統上會有一定程度的失真。這種情況是因為該工具是對定時器中斷采樣。定時 器是優先級最低的裝置,是以它很容易被其它中斷搶先。為了消除失真,當作業系統版本晚于 AIX 4.3.3 時, 采用了一 種不同的方法來對定時器進行采樣。 注:對對稱多處理系統 us、sy、id 和 wa 幾列隻是對各處理器求平均值(sar 指令可以報告每個處理器的統計資訊)。 一個 I/O 等待和空閑時間 隻能從未決 I/O 的狀态來區分。如果有一個未決磁盤 I/O,并且處理器不忙,那麼這 是一個 I/O 等待時間。AIX 4.3.3 和其後的系統中用一個增強的方法來計算花費在磁盤 I/O 上的 CPU 時間 (wio 時間)所占的百分比。 在最佳使用時,CPU 在 100% 的時間中都在工作。在單使用者系統中更是這樣,這裡不需要共享 CPU。總的來說,如果 us + sy 時間低于 90%,則不認為該單使用者系統 CPU 受限制。但是,如果在一個多使用者系統中 us + sy時間超過 80%, 其中的程序将要花時間在運作隊列中等待。響應時間和吞吐量會受損害。 要檢查 CPU 是否是瓶頸,考慮 vmstat 報告中的四個 cpu 列和兩個 kthr (核心線程)列,也應該檢視 faults 列。 cpu列 在該時間間隔内使用 CPU 時間的百分比細分。cpu 列如下: us 參數 us 列顯示了使用者模式所消耗的 CPU 時間。一個 UNIX 程序可以在使用者模式下執行,也可以在系統(核心)模式下執 行。當在使用者模式下執行時,程序在它自己的應用程式代碼中之行,不需要核心資源來進行計算、管理記憶體或設定變 量。 sy 參數 sy 列詳細顯示了 CPU 在系統模式下執行一個線程所花時間的百分比。包括核心程序(kprocs )和其它需要通路核心資 源的程序所消耗的 CPU 資源。如果一個程序需要核心資源,它必須執行一個系統調用,并是以被切換到系統模式從 而可以使用該資源。例如,對一個檔案的讀或寫操作需要核心資源來打開檔案、尋找指定的位置和讀寫資料,除非使 用記憶體映射檔案。 id 參數 id 列顯示了沒有未決本地磁盤 I/O 時 CPU 空閑或等待時間的百分比。如果沒有線程可以執行(運作隊列為空)系 統排程一個叫做 wait 的線程,也就是 idlekproc 。在一個對稱多處理系統中,每個處理器都有一個 wait 線程可調 度。由 ps 指令(帶有 -k 或 -g 0 選項)将它确定為 kproc 或 wait。如果報告中 ps 顯示這個線程的總計時間高, 這表明存在顯著的時期,沒有其它線程在這個 CPU 上準備運作或等待執行。系統是以大部分時間或任務空閑和等待 新任務。 如果沒有未決 I/O,所有用于等待的時間歸入空閑時間中。在4.3.2版或更早的作業系統中,通路遠端磁盤(安裝 NFS 磁盤)被當作空閑時間(有少量 sy 時間來執行 NFS 請求),因為沒有對本地磁盤的未決 I/O 請求。在 AIX 4.3.3 和 以後的系統中,NFS 通過緩沖區高速緩存,在這些例程中的等待被放入 wa 中統計。 wa 參數 wa 列詳細顯示了有未決本地磁盤 I/O 時 CPU 空閑的時間百分比(在 AIX 4.3.3 和以後版本的系統中,對安裝了 NFS 的磁盤也是這樣)。如果當等待正在運作時至少有一個未完成的磁盤 I/O,該時間歸入等待 I/O 的時間。除非 該程序使用異步 I/O,否則對磁盤的 I/O 請求使調用線程被阻塞(或睡眠)直到請求被完成。一旦程序的 I/O 請求 完成,該程序被放入運作隊列中。如果 I/O 很快完成,該程序可以使用更多的 CPU 時間。 wa 的值如果超過 25%,就表明磁盤子系統可能沒有被正确平衡,或者這也可能是磁盤工作負荷很重的結果。 Kthr 列 每秒鐘在采樣間隔上對各種隊列中的核心線程數求得的平均值。kthr 列如下: r 參數 可運作的核心線程平均數目,包括正在運作的線程和等待 CPU 的線程。如果這個數字大于 CPU 的數目,至少有一個 線程要等待 CPU,等待 CPU 的線程越多,越有可能對性能産生影響。 b 參數 每秒 VMM 等待隊列中的核心線程平均數。包括正在等待檔案系統 I/O 的線程,或由于記憶體裝入控制而被挂起的線程。 如果程序由于記憶體裝入控制而被挂起,在 vmstat 報告中的阻塞列(b)表明線程數目增加,而不是運作隊列中線程 數目增加。 p 參數 對與 vmstat -I ,是每秒等待原始裝置 I/O 的線程數目。等待檔案系統 I/O 的線程不包括在這裡。 faults 列 關于程序控制的資訊,如陷阱和中斷率。faults 列如下: in 參數 在該時間間隔中觀測到的每秒裝置中斷數。額外資訊可見用 vmstat 指令評估磁盤性能。 sy 參數 在該時間間隔中觀測到的每秒系統調用次數。通過明确的系統調用,使用者程序可以使用資源。這些調用指令核心為調 用線程執行操作,并在核心和該程序之間交換資料。因為,工作負荷和應用程式變化很大,不同的調用執行不同的功 能,是以不可能定義每秒鐘有多少系統調用才算太多。但是通常來講,在一個單處理器系統上當 sy 列增大到超過每 秒鐘 10000 個調用, 應進行進一步的調查(在一個對稱多處理系統上,這個數字為每個處理器每秒鐘 10000 個調 用)。其中一個原因可能是“輪詢”子例程,象 select() 子例程。對這列,建議進行一個基準評估,給出正常 sy 值 的一個計數。 cs 參數 在該時間間隔中觀測到的每秒鐘上下文切換次數。實體上的 CPU 資源被分為每個 10 毫秒的邏輯時間片。假設一個 線程被排程運作,它将一直運作直到它的時間片用完、直到被搶先或直到它自己主動放棄 CPU 控制權。當另一個線 程被賦予 CPU 控制權時,必須儲存前一個線程的上下文或工作環境,并載入目前線程的上下文。作業系統有一個很 有效的上下文切換過程,是以每次切換并不耗費資源。任何上下文切換的顯著增加,如當 cs 比磁盤 I/O 和網絡包 速率高的多,都應進行進一步調查。 參考資料: |