Linux 内核 CPU Hotplug 与设备热插拔深度实战:从 CPU 上下线到生产级资源弹性调度
Linux 内核的 CPU 热插拔机制是现代多核系统资源弹性调度的基石。本文深入剖析 CPU 上下线的完整内核路径,从硬件中断到调度器迁移,从电源管理到生产级实践。
1. CPU 热插拔架构总览
CPU 热插拔(CPU Hotplug)是 Linux 内核支持在系统运行时动态启用或禁用 CPU 核心的能力。应用场景包括:电源管理(空闲时关闭核心)、高性能计算(动态调整活跃 CPU)、虚拟化(vCPU 热添加/移除)、系统维护(在线替换故障 CPU)以及容器编排(Kubernetes CPU Manager)。
2. CPU 状态机模型
内核使用状态机模型管理 CPU 生命周期,定义在 include/linux/cpu.h:
enum cpuhp_states {
CPUHP_OFFLINE = 0,
CPUHP_CPUPREPARE,
CPUHP_STARTING,
CPUHP_AP_ONLINE_DYN,
CPUHP_TEARDOWN,
CPUHP_ONLINE
};
每个状态转换都对应一组回调函数,通过 cpuhp_setup_state() 注册。
3. CPU 下线完整路径
CPU 下线由用户空间触发(echo 0 > /sys/devices/system/cpu/cpuN/online),内核处理流程为:
- CPU Notifier 通知:调用 CPU_DOWN_PREPARE 通知所有注册模块
- 中断迁移:migrate_irqs_away() 将中断路由到其他 CPU
- RCU 回调迁移:迁移 pending 的 RCU 回调到在线 CPU
- 调度器停止:sched_cpu_deactivating() 从调度域移除该 CPU
- 缓存维护:TLB 刷新和缓存一致性操作
- 电源关闭:通过 ACPI/PSCI 通知固件关闭电源
4. CPU 启动流程(SMP Boot)
x86 架构中 secondary CPU 启动经历:BSP 发送 INIT-SIPI-SIPI 序列,AP 从 reset vector 执行实模式代码,经保护模式到长模式,最终调用 cpu_startup_entry 进入 idle 循环。
5. 调度与 RCU 交互
CPU 下线时必须等待所有 RCU grace period 完成。内核通过 rcu_barrier() 确保回调处理完毕。对于 NO_HZ_FULL 模式,还需处理 tick 停止和上下文切换统计迁移。
6. KVM vCPU 热插拔
KVM 通过 KVM_CREATE_VCPU ioctl 实现 vCPU 热添加,QEMU 负责 CPU 拓扑更新,Guest OS 通过 ACPI 探测到新 CPU 后触发上线流程。硬件辅助虚拟化需要处理 VMCS/VMCB 重新配置。
7. 生产级实践
7.1 CPU Isolation
# 启动参数
isolcpus=2,3,4 nohz_full=2,3,4 rcu_nocbs=2,3,4
7.2 监控工具
- mpstat -P ALL:各 CPU 利用率
- turbostat:监控 C-state/P-state
- bpftrace:动态追踪 CPU 迁移事件
8. CXL 内存热插拔
CXL 2.0 引入 Type 3 内存扩展设备,支持运行时添加/移除内存。Linux 6.x 已初步支持 cxl_mem 驱动。内存池化和分层内存管理是未来发展方向。
9. 总结
Linux CPU 热插拔涉及中断、调度、RCU、电源管理等多子系统协同。理解完整构建路径对高可靠系统至关重要。

发表评论 取消回复