linux概念之cpu分析

來源:互聯網
上載者:User

標籤:

http://ilinuxkernel.com/?cat=4

Linux CPU佔用率原理與精確度分析
1  CPU佔用率計算原理
在Linux/Unix 下,CPU 利用率分為使用者態、系統態和空閑態,分別表示CPU 處於使用者態執行的時間,系統核心執行的時間,和空閑系統進程執行的時間。
下面是top顯示的值
1.1%us,  1.6%sy,  0.0%ni, 97.2%id,  0.0%wa,  0.0%hi,  0.1%si,  0.0%st
      us: User time         使用者時間
      sy: System time         系統時間
      ni: Nice time         Nice時間
      id: Idle time         空閑時間
      wa: Waiting time         等待時間
      hi: Hard Irq time     硬中斷處理時間
      si: SoftIrq time         非強制中斷處理時間
      st: Steal time         丟失時間
表示CPU 執行使用者進程的時間,包括nices時間。通常期望使用者空間CPU 越高越好。
表示CPU 在核心已耗用時間,包括IRQ 和softirq 時間。系統CPU 佔用率高,表明系統某部分存在瓶頸。通常值越低越好。
系統調整進程優先順序所花費的時間。
系統處於空閑期,等待進程運行。
CPU在等待I/O 操作完成所花費的時間。系統不應該花費大量時間來等待I/O 操作,否則就說明I/O 存在瓶頸。
系統處理硬中斷所花費的時間。
系統處理非強制中斷所花費的時間。
被強制等待(involuntary wait)虛擬CPU的時間,此時 hypervisor 在為另一個虛擬處理器服務。

1.2  CPU 佔用率計算
Linux CPU 佔用率計算,都是根據/proc/stat檔案內容計算而來,下面是stat檔案內容範例,核心版本不同,會稍有不同,但內容基本一致。
CPU 資訊,cpu 為總的資訊,cpu0 … cpun 為各個具體CPU 資訊      
cpu 661733 468 503925 233055573 548835 14244 15849 0
       上面共有8 個值(單位:ticks),分別為:
       User time , 661733                Nice time , 468
       System time , 503925              Idle time ,233055573
       Waiting time,548835               Hard   Irq time , 14244
       SoftIRQ time,15849                Steal time,0
 
     CPU佔用率計算公式如下:     
     CPU 時間=user+system+nice+idle+iowait+irq+softirq+Stl
     %us =(User time + Nice time)/CPU時間*100%
     %sy=(System time + Hard Irq time +SoftIRQ time)/CPU時間*100%
     %id=(Idle time)/CPU 時間*100%
     %ni=(Nice time)/CPU 時間*100%
     %wa=(Waiting time)/CPU時間*100%
     %hi=(Hard Irq time)/CPU 時間*100%
     %si=(SoftIRQ time)/CPU時間*100%
     %st=(Steal time)/CPU時間*100%

2  CPU佔用率核心實現
下面以RHEL6 核心源碼版本2.6.32-220.el6 x86_64 為例,來介紹核心源碼實現。/proc/stat 檔案的建立由函數proc_stat_init()實現,在檔案 fs/proc/stat.c 中,在核心初始化時調用。/proc/stat 檔案相關函數時間均在stat.c 檔案中。
3  Linux CPU佔用率精確性分析
在使用類似top 命令,觀察系統及各進程CPU 佔用率時,可以指定重新整理時間間隔,以及時重新整理和即時觀察CPU 佔用率。top 命令預設情況下,是每 3 秒重新整理一次。也可以通過 top  -d <重新整理時間間隔> 來指定重新整理頻率,如top -d 0.1 或top -d 0.01 等。top 執行時,也可以按“s ”鍵,修改時間間隔。
我們可以將CPU 佔用率重新整理間隔設定很低,如0.01 秒。但過低的重新整理頻率是否能夠更準確觀察到CPU 佔用率?Linux  系統提供的CPU 佔用率資訊是否足夠精確?
根據前面分析,我們已知 Linux 是根據/proc/stat 檔案的內容來計算CPU 佔用率,也就是精確度和/proc/stat 提供的資料精確度有關。那麼
(1)/proc/stat 檔案中的內容單位是什嗎?
(2)多久會重新整理/proc/stat 中的資料?
  cpu    926 0 4160 5894903 2028 0 7 0 0
  cpu0     80 0 473 367723 658 0 3 0 0
3.1  /proc/stat中的資料單位精度
/proc/stat 中CPU 資料資訊,單位是ticks。核心中有個全域變數jiffies ,來記錄系統啟動以來,經曆的ticks 數量。

[[email protected] boot]# cat /proc/sched_debug|grep ji
  .jiffies                                 : 9645728927
