如何让make及其子进程充分利用隔离CPU进行并行构建?
让Make及其子进程充分利用隔离CPU的解决方案
你的问题核心是**taskset启动的Make进程,其子进程未正确继承CPU亲和性**,或是isolcpus隔离的CPU存在默认访问限制。以下是几种可行的解决方法:
1. 通过Shell中转强制继承亲和性
直接用taskset启动Make时,部分Make版本或环境下可能出现子进程未继承亲和性的情况。可以先启动一个绑定了目标CPU的Shell,再在Shell内执行Make,确保所有子进程(包括编译进程)都继承亲和性:
taskset -c 2-19 bash -c 'make -j 15'
2. 检查并调整Cpuset配置
如果你的CPU是通过isolcpus内核参数隔离的,系统默认的Cpuset可能限制了普通进程访问这些CPU:
- 查看当前允许的CPU列表:
cat /sys/fs/cgroup/cpuset/cpuset.cpus - 如果输出仅包含
0-1,将隔离CPU添加到允许列表(注意:此操作会全局取消CPU隔离,仅适合需要让多个进程使用隔离CPU的场景):
修改后再执行echo 0-19 > /sys/fs/cgroup/cpuset/cpuset.cpustaskset -c 2-19 make -j15,即可让Make及其子进程使用隔离CPU。
3. 用Numactl绑定(NUMA架构机器适用)
如果你的服务器是NUMA架构,numactl比taskset更适合处理跨节点的CPU绑定,且能确保子进程继承绑定规则:
# 先通过numactl --hardware查看NUMA节点与CPU的对应关系 numactl --cpunodebind=<隔离CPU所属NUMA节点> --localalloc make -j15
验证效果
执行命令后,可通过以下方式确认CPU利用情况:
- 用
top并按下1,查看所有CPU的使用率,确认2-19号CPU是否有负载; - 用
ps -eo pid,cmd,psr查看Make及其子进程的运行CPU编号。
内容的提问来源于stack exchange,提问作者Sungtaek Lim
相关产品推荐
相关产品推荐

