通過vmstat學習CPU和進程性能監控

vmstat是一個很全面的性能分析工具,可以觀察到系統的進程狀態、虛擬內存使用、磁盤的IO、中斷、上下文切換、CPU使用等情況。在操作系統性能分析中,能100%理解vmstat輸出的含義並靈活應用,是性能分析必備的基本能力。

本次學習從vmstat下手,研究CPU的三個重要運行指標:上下文切換(context switchs)、運行隊列(Run queue)和使用率(utilization),日常運維過程中經常根據這三個指標來判斷CPU的性能和系統整體性能,但這三個指標不是孤立的,它們有一個共同的聯繫紐帶:進程。

圖1vmstat運行截圖


1. 進程工作模式和上下文切換

進程是在操作系統中運行的特定程序或執行的任務。進程是程序的運行過程,是隨執行過程不斷變化的實體。和程序包含指令和數據一樣,進程也包含程序計數器和所有CPU寄存器的值,同時它的堆棧中存儲着子程序參數、返回地址以及變量等臨時數據。

1.1 進程的兩種工作模式

內核態和用戶態是現代操作系統進程的兩種工作模式,內核態運行在內核空間,而用戶態應用程序運行在用戶空間。它們代表不同的級別,而對系統資源具有不同的訪問權限。內核態運行在最高級別,這個級下所有的操作都受系統信任;而用戶態運行在較低級別。在內核態時,處理器控制着對硬件的直接訪問以及對內存的非授權訪問。內核態和用戶態有自己的內存映射,即自己的地址空間。

進程的用戶態切換到內核態有3種方式,但這三種方式只是進程內部的模式切換。

a、 系統調用:這是用戶態進程主動要求切換到內核態的一種方式,用戶態進程通過系統調用申請使用操作系統提供的服務程序完成工作,如創建新進程。系統調用的機制核心還是使用了操作系統為用戶特別開放的一個中斷來實現。

b、 異常中斷:當CPU在執行運行在用戶態下的程序時,發生了某些事先不可知的異常,這時會觸發由當前運行進程切換到處理此異常的內核相關程序中,也就轉到了內核態,比如缺頁異常。

c、 外圍設備的中斷:當外圍設備完成用戶請求的操作後,會向CPU發出相應的中斷信號,這時CPU會暫停執行下一條即將要執行的指令轉而去執行與中斷信號對應的處理程序,如果先前執行的指令是用戶態下的程序,那麼這個轉換的過程自然也就發生了由用戶態到內核態的切換。如硬盤讀寫操作完成,系統會切換到硬盤讀寫的中斷處理程序中執行後續操作等。

1.2 上下文切換

進程上下文:就是一個進程在執行的時候,CPU的所有寄存器中的值、進程的狀態、堆棧上的內容、進程打開的文件以及內存信息等,是進程運行的環境。

上下文切換(context switch)可以分為三種情況:

a、 當內核需要從一個進程內核態切換到另一個進程內核態時,它需要保存當前進程的所有狀態然後加載下一個進程的狀態,即保存當前進程的進程上下文,以便再次執行該進程時,能夠恢復切換時的狀態,繼續執行。

b、 進程由用戶態切換到內核態,由用戶空間轉化為內核空間。可能由系統調用或設備中斷引起,但不是所有的系統調用或設備中斷都會觸發上下文切換,那些在內核態中的系統調用和設備中斷是不會引起上下文切換的。

c、 有時一個硬件中斷的產生,也可能導致內核收到中斷信號後由進程上下文切換到中斷上下文。

無論哪種上下文切換,只要切換次數多都會影響CPU性能,這時線程就有非常大的優勢。

1.3 線程

線程是一種輕量進程,實際上在內核中,兩者幾乎沒有差別,除了一點:線程並不產生新的地址空間和資源描述符表,而是復用父進程的。但是無論如何,線程的調度和進程一樣,必須切換到內核態。

進程優點是業務隔離,一個進程出現錯誤不會影響整個系統。如Oracle數據庫服務器傳統上就是進程模型。進程缺點是進程的分配和釋放有非常高的成本。因此Oracle數據庫需要連接池來保持連接減少新建和釋放,同時盡量復用連接而不是隨意的新建連接。

