當我以Gentoo身份運行我的虛擬機作爲guest時,發現tick_periodic
函數有相當大的開銷。 (這是在每個定時器中斷上運行的函數)。該函數使用write_seqlocks
來更新全局的jiffy
,這會導致開銷。降低linux內核定時器頻率
這是grep HZ
和我的內核配置文件中的相關內容。
[email protected]:~$ cat /boot/config | egrep 'HZ|TIME'
# CONFIG_RCU_FAST_NO_HZ is not set
CONFIG_NO_HZ=y
# 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
# CONFIG_MACHZ_WDT is not set
CONFIG_TIMERFD=y
CONFIG_HIGH_RES_TIMERS=y
CONFIG_X86_CYCLONE_TIMER=y
CONFIG_HPET_TIMER=y
顯然,它已經將配置設置爲1000,但是當我做sysconf(_SC_CLK_TCK)
,我得到100我的定時器的頻率。那麼我的系統的定時器頻率是多少?
我想要做的就是把頻率降到100,如果可能的話降到更低。儘管它可能會影響poll
/select
和調度程序時間片的交互性和精確性,但我已經準備好爲較小的定時器中斷犧牲這些功能,因爲它會加快虛擬機的速度。
當我試圖找出必須完成的工作時,我可以在某處通過更改配置文件來讀取,否則在讀取時添加divider = 10到啓動參數執行作業,否則在那裏我讀到,如果您可以將CONFIG_HIGH_RES_TIMERS
設置爲低延遲定時器,即使不增加定時器頻率,也不需要任何設置,對於無打盹系統CONFIG_NO_HZ
也是如此。
我非常困惑什麼是正確的方法。
我想要的只是把定時器中斷降到儘可能低。
我可以知道正確的做法嗎?
如果我執行了2次cat/proc/interrupts,我看到在第一次和第二次調用之間增加了本地計時器中斷。但是標記爲'IO-APIC-edge timer'的那個在兩次調用之間保持不變。每個CPU上運行的本地定時器中斷都負責增加全局定時器變量jiffies,它基本上記錄了自引導時間以來的滴答數量。另外'IRQ 0'對應於'cat/proc/interrupts'第一行中的定時器中斷...所以我想我有一個'tickless system'順便說一下非常清楚的解釋...謝謝 – Deepthought 2013-02-19 00:10:36
不要擔心I/O APIC,本地定時器中斷實際上來自本地APIC,這是完全不同的事情。你看到的IRQ 0是I/O APIC定時器,它可能未被使用(除了在啓動時)。然而,你說的是本地計時器中斷遞增jiffies是正確的。 – jleahy 2013-02-19 11:07:45
嘿,我讀了這本書中稱爲專業Linux內核架構的abt計時器,並從理解linux內核瞭解了一點,但我清楚地不理解這個過程呢...我必須嘗試修改以高效的方式更新jiffies的代碼......你能否推薦一個好的資源,我不僅可以理解理論,而且可以理解內核中執行工作的代碼....謝謝 – Deepthought 2013-02-19 11:49:09