You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在运行时让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

火山引擎 最新活动