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

【操作系统百科】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-04-27 · os

【操作系统百科】内存回收

Linux 内存回收是 VM 最复杂的子系统之一。本文讲 active/inactive LRU、kswapd 与 direct reclaim、watermark 三线、swappiness 的真实含义、MGLRU 改造、memcg 回收与 PSI。

2026-04-28 · os

【操作系统百科】交换

swap 还值得开吗?本文讲 swap area 基础、swap cache、zram 压缩内存、zswap 前端压缩池、swappiness 的真实含义、容器里的 swap 策略,以及为什么现代 Android 全靠 zram 不靠磁盘。

2026-05-03 · os

【操作系统百科】Slab/SLUB 分配器

buddy 只管页粒度(4K+),内核大多数对象只有几十到几百字节。slab/SLUB 在 buddy 之上做对象级缓存。本文讲 slab 历史、SLUB 接手、SLOB 退场、kmem_cache、per-CPU cache、KASAN 集成。

2026-05-07 · os

【操作系统百科】用户态分配器

glibc malloc、tcmalloc、jemalloc、mimalloc 各有哲学。本文讲 arena、thread cache、size class、madvise 返还策略、碎片与 RSS 膨胀、如何根据负载选分配器。


By .