当我以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