默认 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
同主题继续阅读
把当前热点继续串成多页阅读,而不是停在单篇消费。
【操作系统百科】内存回收
Linux 内存回收是 VM 最复杂的子系统之一。本文讲 active/inactive LRU、kswapd 与 direct reclaim、watermark 三线、swappiness 的真实含义、MGLRU 改造、memcg 回收与 PSI。
【操作系统百科】交换
swap 还值得开吗?本文讲 swap area 基础、swap cache、zram 压缩内存、zswap 前端压缩池、swappiness 的真实含义、容器里的 swap 策略,以及为什么现代 Android 全靠 zram 不靠磁盘。
【操作系统百科】Slab/SLUB 分配器
buddy 只管页粒度(4K+),内核大多数对象只有几十到几百字节。slab/SLUB 在 buddy 之上做对象级缓存。本文讲 slab 历史、SLUB 接手、SLOB 退场、kmem_cache、per-CPU cache、KASAN 集成。
【操作系统百科】用户态分配器
glibc malloc、tcmalloc、jemalloc、mimalloc 各有哲学。本文讲 arena、thread cache、size class、madvise 返还策略、碎片与 RSS 膨胀、如何根据负载选分配器。