19

当我使用 Gentoo 作为访客运行我的虚拟机时,我发现有相当大的开销来自tick_periodic函数。(这是在每个定时器中断时运行的函数。)该函数更新全局jiffy使用write_seqlocks,这会导致开销。

这是我的内核配置文件中的 grepHZ和相关内容。

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。

当我试图找出必须做的事情时,我在某个地方读到了你可以通过更改配置文件来做到这一点,否则我读到在引导参数中添加 divider=10 就可以了,在其他地方我读到了如果即使不增加定时器频率也可以设置为CONFIG_HIGH_RES_TIMERS实现低延迟定时器,则不需要任何东西,并且在无滴答系统中也可以做到这一点CONFIG_NO_HZ

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

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

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

4

1 回答 1

24

不用担心!你的困惑不过是意料之中的。Linux 定时器中断非常令人困惑,并且有着悠久而令人兴奋的历史。

CLK_TCK

Linux 没有sysconf系统调用,glibc 只是返回常量值 100。抱歉。

HZ <-- 你可能想要什么

配置内核时,您可以选择 100Hz、250Hz、300Hz 或 1000Hz 的定时器频率。所有这些都受支持,虽然 1000Hz 是默认值,但它并不总是最好的。

人们通常会在重视延迟(桌面或 Web 服务器)时选择高值,而在重视吞吐量 (HPC) 时会选择低值。

CONFIG_HIGH_RES_TIMERS

这与定时器中断无关,它只是一种允许您拥有更高分辨率定时器的机制。这基本上意味着调用超时select可以比 1/HZ 秒更准确。

分隔线

此命令行选项是 Red Hat 提供的补丁。您可能可以使用它(如果您使用的是 Red Hat 或 CentOS),但我会小心。它引起了很多错误,您可能应该使用不同的 Hz 值重新编译。

CONFIG_NO_HZ

这实际上并没有多大作用,它是为了省电,这意味着当什么都不执行时,滴答声将停止(或至少变得不那么频繁)。这可能已经在您的内核上启用。当至少一个任务可以运行时,它没有任何区别。

Frederic Weisbecker 实际上有一个待处理的补丁,它把它推广到只有一个任务正在运行的情况,但还差一点。

于 2013-02-18T20:52:41.343 回答