如何在运行时让Linux调度器排除指定CPU核心(无需重启系统)
如何在运行时让Linux调度器排除指定CPU核心(无需重启系统)
当然可以不用重启系统!我之前也碰到过类似需求,下面给你一步步讲具体操作,都是用Linux原生工具就能搞定的:
第一步:迁移目标核心上的现有进程
首先得把已经在要隔离的核心上跑的进程移到其他核心,不然直接隔离会导致这些进程无法被调度,可能出问题。
先查看所有进程当前绑定的CPU核心:
ps -eo pid,psr,cmd这里的
psr列就是进程当前运行的核心编号(核心编号从0开始计数)。找到所有在目标核心(比如核心2)上的进程,用
taskset把它们绑定到其他可用核心。比如要绑定到核心0和1,对应的掩码是0x3(二进制0011,对应核心0和1):sudo taskset -p 0x3 <进程PID>如果有多个进程需要批量处理,可以用脚本简化操作:
for pid in $(ps -eo pid,psr | awk '$2==2 {print $1}'); do sudo taskset -p 0x3 $pid; done上面的命令会自动把所有在核心2上的进程迁移到核心0和1。
第二步:让调度器排除目标核心
接下来修改系统的sysfs配置,把目标核心加入隔离列表,这样调度器就不会再把新进程分配到这个核心上了:
先确保目标核心处于在线状态(如果之前是离线的话):
sudo echo 1 > /sys/devices/system/cpu/cpu2/online然后把核心2加入隔离列表:
sudo echo 2 > /sys/devices/system/cpu/isolated如果要隔离多个核心,比如核心2和3,可以这样写:
sudo echo 2,3 > /sys/devices/system/cpu/isolated
恢复核心的方法
如果之后想让这个核心重新被调度器使用,只需要清空隔离列表即可:
sudo echo "" > /sys/devices/system/cpu/isolated
注意事项
- 所有操作都需要root权限,记得加
sudo或者切换到root用户。 - 隔离核心后,你仍然可以手动用
taskset把特定进程绑定到这个隔离核心上,适合跑一些需要独占核心的高性能任务。 - 这种设置是临时的,系统重启后会失效,如果需要永久生效,还是得修改grub配置添加
isolcpus参数并重启。
备注:内容来源于stack exchange,提问作者budoattack




