CPU 热插拔

目录

虚拟机弹性扩缩容 → 运行时添加/移除 vCPU。物理机也有:ACPI CPU 热插拔、维护模式下线核心。

一、先看图

stateDiagram-v2
    [*] --> OFFLINE
    OFFLINE --> BRINGUP_CPU: cpu_up
    BRINGUP_CPU --> AP_ONLINE: 启动 + 初始化
    AP_ONLINE --> ONLINE: 注册调度器 + 中断

    ONLINE --> TEARDOWN_CPU: cpu_down
    TEARDOWN_CPU --> OFFLINE: 迁移任务 + 停止

    state BRINGUP_CPU {
        [*] --> STARTING
        STARTING --> AP_IDLE
    }
    state TEARDOWN_CPU {
        [*] --> AP_DYING
        AP_DYING --> [*]
    }

二、CPUHP 状态机

// include/linux/cpuhotplug.h
enum cpuhp_state {
    CPUHP_OFFLINE,
    CPUHP_BRINGUP_CPU,
    CPUHP_AP_IDLE_DEAD,
    // ... 100+ 个状态
    CPUHP_ONLINE,
};

每个子系统注册 startup/teardown 回调 → 状态机按序调用。

cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "mydriver",
                  my_cpu_online, my_cpu_offline);

三、cpu_down 路径

  1. 停止调度新任务到目标 CPU
  2. 迁移所有任务到其他 CPU
  3. 迁移定时器
  4. 迁移 RCU 回调
  5. 迁移中断(IRQ affinity)
  6. 调用所有 teardown 回调
  7. CPU 进入 OFFLINE 状态

四、迁移的复杂性

4.1 任务迁移

绑定到目标 CPU 的任务(cpuset/taskset)→ 需要放宽 affinity 或失败。

per-CPU 内核线程 → 特殊处理(停止或迁移)。

4.2 定时器迁移

目标 CPU 的所有 timer/hrtimer → 迁移到其他 CPU。

4.3 RCU 迁移

目标 CPU 的 RCU 回调队列 → 迁移到其他 CPU。

nocb CPU 较简单(回调本来就不在该 CPU 处理)。

4.4 中断迁移

目标 CPU 绑定的 IRQ → 重新分配 affinity。

managed IRQ(MSI-X)的处理更复杂。

五、锁竞争

cpu_down 需要获取多个锁:

长时间持锁 → 影响其他 CPU 的操作(如 get_online_cpus() 阻塞)。

六、nohz_full + hotplug

nohz_full CPU 下线 → 需要先恢复 tick → 再走正常下线路径。

陷阱:housekeeping CPU 不能下线(否则无人处理定时器/RCU)。

七、虚拟化场景

7.1 vCPU 热添加

KVM/QEMU 支持运行时添加 vCPU → guest 内核 cpu_up() 新核。

7.2 云弹性

AWS/Azure/GCP 可调整 VM 的 vCPU 数量 → 触发 guest 内 CPU hotplug。

八、回归事故

CPU hotplug 是内核回归重灾区:

内核 CI 必须测试 CPU hotplug 路径。

九、观察

# 查看在线 CPU
cat /sys/devices/system/cpu/online
# 0-7

# 下线 CPU 3
echo 0 > /sys/devices/system/cpu/cpu3/online

# 上线
echo 1 > /sys/devices/system/cpu/cpu3/online

# 查看 hotplug 状态
cat /sys/devices/system/cpu/cpu3/hotplug/state

dmesg | grep -i "cpu.*offline\|cpu.*online"

十、小结


参考文献

工具


上一篇:时钟源 下一篇:电源管理

文章导航

分类入口
os
标签入口
#cpu-hotplug#cpuhp#online-offline#migration#cloud

读完这篇,下一步读什么

优先读同系列或同问题的下一篇,把单篇消费变成主题集群。


By .