線程優點是更輕量,建立和釋放速度更快,而且多個上下文間的通訊速度非常快。Web服務器傳統上就是線程模型。線程缺點是一個線程出現問題容易將整個系統搞崩潰。

1.4 Vmstat工具faults欄(系統中斷/切換)參數

熟悉了以上概念,對vmstat指令中faults欄就會有直觀的理解了(見圖1):

1) in:(non clock) device interrupts 設備中斷,IO繁忙的系統(數據庫系統),進程經常性等待IO中斷進入內核態運行,所以設備中斷比較高。

2) sy:system calls系統調用,統計進程內部模式切換的系統調用和進程內核態內部系統調用的總數。Linux系統vmstat中沒有這一項,認為系統調用也是中斷。

3) cs:context switch上下文切換,統計進程間(線程間)上下文切換、進程(線程)模式切換和硬件中斷的總數。CPU繁忙的系統(web系統)上下文切換較多,可以調整進程/線程數比或者通過進程復用的方法來降低上下文切換總量。


2. CPU利用率

在使用vmstat時一般認為CPU欄sy是系統進程CPU佔用率,us是用戶進程CPU佔用率;但學習了進程工作模式和上下文切換後,發現這種認識是錯誤的,真實表述如下:

圖2 Linux系統vmstat運行截圖

1) us列顯示了所有進程用戶態消耗CPU的時間百分比。us值比較高時,說明進程用戶態消耗的CPU時間多,如果長期大於50%,需要考慮優化應用程序。

2) sy列顯示了所有進程內核態消耗CPU的時間百分比。sy值比較高時,說明進程內核態消耗的CPU時間多;如果us+sy超過80%,就表明CPU資源存在不足。

3) id列顯示了CPU處在空閑狀態的時間百分比;

4) wa列表示進程IO等待所佔CPU時間百分比。wa值越高,說明IO等待越嚴重。如果wa值超過20%,說明IO等待嚴重。wa僅在Linux系統vmstat中顯示。

5) st列代表虛擬機佔用CPU時間百分比。st僅在Linux系統vmstat中顯示。

圖3 Linux系統top截圖

6) ni:用做nice加權的進程分配的用戶態cpu時間百分比

7) hi:硬中斷消耗CPU時間百分比

8) si:軟中斷消耗CPU時間百分比

9) st:虛擬機使用CPU時間百分比


3. 進程生命周期、狀態和進程隊列

3.1 生命周期

每個進程都經歷了創建、運行和死亡的周期,但最精彩的始終是運行部分。

圖4 進程生命周期

3.2 進程狀態及狀態轉換

下面是Linux內核中對進程狀態的定義(其它類Unix系統的進程狀態類似):

下圖是Linux和HPUX系統進程狀態切換圖,兩個系統相似但又有細微不同:

圖5 linux和HPUX進程狀態變換圖

下表是常見進程狀態詳解:

圖6 進程狀態詳解

圖7 glance中所有阻塞狀態

圖8 glance運行截圖

3.3 vmstat中procs進程統計

通過以上介紹,我們可以詳細解釋vmstat工具procs進程統計部分三個參數含義:

1) r:代表CPU運行隊列中進程數。原則上1核的CPU的運行隊列不要超過2,整個系統的運行隊列不能超過總核數的2倍,否則代表系統壓力過大。

2) b:代表處於等待IO、內存頁等資源的被阻塞的進程數,在Linux系統top中就是處於D狀態(不可中斷等待狀態)的進程數;在HPUX系統glance工具中統計處於CDFS、VM和IO狀態的進程數。

3) w:代表可以進入運行隊列,但由於進程切換被切換出內核態的進程數。此參數只在HPUX系統的vmstat工具中存在。


4. 總結

性能監控和優化是一個龐大而又嚴謹的體系,要深入研究只能通過原理、實現和工具三方面結合,本文只是管中窺豹學習了CPU調度和進程管理,希望對大家的運維工作有所幫助。