Linux-cpu分析-vmstat

一. 前言
爲了更方便的理解本篇內容含義,所以請最好看看如下繁瑣的概念,更容易理解。
沒懂這些概念,就算看完你就只能知道,運行下vmstat ,看看linux反饋結果而已,更要知其所以然嘛~
 
先說說內存的概念。
不是講cpu嗎講它幹嘛?因爲這個內存在互相轉換的時候是會消耗cpu的。至於爲什麼要轉換?耐心往下看吧。
Linux系統的內存分爲物理內存虛擬內存兩種。物理內存是真實的,也就是物理內存條上的內存。而虛擬內存則是採用硬盤空間補充物理內存(很關鍵,他倆速度不一樣有區別呀),將暫時不使用的內存頁寫到硬盤上以騰出更多的物理內存讓有需要的進程使用。當這些已被騰出的內存頁需要再次使用時才從硬盤(虛擬內存)中讀回內存。這一切對於用戶來說是透明的。通常對Linux系統來說,虛擬內存就是swap分區。

好了,下面引出本次的重頭戲: vmstat
vmstat(VirtualMeomoryStatistics,虛擬內存統計)是Linux中監控內存的常用工具,可對操作系統的虛擬內存、進程、CPU等的整體情況進行監視該命令可以顯示關於系統各種資源之間相關性能的簡要信息,這裏我們主要用它來看CPU的一個負載情況。

在系統中運行的每個進程都需要使用到物理內存,但不是每個進程都需要每時每刻使用系統分配的內存空間。當系統運行所需內存超過實際的物理內存,內核會釋放某些進程所佔用但未使用的部分或所有物理內存,將這部分資料存儲在磁盤上直到進程下一次調用,並將釋放出的內存提供給有需要的進程使用。【這就是上邊說的內存轉換的過程】
Linux內存管理中,主要是通過“調頁Paging”和“交換Swapping”來完成上述的內存調度。調頁算法是將內存中最近不常使用的頁面換到磁盤上,把活動頁面保留在內存中供進程使用。交換技術是將整個進程,而不是部分頁面,全部交換到磁盤上。分頁(Page)寫入磁盤的過程被稱作Page-Out,分頁(Page)從磁盤重新回到內存的過程被稱作Page-In。
當系統內核發現可運行內存變少時,就會通過Page-Out來釋放一部分物理內存。經管Page-Out不是經常發生,但是如果Page-out頻繁不斷的發生,直到當內核管理分頁的時間超過運行程式的時間時,系統效能會急劇下降。這時的系統已經運行非常慢或進入暫停狀態,這種狀態亦被稱作thrashing(顛簸)。【上邊爲什麼會消耗cpu的原因】

二.效果展示
vmstat 3 5 //每三秒輸出一條信息,共輸出5條


新手來說,是不是有些蒙,別說聯合各項數據分析瓶頸了,先說說各個參數啥意思吧。
或者,換一種看法,下邊的注意很重要哦:


三.實際分析
1. r:運行隊列的等待進程數

r(run:運行隊列正在執行進程數)和 b(block等待CPU資源的進程個數)。當r超過了CPU數目,就會出現CPU瓶頸了

查看CPU的核的數量:cat /proc/cpuinfo|grep processor|wc -l


在評估cpu的性能優劣時完全照搬網上說的幾倍幾倍是不準確的,不能只看top裏的參數,還得你自己動手看看vmstat顯示的run值和blocked值,當出現明 顯較多的blocked的時候,就說明cpu產生了瓶頸。而top命令和uptime命令顯示的負載均值,只能作爲判斷系統過去某個時間段的狀態的參照, 與cpu的性能關係不大。

當r值超過了CPU個數,就會出現CPU瓶頸,解決辦法大體幾種:
1. 最簡單的就是增加CPU個數和核數
2. 通過調整任務執行時間,如大任務放到系統不繁忙的情況下進行執行,進爾平衡系統任務
3. 調整已有任務的優先級

(tips: vmstat中CPU的度量是百分比的。當us+sy的值接近100的時候,表示CPU正在接近滿負荷工作。
但要注意的是,CPU 滿負荷工作並不能說明什麼,Linux總是試圖要CPU儘可能的繁忙,使得任務的吞吐量最大化。
唯一能夠確定CPU瓶頸的還是r(運行隊列)的值。)

2.cpu使用率
如果CPU的id(空閒率)長期低於10%,那麼表示CPU的資源已經非常緊張,應該考慮進程優化或添加更多地CPU。
wa(等待IO)表示CPU因等待IO資源而被迫處於空閒狀態,這時候的CPU並沒有處於運算狀態,而是被白白浪費了,所以“等待IO應該越小越好。”


【top命令和uptime命令顯示的負載均值,只能作爲判斷系統過去某個時間段的狀態的參照, 與cpu的性能關係不大。】

文章推薦:



2.sar命令
檢查CPU性能的第二個工具是sar,sar功能很強大,可以對系統的每個方面進行單獨的統計,但是使用sar命令會增加系統開銷,不過這些開銷是可以評估的,對系統的統計結果不會有很大影響。
下面是sar命令對某個系統的CPU統計輸出:

