以java平臺為基礎,專注項目管理、關注電子商務
          攬住母親的肩頭,敬父親一杯酒,對愛的女人說“我愛你”,和另外一個男人打架,不要打女人,有一個自己的孩子,年輕的時候去漂泊,有自己的一份事業(yè).

          ???????CPU 的占用主要取決于什么樣的資源正在 CPU 上面運行,比如拷貝一個文件通常占用較少 CPU,因為大部分工作是由 DMA(Direct Memory Access)完成,只是在完成拷貝以后給一個中斷讓 CPU 知道拷貝已經(jīng)完成;科學計算通常占用較多的 CPU,大部分計算工作都需要在 CPU 上完成,內(nèi)存、硬盤等子系統(tǒng)只做暫時的數(shù)據(jù)存儲工作。要想監(jiān)測和理解 CPU 的性能需要知道一些的操作系統(tǒng)的基本知識,比如:中斷、進程調(diào)度、進程上下文切換、可運行隊列等。用個例子來簡單介紹一下這些概念和他們的關系,CPU 很無辜,是個任勞任怨的打工仔,每時每刻都有工作在做(進程、線程)并且自己有一張工作清單(可運行隊列),由老板(進程調(diào)度)來決定他該干什么,他需要和老板溝通以便得到老板的想法并及時調(diào)整自己的工作(上下文切換),部分工作做完以后還需要及時向老板匯報(中斷),所以打工仔(CPU)除了做自己該做的工作以外,還有大量時間和精力花在溝通和匯報上。

          CPU 也是一種硬件資源,和任何其他硬件設備一樣也需要驅(qū)動和管理程序才能使用,我們可以把內(nèi)核的進程調(diào)度看作是 CPU 的管理程序,用來管理和分配 CPU 資源,合理安排進程搶占 CPU,并決定哪個進程該使用 CPU、哪個進程該等待。操作系統(tǒng)內(nèi)核里的進程調(diào)度主要用來調(diào)度兩類資源:進程(或線程)和中斷,進程調(diào)度給不同的資源分配了不同的優(yōu)先級,優(yōu)先級最高的是硬件中斷,其次是內(nèi)核(系統(tǒng))進程,最后是用戶進程。每個 CPU 都維護著一個可運行隊列,用來存放那些可運行的線程。線程要么在睡眠狀態(tài)(blocked 正在等待 IO)要么在可運行狀態(tài),如果 CPU 當前負載太高而新的請求不斷,就會出現(xiàn)進程調(diào)度暫時應付不過來的情況,這個時候就不得不把線程暫時放到可運行隊列里。VPSee 在這里要討論的是性能監(jiān)測,上面談了一堆都沒提到性能,那么這些概念和性能監(jiān)測有什么關系呢?關系重大。如果你是老板,你如何檢查打工仔的效率(性能)呢?我們一般會通過以下這些信息來判斷打工仔是否偷懶:

          • 打工仔接受和完成多少任務并向老板匯報了(中斷);
          • 打工仔和老板溝通、協(xié)商每項工作的工作進度(上下文切換);
          • 打工仔的工作列表是不是都有排滿(可運行隊列);
          • 打工仔工作效率如何,是不是在偷懶(CPU 利用率)。

          現(xiàn)在把打工仔換成 CPU,我們可以通過查看這些重要參數(shù):中斷、上下文切換、可運行隊列、CPU 利用率來監(jiān)測 CPU 的性能。

          底線

          上一篇 Linux 性能監(jiān)測:介紹(一) 提到了性能監(jiān)測前需要知道底線,那么監(jiān)測 CPU 性能的底線是什么呢?通常我們期望我們的系統(tǒng)能到達以下目標:

          • CPU 利用率,如果 CPU 有 100% 利用率,那么應該到達這樣一個平衡:65%-70% User Time,30%-35% System Time,0%-5% Idle Time;
          • 上下文切換,上下文切換應該和 CPU 利用率聯(lián)系起來看,如果能保持上面的 CPU 利用率平衡,大量的上下文切換是可以接受的;
          • 可運行隊列,每個可運行隊列不應該有超過1-3個線程(每處理器),比如:雙處理器系統(tǒng)的可運行隊列里不應該超過6個線程。

          vmstat

          vmstat 是個查看系統(tǒng)整體性能的小工具,小巧、即使在很 heavy 的情況下也運行良好,并且可以用時間間隔采集得到連續(xù)的性能數(shù)據(jù)。

          				$ vmstat 1
          procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
           r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
           2  1    140 2787980 336304 3531996  0    0     0   128 1166 5033  3  3 70 25  0
           0  1    140 2788296 336304 3531996  0    0     0     0 1194 5605  3  3 69 25  0
           0  1    140 2788436 336304 3531996  0    0     0     0 1249 8036  5  4 67 25  0
           0  1    140 2782688 336304 3531996  0    0     0     0 1333 7792  6  6 64 25  0
           3  1    140 2779292 336304 3531992  0    0     0    28 1323 7087  4  5 67 25  0
          		

          參數(shù)介紹:

          • r,可運行隊列的線程數(shù),這些線程都是可運行狀態(tài),只不過 CPU 暫時不可用;
          • b,被 blocked 的進程數(shù),正在等待 IO 請求;
          • in,被處理過的中斷數(shù)
          • cs,系統(tǒng)上正在做上下文切換的數(shù)目
          • us,用戶占用 CPU 的百分比
          • sys,內(nèi)核和中斷占用 CPU 的百分比
          • wa,所有可運行的線程被 blocked 以后都在等待 IO,這時候 CPU 空閑的百分比
          • id,CPU 完全空閑的百分比

          舉兩個現(xiàn)實中的例子來實際分析一下:

          				$ vmstat 1
          procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
           r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
           4  0    140 2915476 341288 3951700  0    0     0     0 1057  523 19 81  0  0  0
           4  0    140 2915724 341296 3951700  0    0     0     0 1048  546 19 81  0  0  0
           4  0    140 2915848 341296 3951700  0    0     0     0 1044  514 18 82  0  0  0
           4  0    140 2915848 341296 3951700  0    0     0    24 1044  564 20 80  0  0  0
           4  0    140 2915848 341296 3951700  0    0     0     0 1060  546 18 82  0  0  0
          		

          從上面的數(shù)據(jù)可以看出幾點:

          1. interrupts(in)非常高,context switch(cs)比較低,說明這個 CPU 一直在不停的請求資源;
          2. user time(us)一直保持在 80% 以上,而且上下文切換較低(cs),說明某個進程可能一直霸占著 CPU;
          3. run queue(r)剛好在4個。
          				$ vmstat 1
          procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
           r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
          14  0    140 2904316 341912 3952308  0    0     0   460 1106 9593 36 64  1  0  0
          17  0    140 2903492 341912 3951780  0    0     0     0 1037 9614 35 65  1  0  0
          20  0    140 2902016 341912 3952000  0    0     0     0 1046 9739 35 64  1  0  0
          17  0    140 2903904 341912 3951888  0    0     0    76 1044 9879 37 63  0  0  0
          16  0    140 2904580 341912 3952108  0    0     0     0 1055 9808 34 65  1  0  0
          		

          從上面的數(shù)據(jù)可以看出幾點:

          1. context switch(cs)比 interrupts(in)要高得多,說明內(nèi)核不得不來回切換進程;
          2. 進一步觀察發(fā)現(xiàn) system time(sy)很高而 user time(us)很低,而且加上高頻度的上下文切換(cs),說明正在運行的應用程序調(diào)用了大量的系統(tǒng)調(diào)用(system call);
          3. run queue(r)在14個線程以上,按照這個測試機器的硬件配置(四核),應該保持在12個以內(nèi)。

          mpstat

          mpstat 和 vmstat 類似,不同的是 mpstat 可以輸出多個處理器的數(shù)據(jù),下面的輸出顯示 CPU1 和 CPU2 基本上沒有派上用場,系統(tǒng)有足夠的能力處理更多的任務。

          				$ mpstat -P ALL 1
          Linux 2.6.18-164.el5 (vpsee) 	11/13/2009
          
          02:24:33 PM  CPU   %user   %nice    %sys %iowait    %irq   %soft  %steal   %idle    intr/s
          02:24:34 PM  all    5.26    0.00    4.01   25.06    0.00    0.00    0.00   65.66   1446.00
          02:24:34 PM    0    7.00    0.00    8.00    0.00    0.00    0.00    0.00   85.00   1001.00
          02:24:34 PM    1   13.00    0.00    8.00    0.00    0.00    0.00    0.00   79.00    444.00
          02:24:34 PM    2    0.00    0.00    0.00  100.00    0.00    0.00    0.00    0.00      0.00
          02:24:34 PM    3    0.99    0.00    0.99    0.00    0.00    0.00    0.00   98.02      0.00
          		

          ps

          如何查看某個程序、進程占用了多少 CPU 資源呢?下面是 Firefox 在一臺服務器的 運行情況,當前只有2個用戶在使用 Firefox:

          				$ while :; do ps -eo pid,ni,pri,pcpu,psr,comm | grep 'firefox'; sleep 1; done
          
            PID  NI PRI %CPU PSR COMMAND
           7252   0  24  3.2   3 firefox
           9846   0  24  8.8   0 firefox
           7252   0  24  3.2   2 firefox
           9846   0  24  8.8   0 firefox
           7252   0  24  3.2   2 firefox
          		
          posted on 2010-10-26 10:19 cssseek 閱讀(2218) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導航:
           

          <2010年10月>
          262728293012
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          友情鏈接

          最新隨筆

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 平陆县| 临汾市| 漠河县| 内江市| 葫芦岛市| 桑植县| 乐业县| 边坝县| 精河县| 广河县| 定西市| 嘉鱼县| 天气| 红桥区| 醴陵市| 庆云县| 承德市| 顺昌县| 汉阴县| 吉安市| 玉龙| 宁波市| 邯郸市| 平阴县| 仁化县| 保亭| 砀山县| 阆中市| 米林县| 伽师县| 贺兰县| 沙田区| 库尔勒市| 库车县| 油尖旺区| 黄山市| 汝阳县| 左云县| 武隆县| 汝州市| 麻阳|