启用CONFIG_NO_HZ_FULL=y的Linux系统时钟更新机制问询
Linux内核时间管理机制疑问与解答(v6.5版本)
环境配置信息
定时器子系统配置(取自/proc/config.gz)
# # Timers subsystem # CONFIG_TICK_ONESHOT=y CONFIG_NO_HZ_COMMON=y # CONFIG_HZ_PERIODIC is not set # CONFIG_NO_HZ_IDLE is not set CONFIG_NO_HZ_FULL=y CONFIG_CONTEXT_TRACKING_USER=y # CONFIG_CONTEXT_TRACKING_USER_FORCE is not set CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y CONFIG_CLOCKSOURCE_WATCHDOG_MAX_SKEW_US=100 # end of Timers subsystem ... # CONFIG_HZ_100 is not set # CONFIG_HZ_250 is not set CONFIG_HZ_300=y # CONFIG_HZ_1000 is not set CONFIG_HZ=300
可用时钟源(取自/sys/devices/system/clocksource/clocksource0/available_clocksource)
tsc hpet acpi_pm
中断统计(取自/proc/interrupts)
0: 43 0 0 0 0 0 0 0 0 0 0 0 IR-IO-APIC 2-edge timer LOC: 230699 223726 237045 125923 251924 120454 232764 139559 224598 122373 208406 122949 Local timer interrupts
核心疑问与解答
1. 为何CPU0的timer中断次数仅为43次?
你看到的0:号中断是传统PIT(可编程间隔定时器)中断,在启用NO_HZ_FULL和本地APIC(LAPIC)定时器的系统中,它仅在初始化阶段发挥作用:用于校准其他高精度时钟源(比如TSC、HPET),完成后就会被内核停用,所以触发次数极少(43次属于正常的初始化及校准操作)。
2. 是否需要核心维持300Hz的周期性中断更新系统时钟和jiffies?
不需要。启用NO_HZ_FULL后,内核采用按需触发的无节拍机制:
- 当系统存在待处理的定时器任务、调度事件时,内核会通过LAPIC的一次性定时器(由
CONFIG_TICK_ONESHOT=y支持),在指定时间点触发中断,完成jiffies更新、时钟同步等操作。 - 当所有核心处于完全空闲状态(无待处理定时器、无调度需求)时,所有核心都会进入无节拍模式,不会产生定时器中断,直到有新任务需要唤醒核心。
3. 调度这类中断使用的时钟源是什么?
- LAPIC定时器本身不具备独立计时能力,它依赖系统级时钟源提供计时基准。
- 内核会从可用时钟源中自动选择最优选项(优先级:
tsc>hpet>acpi_pm),你可以通过查看/sys/devices/system/clocksource/clocksource0/current_clocksource确认当前使用的时钟源。 - 传统PIT仅在初始化阶段使用,后续不再负责系统时钟的更新工作。
内容的提问来源于stack exchange,提问作者Olmarq
相关产品推荐
相关产品推荐

