cpu篇:
CPU 也是一種硬件資源,和任何其餘硬件設備同樣也須要驅動和管理程序才能使用,咱們能夠把內核的進程調度看做是
CPU 的管理程序,用來管理和分配 CPU 資源,合理安排進程搶佔 CPU,並決定哪一個進程該使用 CPU、哪一個進程該等待多線程
要想監測和理解 CPU 的性能須要知道一些的操做系統的基本知識,好比:中斷、進程調度、進程上下文切換、可運行
隊列等。這裏 VPSee 用個例子來簡單介紹一下這些概念和他們的關係,CPU 很無辜,是個不辭辛苦的打工仔,每時每
刻都有工做在作(進程、線程)而且本身有一張工做清單(可運行隊列),由老闆(進程調度)來決定他該幹什麼,他
須要和老闆溝通以便獲得老闆的想法並及時調整本身的工做(上下文切換),部分工做作完之後還須要及時向老闆彙報
(中斷),因此打工仔(CPU)除了作本身該作的工做之外,還有大量時間和精力花在溝通和彙報上。ide
進程調度給不一樣的資源分配了不一樣的優先級,優先級最高的是硬件中斷,其次是內核(系統)進程,最後是用戶進程。
每一個 CPU 都維護着一個可運行隊列,用來存放那些可運行的線程。線程要麼在睡眠狀態(blocked 正在等待 IO)要麼
在可運行狀態,若是 CPU 當前負載過高而新的請求不斷,就會出現進程調度暫時應付不過來的狀況,這個時候就不得
不把線程暫時放到可運行隊列裏。工具
打工仔接受和完成多少任務並向老闆彙報了(中斷);性能
打工仔和老闆溝通、協商每項工做的工做進度(上下文切換);測試
打工仔的工做列表是否是都有排滿(可運行隊列);spa
打工仔工做效率如何,是否是在偷懶(CPU 利用率)操作系統
上一篇 Linux 性能監測:介紹 提到了性能監測前須要知道底線,那麼監測 CPU 性能的底線是什麼呢?一般咱們指望咱們的系統能到達如下目標:線程
CPU 利用率,若是 CPU 有 100% 利用率,那麼應該到達這樣一個平衡:65%-70% User Time,30%-35% System Time,0%-5% Idle Time;code
上下文切換,上下文切換應該和 CPU 利用率聯繫起來看,若是能保持上面的 CPU 利用率平衡,大量的上下文切換是能夠接受的;orm
可運行隊列,每一個可運行隊列不該該有超過1-3個線程(每處理器),好比:雙處理器系統的可運行隊列裏不該該超過6個線程
vmstat 是個查看系統總體性能的小工具,小巧、即便在很 heavy 的狀況下也運行良好,而且能夠用時間間隔採集獲得連續的性能數據。
$ 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
參數介紹:
r,可運行隊列的線程數,這些線程都是可運行狀態,只不過 CPU 暫時不可用;
b,被 blocked 的進程數,正在等待 IO 請求;
in,被處理過的中斷數
cs,系統上正在作上下文切換的數目
us,用戶佔用 CPU 的百分比
sys,內核和中斷佔用 CPU 的百分比
wa,全部可運行的線程被 blocked 之後都在等待 IO,這時候 CPU 空閒的百分比
id,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 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
從上面的數據能夠看出幾點:
interrupts(in)很是高,context switch(cs)比較低,說明這個 CPU 一直在不停的請求資源;
user time(us)一直保持在 80% 以上,並且上下文切換較低(cs),說明某個進程可能一直霸佔着 CPU;
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
從上面的數據能夠看出幾點:
context switch(cs)比 interrupts(in)要高得多,說明內核不得不來回切換進程;
進一步觀察發現 system time(sy)很高而 user time(us)很低,並且加上高頻度的上下文切換(cs),說明正在運行的應用程序調用了大量的系統調用(system call);
run queue(r)在14個線程以上,按照這個測試機器的硬件配置(四核),應該保持在12個之內。
mpstat 和 vmstat 相似,不一樣的是 mpstat 能夠輸出多個處理器的數據,下面的輸出顯示 CPU1 和 CPU2 基本上沒有派上用場,系統有足夠的能力處理更多的任務。
$ 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
您擁有前面所述的 vmstat 時,您可能想知道 mpstat 命令的做用。差異很大:mpstat 能夠顯示每一個處理器的統計,
而 vmstat 顯示全部處理器的統計。所以,編寫糟糕的應用程序(不使用多線程體系結構)可能會運行在一個多處理器機器上,
而不使用全部處理器。從而致使一個 CPU 過載,而其餘 CPU 卻很空閒。經過 mpstat 能夠輕鬆診斷這些類型的問題