土法炼钢兴趣小组的算法知识备份

【操作系统百科】CPU 热插拔

文章导航

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

目录

虚拟机弹性扩缩容 → 运行时添加/移除 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"

十、小结


参考文献

工具


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

同主题继续阅读

把当前热点继续串成多页阅读,而不是停在单篇消费。

2026-05-06 · os

【操作系统百科】内核内存调试

内核内存 bug 是最难追的:UAF、OOB、double free、leak 都可能沉默数月。本文讲 KASAN 三种模式、KFENCE 生产采样、kmemleak、SLUB_DEBUG、UBSAN/KCSAN 联动。

2026-05-08 · os

【操作系统百科】VFS 四层抽象

Linux 的一切皆文件靠 VFS 实现——superblock、inode、dentry、file 四层抽象加 ops 表。本文讲 VFS 核心数据结构、dcache、inode cache、RCU lookup,以及文件系统如何插入 VFS。

2026-04-22 · os

操作系统百科

Linux 6.x 视角下的操作系统系列索引:110 篇覆盖调度、虚拟内存、文件系统与 I/O、并发、隔离、可观测性,按主题、阅读路径与关键问题三种入口组织。

2026-05-27 · os

【操作系统百科】用户态分配器:jemalloc vs tcmalloc

jemalloc 与 tcmalloc 都想解决多线程分配器的老问题:锁争抢、碎片、RSS 膨胀与回收抖动。但两者把优化重点放在了不同位置:tcmalloc 更激进地把热路径推到 per-CPU,jemalloc 则把 arena、extent、decay 和 profiling 做成了一套更完整的内存治理工具箱。


By .