[[email protected] boot]# cat /proc/stat
cpu  216511 1316 58661 534345575 29219 2170 3034 0 0
ticks(滴答)就是系統時鐘中斷的時間間隔,該值與核心中HZ值有關,即ticks = 1/HZ。HZ值的大小,在核心編譯時間可配置的。某台機器上是RHEL6.1 核心,配置的HZ值為1000。
[[email protected] boot]# uname -a
Linux ssd 2.6.32-131.0.15.el6.x86_64 #1 SMP Tue May 10 15:42:40 EDT 2011 x86_64 x86_64 x86_64 GNU/Linux
[[email protected] boot]# cat /boot/config-2.6.32-431.el6.x86_64|grep CONFIG_HZ
# CONFIG_HZ_100 is not set
# CONFIG_HZ_250 is not set
# CONFIG_HZ_300 is not set
CONFIG_HZ_1000=y
CONFIG_HZ=1000
HZ 的值,就是每秒的時鐘中斷數量。可以觀察/proc/interrupts 中時鐘中斷值變化,來計算HZ的值。當HZ的值為1000時,ticks 的單位即為1/1000秒,即1ms 。
[[email protected] boot]# cat /proc/interrupts |grep LOC
LOC:   30099358   Local timer interrupts
3.2
/proc/stat檔案中的值,都是在程式讀取時更新,核心並不會主動更新/proc/stat 中的資料。
/proc/stat 中的CPU 資訊是通過kernel_stat 各個成員變數的值計算而來。
3.3  CPU利用率精確性分析
通過前面分析,我們可以得出以下結論:
  (1)Linux CPU 佔用率是根據/proc/stat 檔案中的資料計算而來;
  (2)/proc/stat 中的資料精度為ticks ,即1/HZ秒;
  (3)核心每個ticks 會更新一次CPU 使用資訊;
  (4)CPU 佔用率的精度為1/HZ秒。
4  Linux CPU佔用率是否準確?
有時偶爾會遇到類似問題:在穩定計算壓力下,進程CPU 佔用率不穩定;或者特性進程CPU 佔用率明顯不準。即在系統切換次數很高時,Linux 的CPU 利用率電腦制可能不準確。那麼Linux 的CPU 利用率計算到底是否準確?若可能不準確,則什麼情況下出現這種情況?
4.1  Linux CPU 佔用率不準確情形
在前面分析中,Linux 核心是在每次時鐘中斷時更新CPU 使用方式,即 1/HZ秒更新一次。時鐘中斷時,只會看到當前正在啟動並執行進程資訊。以為例,紅色箭頭表示時鐘中斷(Timer Interrupt )。
第一次中斷時,看到進程A 在運行。但進程 A 已耗用時間短,進程 B 運行。第二次中斷時,進程 C 運行;在第三次中斷到來時,再次調度進程 A 執行。第三次此中斷時,進程C 運行。
按照Linux 核心CPU 佔用率統計方法,在第1 次和第2 次中斷期間,核心並沒有看到進程B 在運行;於是就漏掉了進程B 使用CPU 的資訊。同樣道理,在第2 次和第3次中斷期間,漏掉了進程B 使用CPU 的情況。這樣,就導致了Linux 核心CPU 佔用率統計不準確。
發生CPU佔用率不準確的原因是:在一個時鐘中斷周期內,發生了多次進程調度。時鐘中斷的精度是1/HZ秒。
4.2  top 命令CPU使用率準確嗎?
只有在一個時鐘中斷周期內發生多次進程調度,才會出現CPU 佔用率不準的情況。那麼top 命令中CPU 使用率是否準確與進程調度頻率有關。若HZ的值為250 ,則 ticks 值為4ms ;若 HZ值為1000,則 ticks 值為1ms 。在 HZ為250 時,只要進程的調度間隔大於4ms ,CPU 佔用率就準確。HZ為1000時,調度間隔大於1ms ,CPU 佔用率計算就準確。進程調度次數少,CPU佔用率就準確;調度時間間隔小於時鐘中斷,就可能不準確。那麼進程調度的時機是怎樣的?如何觀察進程調度次數?
4.2.1  進程調度時機
1.進程狀態轉換的時刻:進程終止、進程睡眠
進程要調用sleep()或 exit ()等函數進行狀態轉換,這些函數會主動調用發送器進行進程調度;
2.當前進程的時間片用完時(current->counter=0 )
由於進程的時間片是由時鐘中斷來更新的
3.裝置驅動程式
當裝置驅動程式執行長而重複的任務時,直接調用發送器。在每次反覆迴圈中,驅動程式都檢查need_resched的值,如果必要,則調用發送器schedule() 主動放棄CPU 。
4.進程從中斷、異常及系統調用返回到使用者態時
不管是從中斷、異常還是系統調用返回,最終都調用ret_from_sys_call (),由這個函數進行調度標誌的檢測,如果必要,則調用發送器。那麼,為什麼從系統調用返回時要調用發送器呢?這當然是從效率考慮。從系統調用返回意味著要離開核心態而返回到使用者態,而狀態的轉換要花費一定的時間,因此,在返回到使用者態前,系統把在核心態該處理的事全部做完。
4.2.2  進程調度次數觀察
可以通過vmstat 命令,來觀察系統中進程切換次數,cs 域的值就是切換次數。HZ的值,可以通過核心設定檔來確定,若/proc/config.gz 存在,匯出這個檔案查看即可。
也可以通過查看/proc/sched_debug 檔案內容,來觀察切換次數(nr_switches)。
[[email protected] proc]# watch -d -n 1 ‘cat /proc/sched_debug |grep nr_switches‘
 
我們系統中的進程調度真的那麼頻繁嗎?大多數情況下,Linux 中的CPU 佔用率電腦制是準確的。

linux概念之cpu分析

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.