当我的 UPS 触发“电池供电”事件时,我希望关闭所有核心以节省电量。这台 PC 在两个芯片上有 8 个核心,由于电流峰值高,UPS 电池需要每 3 个月更换一次。为了减轻我的拥有成本,当 UPS 触发此类事件时,将执行以下指令:
for c in /sys/devices/system/cpu/cpu*/online; do
echo 0 >$c
done
成功将核心 1 至 7 设置为离线,而核心 0 保持在线,正如预期的那样。然后lscpu
确认atop
只有 CPU 0 保持在线,并且作为进一步的指示,CPU 温度从 90°C 降至 60°C。
当电网电源恢复时,执行反向命令:
for c in /sys/devices/system/cpu/cpu*/online; do
echo 1 >$c
done
但核心没有联机。此时,cat /sys/devices/system/cpu/cpu*/online
打印1
从 0 到 7 的每个 CPU,并lscpu
报告所有 CPU 都已恢复联机,但我的所有线程显然继续在核心 0 上独家运行,atop
仍然只列出一个核心,系统负载保持在 100% 左右,而不是通常的 800%。此外,CPU 温度保持稳定在 60°C。
异常的是,虽然top
以百分比形式列出每个进程的 CPU 使用率,但这些单独的百分比总和约为 100%,而报告的 60 秒平均负载top
稳定在 8。
属性:
- Linux 4.1.1
- Debian 8
- LXC 正在积极使用
- KVM 模块已加载,未处于活动状态
- CPU 持续加载超过 8 个可运行线程
更新:
我把内核从4.1.1更新到了4.5.4,测试之后发现还是存在同样的问题。
答案1
这是由于 LXC 中与 cgroup 有关的已知错误造成的cpuset
。下面介绍了一些解决方法:https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=824519。