You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Linux技术问题:如何查看进程绑定的CPU核心及相关绑定操作

刚好对这块比较熟,给你逐个拆解这三个关于Linux进程CPU绑定的问题:

1. 如何查看哪些进程绑定到了哪些CPU核心?

有几个实用的工具可以快速搞定:

  • taskset命令:这是最直接的工具,针对单个进程,执行 taskset -p <PID>,输出里的mask是十六进制的CPU亲和性掩码(比如mask: 00000003表示绑定了核心0和1)。如果想要更直观的核心列表,用 taskset -cp <PID>,直接输出类似pid 1234's current affinity list: 0,1的结果。
  • ps命令:适合批量查看,执行 ps -eo pid,comm,cpu_affinity,会列出所有进程的PID、命令和对应的十六进制亲和性掩码。如果嫌转码麻烦,还是taskset更省心。
  • htop可视化工具:打开htop后按F2进入设置,在「Columns」里找到「AFFINITY」并添加,就能在界面上直接看到每个进程绑定的核心列表,对新手友好。
2. 如何查看所有用户的进程绑定的CPU核心?

要查看其他用户的进程,必须用root权限(加sudo),因为普通用户只能访问自己的进程:

  • ps批量输出:执行 sudo ps -e -o pid,user,comm,cpu_affinity,会列出所有进程的PID、所属用户、命令和亲和性掩码。如果想要核心列表而非掩码,可以用这个小脚本遍历:
sudo for pid in $(ps -e -o pid); do
    user=$(ps -o user= -p $pid)
    comm=$(ps -o comm= -p $pid)
    affinity=$(taskset -cp $pid 2>/dev/null | awk '{print $NF}')
    echo "PID: $pid | User: $user | Command: $comm | Bound CPUs: $affinity"
done
  • htop:同样按F2添加「AFFINITY」列,然后用sudo htop启动,就能看到所有用户的进程及其绑定的核心,浏览起来很方便。
3. 绑定进程到核心时,若核心已被其他进程绑定则操作失败?

Linux默认允许多个进程绑定到同一个核心,原生的taskset不会做冲突检查。要实现这个需求,得自己写个脚本先做前置检查,再执行绑定。

这里给你一个实用的示例脚本,需要用sudo运行(因为要读取所有用户的进程信息):

#!/bin/bash

# 检查参数是否正确
if [ $# -ne 2 ]; then
    echo "Usage: $0 <target_cpu_core> <pid>"
    exit 1
fi

TARGET_CPU=$1
PID=$2

# 校验目标核心是否合法
max_cpu=$(nproc --all)
if [ $TARGET_CPU -lt 0 ] || [ $TARGET_CPU -ge $max_cpu ]; then
    echo "Error: Invalid CPU core $TARGET_CPU. Available cores: 0 to $((max_cpu-1))"
    exit 1
fi

# 校验进程是否存在
if ! ps -p $PID >/dev/null 2>&1; then
    echo "Error: Process $PID does not exist"
    exit 1
fi

# 检查目标核心是否被其他进程绑定
conflict_found=0
for pid in $(ps -e -o pid); do
    # 跳过要绑定的进程本身
    if [ "$pid" -eq "$PID" ]; then
        continue
    fi
    # 获取进程的亲和性核心列表
    affinity_list=$(taskset -cp $pid 2>/dev/null | awk '{print $NF}')
    # 如果亲和性列表包含目标核心,标记冲突
    if echo "$affinity_list" | grep -qw "$TARGET_CPU"; then
        echo "Conflict: CPU core $TARGET_CPU is already bound by process $pid (user: $(ps -o user= -p $pid), command: $(ps -o comm= -p $pid))"
        conflict_found=1
    fi
done

if [ $conflict_found -eq 1 ]; then
    echo "Binding aborted due to existing conflicts"
    exit 1
fi

# 执行绑定操作
if taskset -cp $TARGET_CPU $PID; then
    echo "Success: Process $PID has been bound to CPU core $TARGET_CPU"
else
    echo "Error: Failed to bind process $PID to CPU core $TARGET_CPU"
    exit 1
fi

使用步骤:

  1. 把脚本保存为bind_cpu.sh
  2. 赋予执行权限:chmod +x bind_cpu.sh
  3. 用sudo运行:sudo ./bind_cpu.sh 1 1234(这里是把PID1234绑定到核心1,若核心1已被其他进程绑定则直接报错终止)

注意:脚本里的“绑定”指的是进程的CPU亲和性设置(即进程只能在指定核心运行),如果只是进程当前临时运行在某个核心但没设置亲和性,脚本不会把它视为冲突,符合你的需求。

内容的提问来源于stack exchange,提问作者daruma

火山引擎 最新活动