当我以Gentoo作为访客运行我的虚拟机时,我发现来自tick_periodic
函数的开销很大。 (这是在每个定时器中断上运行的函数。)此函数使用jiffy
更新全局write_seqlocks
,这会导致开销。
这是我的内核配置文件中的HZ
和相关内容的grep。
sharan013@sitmac4:~$ 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
和调度程序时间片的交互性和精度,但我准备牺牲这些东西以减少定时器中断,因为它会加速VM。
当我试图找出必须完成的工作时,我在某个地方读到你可以通过更改配置文件来实现,否则我读到将bootider = 10添加到boot参数中的工作,否则我读到,即使不增加定时器频率,如果你可以设置CONFIG_HIGH_RES_TIMERS
来实现低延迟定时器也是如此,并且使用无定时系统CONFIG_NO_HZ
也是如此。
我对于什么是正确的方法感到非常困惑。
我想要的是将定时器中断降至尽可能低。
我能否知道这样做的正确方法?
答案 0 :(得分:18)
别担心!你的困惑只不过是预料之中的。 Linux计时器中断非常令人困惑,并且历史悠久且非常令人兴奋。
<强> CLK_TCK 强>
Linux没有sysconf
系统调用,glibc只返回常量值100.抱歉。
HZ &lt; - 你可能想要什么
配置内核时,您可以选择100Hz,250Hz,300Hz或1000Hz的定时器频率。所有这些都得到了支持,虽然1000Hz是默认值,但它并不总是最好的。
人们通常会在评估延迟(桌面或网络服务器)时选择较高的值,而在评估吞吐量(HPC)时选择较低的值。
<强> CONFIG_HIGH_RES_TIMERS 强>
这与定时器中断无关,它只是一种允许您拥有更高分辨率定时器的机制。这基本上意味着select
等呼叫的超时可能比1 / HZ秒更准确。
<强>分频器强>
此命令行选项是Red Hat提供的补丁。您可以使用它(如果您使用的是Red Hat或CentOS),但我会小心。它导致了很多错误,您可能只需要使用不同的Hz值重新编译。
<强> CONFIG_NO_HZ 强>
这实际上并没有太大作用,它是为了省电,这意味着当没有任何执行时,滴答将停止(或至少变得不那么频繁)。这可能已在您的内核上启用。当至少一个任务可以运行时,它没有任何区别。
Frederic Weisbecker实际上有一个未决的补丁,它将这种情况概括为只运行一个任务的情况,但它还有一段距离。