问题现象描述
在定制Linux系统中,通过修改grub.cfg
添加isolcpus=2
参数试图隔离CPU2核心:
menuentry "GNU/Linux, Dobot-6.4.0-rt8" {
linux (hd0,gpt2)/bzImage rw root=/dev/mmcblk0p3 net.ifname-policy=onboard,path,slot
initrd (hd0,gpt2)/initrd.img-6.4.0-rt8
GRUB_CMDLINE_LINUX_DEFAULT="isolcpus=2"
}
但重启后通过top
命令观察发现,仍有sshd
等用户空间进程在使用CPU2核心。
配置验证步骤
首先确认内核参数是否生效:
cat /proc/cmdline | grep isolcpus
如果输出包含isolcpus=2
,说明参数已正确传递给内核。
根本原因分析
isolcpus
参数仅阻止普通进程调度到指定CPU,但以下情况例外:
- 内核线程(kworker等)仍可能使用隔离CPU
- 通过
taskset
或cgroups
显式绑定的进程 - 中断处理(需要配合
irqbalance
配置)
完整隔离方案
要实现真正的CPU隔离,需要组合以下措施:
# 1. GRUB配置(/etc/default/grub)
GRUB_CMDLINE_LINUX_DEFAULT="isolcpus=2 nohz_full=2 rcu_nocbs=2"
# 2. 更新GRUB配置后执行
update-grub
# 3. 中断隔离(需根据实际中断号调整)
for irq in $(cat /proc/interrupts | awk '{print $1}' | tr -d :); do
echo 0 > /proc/irq/$irq/smp_affinity_list
done
# 4. 禁止内核线程迁移
echo 0 > /sys/devices/system/cpu/cpu2/online
echo 1 > /sys/devices/system/cpu/cpu2/online
验证方法
使用以下命令验证隔离效果:
# 查看CPU隔离状态
cat /sys/devices/system/cpu/isolated
# 查看进程绑定情况
ps -eo pid,psr,comm | awk '$2==2{print $0}'
实际应用案例
在实时应用场景中,我们通常需要结合cgroups
:
# 创建cgroup
cgcreate -g cpuset:rtgroup
echo 2 > /sys/fs/cgroup/cpuset/rtgroup/cpuset.cpus
echo 0 > /sys/fs/cgroup/cpuset/rtgroup/cpuset.mems
# 将关键进程放入cgroup
cgclassify -g cpuset:rtgroup $(pidof your_rt_process)
注意事项
- 某些发行版可能需要修改
/etc/init.d/irqbalance
配置文件 - 对于SMP系统,建议同时隔离对应的NUMA节点
- 隔离CPU后,该CPU的负载统计可能不准确