平時監控linux的運行性能的時候,一般咱們最早關注的就是CPU的相關指標了,如load,cpu的利用率等。下面就來簡單的介紹一下linux系統中咱們常常關注的幾個性能指標,有: Run Queue Statistics 若是想查看cpu的相關繁忙程度,咱們能夠經過查看系統中進程的狀態來作個簡單的判斷,比方說咱們能夠經過查看一下runnable進程的數目和blocked進程的數目來cpu的利用率等。 1)runnable 若是一個process在runnable狀態,這就意味着它和其餘一樣處在runnable狀態的process在等待CPU時間,而不是當即得到CPU時間,即咱們平時所說的「就緒」狀態,表示隨時能夠執行可是沒有在執行。 當process在runnable狀態時,表示其在等待CPU時間執行,這種狀態是不消耗CPU時間的,他們造成的等待隊列稱做Run Queue,Run Queue越大,表示等待的隊列越長。Linux調度進程,從runnable隊列中(Run Queue),選擇一個process下次執行,那麼這個process就會得到CPU時間,其就變成running狀態。 process的runnable和running狀態,在linux系統中用TASK_RUNNING這個全局變量來表示。TASK_RUNNING表示process正在被CPU執行,或者已經準備就緒隨時可由調度程序調度執行;若此時進程沒有被CPU執行,則稱其處於就緒狀態(runnable),若此時進程正在被CPU執行,則稱其處於執行狀態(running)。當一個進程在內核代碼中運行時,咱們稱其處於內核態;當一個進程正在執行用戶本身的代碼時,咱們稱其處於用戶態。當系統資源已經可用時,進程就被喚醒而進入準備運行狀態,也就是就緒狀態。這些狀態在內核中表示方法相同,都被稱爲TASK_RUNNING狀態。當一個進程剛被建立後就處於TASK_RUNNING狀態。 咱們平時常常說到的監控系統狀態的load(中文翻譯爲負載),就是這個TASK_RUNNING值,它就是指處在running和runnable的process的總和。例如:若是有兩個processes在running和有三個在等待運行(runnable),那麼系統的load爲五。load average是指在指定時間內load的平均值,通常load average顯示的三個數字的時間分別爲1分鐘,五分鐘和十五分鐘。 2)blocked waiting for an event to complete 一個blocked狀態的process可能在等待一個I/O操做獲取的數據,或者是一個系統調用的結果。 Context Switches 大部分如今的CPU在同一時間只能運行一個process,雖然也有一些CPU,例如超線程技術的CPU,能實現同時運行超過一個process,linux把這種CPU看做多個單線程CPU。 linux內核不斷的在不一樣process間切換,形成一個錯覺,讓人感受一個單CPU同時處理多個任務,不一樣process之間的切換稱做 Context Switch。當系統作Context Switch時,CPU保存全部old process的context信息並得到new process的全部context信息。Context信息包括大量的linux追蹤每一個process信息,尤爲是一些資源:哪些process正在執行,被分配了哪些內存,它打開了那些文件等等。切換Context會觸發大量的信息移動,這是比較高的開銷,若是可能的話儘可能保持很小的 context switches。 爲了儘量的減少context switches,得須要知道它們是怎麼產生的?首先kernel調度觸發context switches。爲了保證每一個process平等的共享CPU時間kernel週期性中斷running的process,若是合適,kernel調度器會開始一個其餘的process而不是讓當前的process繼續執行,每次的週期性中斷或者定時中斷均可能觸發context switch,每秒定時中斷的次數因不一樣架構和不一樣的kernel版本而不一樣。獲取每秒中斷次數的一個簡單辦法是經過監控 /proc/interrupts文件,看下面的例子: [root[@localhost](http://my.oschina.net/u/570656) asm-i386]# cat /proc/interrupts | grep timer; sleep 10 ; cat /proc/interrupts | grep timer 0: 24060043 XT-PIC timer 0: 24070093 XT-PIC timer 上面能夠看到在指定的時間內timer次數的變化,每秒產生的中斷次數爲1000次。 另外若是你的context switch比timer中斷大不少,那麼context switch更多的多是I/O請求或者其餘長時間的系統調用(好比sleep)產生。當一個應用請求一個操做不能當即實現時,kernel開始 context switch操做:存入請求的process而且試着切換到其餘runnable process,這將使得CPU保持工做狀態。 Interrupts 其餘方面,CPU接收硬件驅動發出的中斷請求,這種中斷一般被觸發當一個驅動器有一個時間須要被kernel操做時。例如:若是一個磁盤控制器從磁盤上取得了一個數據塊和kernel須要讀取使用這個塊,那麼磁盤控制器會觸發一箇中斷。kernel接收每一箇中斷,若是這個中斷被註冊,那麼就會有一箇中斷處理器來運行處理這個中斷,不然這個中斷將會被忽略。在系統中,中斷處理器的優先級很是高,並且執行速度很是快。不少時候,有些中斷處理並不須要很高的處理優先級,因此也有soft- interrupt handler。若是有不少的中斷,kernel須要花費大量的時間去處理中斷。能夠檢查/proc/interrupts可以知道中斷髮生在哪一個CPU 上。 CPU Utilization CPU Utilization,一個很直觀的概念,在任意時間內,CPU有7個狀態: 1)idle,表示CPU閒置並等待工做分配 2)user,表示CPU在運行用戶的進程 3)system,表示CPU在執行kernel工做 4)nice,表示CPU花費在被nice改變過優先級的process上的時間(注意:被nice命令改變優先級的process僅指那些nice值爲負的process。花費在被nice命令改變優先級的任務上的時間也將被計算在系統和用戶時間內,所以整個時間加起來可能會超過百分之百) 5)iowait,表示CPU等待IO操做完成的時間 6)irq,表示CPU開銷在響應硬中斷上的時間 7)softirq,表示CPU開銷在響應軟中斷上的時間 咱們通常用vmstat看到的都是四個狀態:sy,us,id,wa,經過他和loadavg結合,基本能夠知道cpu的狀態。大部分的性能工具用百分比表示CPU時間。當system時間佔用很高的時候,你能夠用"oprofile"工具發現時間都花費在哪裏。當iowait很高的時候,你須要分析你的IO設備,好比磁盤,網卡。 正如咱們以前討論的任何系統的性能比較都是基於基線的,而且監控CPU的性能就是以上3點,運行隊列、CPU使用率和上下文切換。如下是一些對於CPU很廣泛的性能要求:linux
對於每個CPU來講運行隊列不要超過3,例如,若是是雙核CPU就不要超過6;
若是CPU在滿負荷運行,應該符合下列分佈,
a) User Time:65%~70% b) System Time:30%~35% c) Idle:0%~5% 3. 對於上下文切換要結合CPU使用率來看,若是CPU使用知足上述分佈,大量的上下文切換也是能夠接受的。架構
經常使用的監視工具備,vmstat, top,dstat和mpstat.dom
procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu---- r b swpd free buff cache si so bi bo in cs us sy id wa 0 0 104300 16800 95328 72200 0 0 5 26 7 14 4 1 95 0 0 0 104300 16800 95328 72200 0 0 0 24 1021 64 1 1 98 0 0 0 104300 16800 95328 72200 0 0 0 0 1009 59 1 1 98 0ide
r表示運行隊列的大小, b表示因爲IO等待而block的線程數量, in表示中斷的數量, cs表示上下文切換的數量, us表示用戶CPU時間, sys表示系統CPU時間, wa表示因爲IO等待而是CPU處於idle狀態的時間, id表示CPU處於idle狀態的總時間。工具
dstat能夠給出每個設備產生的中斷數:性能
----total-cpu-usage---- ----interrupts--- ---procs--- usr sys idl wai hiq siq| 15 169 185 |run blk new 6 1 91 2 0 0| 12 0 13 | 0 0 0 1 0 99 0 0 0| 0 0 6 | 0 0 0 0 0 100 0 0 0| 18 0 2 | 0 0 0 0 0 100 0 0 0| 0 0 3 | 0 0 0 咱們能夠看到這裏有3個設備號15,169和185.設備名和設備號的關係咱們能夠參考文件/proc/interrupts,這裏185表明網卡eth1.ui
CPU0 0: 1277238713 IO-APIC-edge timer 6: 5 IO-APIC-edge floppy 7: 0 IO-APIC-edge parport0 8: 1 IO-APIC-edge rtc 9: 1 IO-APIC-level acpi 14: 6011913 IO-APIC-edge ide0 15: 15761438 IO-APIC-edge ide1 169: 26 IO-APIC-level Intel 82801BA-ICH2 185: 16785489 IO-APIC-level eth1 193: 0 IO-APIC-level uhci_hcd:usb1spa
mpstat能夠顯示每一個CPU的運行情況,好比系統有4個CPU。咱們能夠看到:.net
Linux 2.4.21-20.ELsmp (localhost.localdomain) 05/23/2006 05:17:31 PM CPU %user %nice %system %idle intr/s 05:17:32 PM all 0.00 0.00 3.19 96.53 13.27 05:17:32 PM 0 0.00 0.00 0.00 100.00 0.00 05:17:32 PM 1 1.12 0.00 12.73 86.15 13.27 05:17:32 PM 2 0.00 0.00 0.00 100.00 0.00 05:17:32 PM 3 0.00 0.00 0.00 100.00 0.00線程
總結的說,CPU性能監控包含如下方面: 檢查系統的運行隊列,確保每個CPU的運行隊列不大於3. 確保CPU使用分佈知足70/30原則(用戶70%,系統30%)。 若是系統時間過長,多是由於頻繁的調度和改變優先級。 CPU Bound進程老是會被懲罰(下降優先級)而IO Bound進程總會被獎勵(提升優先級)。
參考文章:http://blog.163.com/bobile45@126/blog/static/960619922012101005948264/ http://www.51testing.com/?uid-3787-action-viewspace-itemid-5527