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
使用步骤:
- 把脚本保存为
bind_cpu.sh - 赋予执行权限:
chmod +x bind_cpu.sh - 用sudo运行:
sudo ./bind_cpu.sh 1 1234(这里是把PID1234绑定到核心1,若核心1已被其他进程绑定则直接报错终止)
注意:脚本里的“绑定”指的是进程的CPU亲和性设置(即进程只能在指定核心运行),如果只是进程当前临时运行在某个核心但没设置亲和性,脚本不会把它视为冲突,符合你的需求。
内容的提问来源于stack exchange,提问作者daruma




