默认 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
同主题继续阅读
把当前热点继续串成多页阅读,而不是停在单篇消费。
【操作系统百科】内核内存调试
内核内存 bug 是最难追的:UAF、OOB、double free、leak 都可能沉默数月。本文讲 KASAN 三种模式、KFENCE 生产采样、kmemleak、SLUB_DEBUG、UBSAN/KCSAN 联动。
【操作系统百科】VFS 四层抽象
Linux 的一切皆文件靠 VFS 实现——superblock、inode、dentry、file 四层抽象加 ops 表。本文讲 VFS 核心数据结构、dcache、inode cache、RCU lookup,以及文件系统如何插入 VFS。
操作系统百科
Linux 6.x 视角下的操作系统系列索引:110 篇覆盖调度、虚拟内存、文件系统与 I/O、并发、隔离、可观测性,按主题、阅读路径与关键问题三种入口组织。
【操作系统百科】用户态分配器:jemalloc vs tcmalloc
jemalloc 与 tcmalloc 都想解决多线程分配器的老问题:锁争抢、碎片、RSS 膨胀与回收抖动。但两者把优化重点放在了不同位置:tcmalloc 更激进地把热路径推到 per-CPU,jemalloc 则把 arena、extent、decay 和 profiling 做成了一套更完整的内存治理工具箱。