使用 cgroups 设置 CPU 绑定的教学文档
1. 使用 cgroups 设置 CPU 绑定
在 Linux 中,使用 cgroups
可以对进程进行 CPU 绑定,从而控制它们在哪些 CPU 核心上运行。以下是基本步骤:
-
创建 cgroup:
mkdir /sys/fs/cgroup/cpuset/mygroup echo 0-3 > /sys/fs/cgroup/cpuset/mygroup/cpuset.cpus # 将 CPU 核心 0 到 3 分配给 mygroup echo 0 > /sys/fs/cgroup/cpuset/mygroup/cpuset.mems # 分配内存节点 0
-
将进程加入 cgroup:
echo 559 > /sys/fs/cgroup/cpuset/mygroup/tasks
2. 处理 “No space left on device” 错误
在执行上述命令时,如果出现 -sh: echo: write error: No space left on device
错误,可能有以下几种原因:
2.1 CPU 或内存节点未配置
确保 cpuset.cpus
和 cpuset.mems
已正确配置:
cat /sys/fs/cgroup/cpuset/mygroup/cpuset.cpus # 应显示已分配的 CPU 核心编号
cat /sys/fs/cgroup/cpuset/mygroup/cpuset.mems # 应显示已分配的内存节点
如果为空,则需要进行配置:
echo 0-3 > /sys/fs/cgroup/cpuset/mygroup/cpuset.cpus
echo 0 > /sys/fs/cgroup/cpuset/mygroup/cpuset.mems
2.2 父 cgroup 配置不当
子 cgroup 只能分配父 cgroup 已分配的资源。确保父 cgroup 中已正确配置 CPU 和内存节点:
cat /sys/fs/cgroup/cpuset/cpuset.cpus
cat /sys/fs/cgroup/cpuset/cpuset.mems
2.3 任务已绑定到其他 cgroup
确保目标进程的当前资源配置与新 cgroup 兼容。可以使用 /proc/<PID>/cgroup
来查看进程当前的 cgroup。
2.4 任务数量限制
某些 cgroup 可能对任务数量有限制,检查任务数量是否超出限制:
cat /sys/fs/cgroup/cpuset/mygroup/tasks
2.5 重新配置 cgroup
如果问题无法解决,可以删除并重新创建 cgroup:
rmdir /sys/fs/cgroup/cpuset/mygroup
mkdir /sys/fs/cgroup/cpuset/mygroup
echo 0-3 > /sys/fs/cgroup/cpuset/mygroup/cpuset.cpus
echo 0 > /sys/fs/cgroup/cpuset/mygroup/cpuset.mems
3. 查看进程是否成功绑定到 cgroup
要确认进程是否成功加入指定的 cgroup,可以使用以下方法:
3.1 查看 cgroup 中的任务列表
cat /sys/fs/cgroup/cpuset/mygroup/tasks
如果看到目标进程的 PID,说明进程已成功加入该 cgroup。
3.2 查看进程的 cgroup 信息
cat /proc/<PID>/cgroup
如果输出中包含 cpuset:/mygroup
,说明进程已成功绑定到 mygroup
cgroup。
4. 查看进程是否成功绑定到特定 CPU 核心
4.1 使用 ps
命令查看
在某些系统上,可以使用以下命令查看进程在哪个 CPU 核心上运行:
ps -o pid,psr,comm
psr
列表示进程当前运行的 CPU 核心编号。
4.2 使用 top
或 htop
- top:运行
top
,按f
键,然后选择P
列 (Last used CPU (SMP)
),确认后会显示进程在哪个 CPU 核心上运行。 - htop:启动
htop
,默认显示每个进程的 CPU 核心信息。
4.3 查看 /proc/<PID>/stat
通过读取 /proc/<PID>/stat
文件可以找到进程运行的 CPU 核:
cat /proc/<PID>/stat
- 第 39 个字段表示该进程最近使用的 CPU 核心编号。
4.4 使用 taskset
验证
使用 taskset
查看进程的 CPU 亲和性:
taskset -p <PID>
例如:
taskset -p 559
输出类似于:
pid 559's current affinity mask: 3
这里的 affinity mask
表示进程可能运行的 CPU 核心集合(以二进制位表示)。例如,3
表示可以在 CPU 核心 0
和 1
上运行。