chcpu 命令详解
更新时间:2026-09-17。「一个命令一个文档」系列,属于硬件与内核族。虚拟机热加了 vCPU、或想临时下线某些逻辑核做隔离/省电实验时,chcpu 用来在不重启的情况下改 CPU 在线状态。
它本质上是写 /sys/devices/system/cpu/cpu<N>/online 的封装(util-linux),需要 root。
一、常用法
bash
chcpu -l # 列出所有 CPU 的在线状态(0/1)
chcpu -e 2 # 启用 CPU2
chcpu -d 3 # 禁用 CPU3(offline)
chcpu -c 0-3,8-11 # 按 CPU 列表设置:列出的在线,其余尽量下线
chcpu -g # 触发 hypervisor 配置变更探测(热插后让内核发现新核)-c 给的是"期望在线集合"(掩码/范围),其余逻辑核会被置为 offline(前提是硬件/虚拟化支持)。
二、典型场景
- 虚拟机热加 vCPU:先在 hypervisor/云控制台增加 vCPU,再
chcpu -g(或内核自动 udev)让系统识别,lscpu/nproc 确认在线核数增加;部分云平台需系统支持 CPU hotplug。 - 实验性下线逻辑核 / 关超线程:把某些超线程兄弟核 offline 做性能对照。生产更规范的做法是内核启动参数
nr_cpus/maxcpus、isolcpus/nohz_full(隔离给 DPDK/实时任务)或 cgroup cpuset,而不是临时 chcpu。 - 省电/故障隔离:硬件热插拔场景下线故障核,现代系统通常由内核/固件自动处理。
三、和相关工具的区别
| 工具 | 作用 |
|---|---|
chcpu | 改变 CPU 是否在线(hotplug 写 sysfs) |
[lscpu] / lscpu | 查看 CPU 拓扑、核/线程数、在线范围 |
| nproc | 输出当前可用/在线核数 |
| taskset | 约束线程在仍在线的哪些核上跑(不改变在线状态) |
| cgroup cpuset | 限制某组进程可用核 |
常见误区:taskset 绑核 ≠ 下线核。被 chcpu 下线的核不出现在在线集合里,任何任务都不能调度;taskset 只是让某进程只用部分核,别的任务仍可用其余核。taskset/容器 cpuset 的目标核若被 offline,亲和性只在交集内生效。
四、注意
- 需要 root 且内核启用
CONFIG_HOTPLUG_CPU;裸机/很多云环境受限,下线 CPU0(引导核)通常不允许。 - 下线某核前,绑在其上的中断、RCU/nohz 回调需能迁移;正在被独占(isolcpus、内核线程不可迁)时会失败,看
dmesg。 - 操作影响全局性能与调度,生产慎用并记录原状态,测完及时恢复全部 online。
相关命令
查看拓扑用 lscpu(见硬件信息与内核模块),核数用 nproc,绑核用 taskset,组级隔离用 cgroup(cgset)。
总结
chcpu 封装写 sysfs 的 cpu online,实现在不重启时启用/禁用逻辑核:-l 看在线状态、-e/-d 上下线单核、-g 探测 hypervisor 热加的 vCPU、-c 设期望在线集合;主要用于虚拟化热加 vCPU 与核下线实验,需要 CONFIG_HOTPLUG_CPU 且不能下 CPU0;它改变"核在不在线",区别于只限制进程跑哪些在线核的 taskset/cpuset,生产隔离更推荐 isolcpus 或 cgroup。