點擊(此處)摺疊或打開
  1. [root@webserver ~]# sar -u 3 5
  2. Linux 2.6.9-42.ELsmp (webserver) 11/28/2008 _i686_ (8 CPU)
  3. 11:41:24 AM CPU %user %nice %system %iowait %steal %idle
  4. 11:41:27 AM all 0.88 0.00 0.29 0.00 0.00 98.83
  5. 11:41:30 AM all 0.13 0.00 0.17 0.21 0.00 99.50
  6. 11:41:33 AM all 0.04 0.00 0.04 0.00 0.00 99.92
  7. 11:41:36 AM all 0.29 0.00 0.13 0.00 0.00 99.58
  8. 11:41:39 AM all 0.38 0.00 0.17 0.04 0.00 99.41
  9. Average: all 0.34 0.00 0.16 0.05 0.00 99.45

對上面每項的輸出解釋如下:
 %user列顯示了用戶進程消耗的CPU 時間百分比。
 %nice列顯示了運行正常進程所消耗的CPU 時間百分比。
 %system列顯示了系統進程消耗的CPU時間百分比。
 %iowait列顯示了IO等待所佔用的CPU時間百分比
 %steal列顯示了在內存相對緊張的環境下pagein強制對不同的頁面進行的steal操作 。
 %idle列顯示了CPU處在空閒狀態的時間百分比。
 這個輸出是對系統整體CPU使用狀況的統計,每項的輸出都非常直觀,並且最後一行Average是個彙總行,是上面統計信息的一個平均值。
 需要注意的一點是:第一行的統計信息中包含了sar本身的統計消耗,所以%user列的值會偏高一點,不過,這不會對統計結果產生多大影響。
 在一個多CPU的系統中,如果程序使用了單線程,會出現這麼一個現象,CPU的整體使用率不高,但是系統應用卻響應緩慢,這可能是由於程序使用單線程的原因,單線程只使用一個CPU,導致這個CPU佔用率爲100%,無法處理其它請求,而其它的CPU卻閒置,這就導致 了整體CPU使用率不高,而應用緩慢 現象的發生 。
 針對這個問題,可以對系統的每個CPU分開查詢,統計每個CPU的使用情況:

點擊(此處)摺疊或打開
  1. [root@webserver ~]# sar -P 0 3 5
  2. Linux 2.6.9-42.ELsmp (webserver) 11/29/2008 _i686_ (8 CPU)
  3. 06:29:33 PM CPU %user %nice %system %iowait %steal %idle
  4. 06:29:36 PM 0 3.00 0.00 0.33 0.00 0.00 96.67
  5. 06:29:39 PM 0 0.67 0.00 0.33 0.00 0.00 99.00
  6. 06:29:42 PM 0 0.00 0.00 0.33 0.00 0.00 99.67
  7. 06:29:45 PM 0 0.67 0.00 0.33 0.00 0.00 99.00
  8. 06:29:48 PM 0 1.00 0.00 0.33 0.33 0.00 98.34
  9. Average: 0 1.07 0.00 0.33 0.07 0.00 98.53
這個輸出是對系統的第一顆CPU的信息統計,需要注意的是,sar中對CPU的計數是從0開始的,因此,“sar -P 0 3 5”表示對系統的第一顆CPU進行信息統計,“sar -P 4 3 5”則表示對系統的第五顆CPU進行統計。依次類推。可以看出,上面的系統有八顆CPU。

3 iostat命令
 iostat指令主要用於統計磁盤IO狀態,但是也能查看CPU的使用信息,它的侷限性是隻能顯示系統所有CPU的平均信息,看下面的一個輸出:

點擊(此處)摺疊或打開
  1. [root@webserver ~]# iostat -c
  2. Linux 2.6.9-42.ELsmp (webserver) 11/29/2008 _i686_ (8 CPU)
  3. avg-cpu: %user %nice %system %iowait %steal %idle
  4. 2.52 0.00 0.30 0.24 0.00 96.96
 在這裏,我們使用了“-c”參數,只顯示系統CPU的統計信息,輸出中每項代表的含義與sar命令的輸出項完全相同,不再詳述。


1.4 uptime命令
 uptime是監控系統性能最常用的一個命令,主要用來統計系統當前的運行狀況,輸出的信息依次爲:系統現在的時間、系統從上次開機到現在運行了多長時間、系統目前有多少登陸用戶、系統在一分鐘內、五分鐘內、十五分鐘內的平均負載。看下面的一個輸出:

點擊(此處)摺疊或打開
  1. [root@webserver ~]# uptime
  2. 18:52:11 up 27 days, 19:44, 2 users, load average: 0.12, 0.08, 0.08

這裏需要注意的是load average這個輸出值,這三個值的大小一般不能大於系統CPU的個數,例如,本輸出中系統有8個CPU,如果load average的三個值長期大於8時,說明CPU很繁忙,負載很高,可能會影響系統性能,但是偶爾大於8時,倒不用擔心,一般不會影響系統性能。相反,如果load average的輸出值小於CPU的個數,則表示CPU還有空閒的時間片,比如本例中的輸出,CPU是非常空閒的。







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章