默认 Linux 每秒产生 250-1000 次 tick 中断——更新时间、检查调度。但在低延迟场景(DPDK、交易系统),每次 tick 都是几微秒的噪声。
一、先看图
flowchart LR
subgraph 传统 tick
TICK[周期 tick<br/>250-1000 Hz] --> OVERHEAD[每 tick 中断<br/>~2-5μs]
end
subgraph NO_HZ_IDLE
IDLE[空闲时] --> SKIP1[跳过 tick<br/>省电]
end
subgraph NO_HZ_FULL
RUN[运行用户态] --> SKIP2[跳过 tick<br/>零干扰]
SKIP2 --> HK[housekeeping CPU<br/>处理杂务]
end
classDef old fill:#f0883e22,stroke:#f0883e,color:#adbac7;
classDef new fill:#3fb95022,stroke:#3fb950,color:#adbac7;
class TICK,OVERHEAD old
class IDLE,SKIP1,RUN,SKIP2,HK new
二、三种模式
2.1 CONFIG_HZ_PERIODIC
传统周期 tick。每 CPU 每秒 HZ 次中断。
2.2 NO_HZ_IDLE(默认)
CPU 空闲时停止 tick → 省电(C-state 进入更深层)。
有任务运行 → 恢复 tick。
2.3 NO_HZ_FULL
CPU 上只有一个可运行任务 → 停止 tick → 用户态不受 tick 干扰。
nohz_full=2-7
三、housekeeping CPU
NO_HZ_FULL CPU 不处理:
- tick(定时器中断)
- RCU 回调
- 非绑定 workqueue
- 某些内核线程
这些工作由 housekeeping CPU 承担(通常 CPU 0-1)。
四、isolcpus 与 nohz_full
isolcpus=nohz,domain,managed_irq,2-7
nohz_full=2-7
rcu_nocbs=2-7
三者配合:
isolcpus:从调度域移除 → 不自动分配任务nohz_full:停止 tickrcu_nocbs:RCU 回调在 housekeeping CPU 处理
五、RCU nocb
rcu_nocbs=2-7
隔离 CPU 不运行 RCU 回调 → 由 rcuog/rcuop
线程在 housekeeping CPU 运行。
避免 RCU grace period 处理干扰隔离 CPU。
六、副作用
| 副作用 | 原因 |
|---|---|
| /proc/stat CPU 时间不准 | 无 tick 不更新统计 |
| perf 采样不准 | 无 tick 触发采样 |
| 负载均衡不触发 | 隔离 CPU 不在调度域 |
| IPI 仍存在 | TLB shootdown、RCU 等 |
七、实际配置示例
# 内核启动参数
GRUB_CMDLINE_LINUX="isolcpus=nohz,domain,managed_irq,2-7 \
nohz_full=2-7 rcu_nocbs=2-7 \
irqaffinity=0-1 \
nosoftlockup"# 将应用绑定到隔离 CPU
taskset -c 2-7 ./my_app
# 或 cgroup
echo 2-7 > /sys/fs/cgroup/cpuset/isolated/cpuset.cpus八、DPDK/SPDK 场景
DPDK 用户态网络:polling 模式 → 一个核 100% 运行 PMD 线程 → tick 是噪声。
NO_HZ_FULL → PMD 线程零内核干扰 → 稳定低延迟。
九、观察
# 检查 nohz_full 生效
cat /sys/devices/system/cpu/nohz_full
# 2-7
# tick 统计
cat /proc/interrupts | grep LOC # Local timer
# 隔离 CPU 的 LOC 应该很低
# 残余中断
perf stat -C 2 -e irq:* sleep 10十、小结
- NO_HZ_IDLE:空闲时跳 tick → 省电
- NO_HZ_FULL:运行时也跳 tick → 零干扰
- isolcpus + nohz_full + rcu_nocbs 三件套
- housekeeping CPU 承担所有杂务
- 副作用:统计不准、perf 采样缺失
参考文献
Documentation/timers/NO_HZ.rstkernel/time/tick-sched.c- Frederic Weisbecker, “Full dynticks.” 2013
- DPDK documentation, “CPU Isolation.”
工具
/sys/devices/system/cpu/nohz_fulltaskset/cset- cyclictest
- perf
同主题继续阅读
把当前热点继续串成多页阅读,而不是停在单篇消费。
EEVDF 调度器:Linux 6.6 为什么换掉了 CFS
Linux 6.6 用 EEVDF 取代了 CFS 的 SCHED_NORMAL 选取逻辑。从 1995 年原始论文的 lag、eligibility、virtual deadline,到 commit 147f3ef 只重写 placement/pick/preempt,再到本机内核 6.6 上读 sched/debug 把每个任务的 vruntime、eligible 标志、deadline 一一对上 vd=ve+r/w,外加 nice 带宽与 base_slice 抢占两组实测,讲清换的是哪一块、延迟敏感任务凭什么先跑。
【操作系统百科】Windows 内核与 Linux 的关键差异
NT Executive/Kernel/HAL 分层、Object Manager 与 handle、IRP 驱动栈、IOCP 完成端口 vs epoll/io_uring、EPROCESS/KTHREAD vs task_struct、Registry vs 文件配置,以及 WSL2 为何选择 Hyper-V 轻量 VM。
【操作系统百科】实时 OS 巡礼
硬实时与软实时的可调度性边界、VxWorks/QNX/Zephyr 机制对照、Linux PREEMPT_RT 与主线合入、DO-178C/ISO 26262 认证语境,以及选型决策树。
【操作系统百科】Unikernel
Unikernel 在云上为什么没成主流?MirageOS、IncludeOS、Unikraft、OSv 的设计取舍——库操作系统、启动时间、工具链、调试困难、POSIX 兼容。