降低linux内核定时器频率

时间:2013-02-17 20:13:07

标签: linux timer linux-kernel

当我以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也是如此。

我对于什么是正确的方法感到非常困惑。

我想要的是将定时器中断降至尽可能低。

我能否知道这样做的正确方法?

1 个答案:

答案 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实际上有一个未决的补丁,它将这种情况概括为只运行一个任务的情况,但它还有一段距离。