能否设置更高io-niceness值运行bazel build及相关子进程?
是否可以用提升后的io-niceness值运行bazel build
完全可以。Linux下IO优先级(即io-niceness对应的调度参数)默认遵循父进程向子进程继承的规则,只要启动bazel时配置好对应IO优先级,bazel后续拉起的编译、链接、打包等所有子进程,包括沙箱内运行的构建动作进程,都会自动继承该优先级,不需要单独给子进程做配置。
具体实现方法
方法1:用ionice直接包裹bazel启动命令(优先用这个,无侵入)
这是最简单的方案,直接调用ionice启动bazel即可,根据实际优先级需求选对应参数:
- 需要最高IO优先级(实时调度类,构建过程不会被其他后台进程抢占IO资源,需要root或配置了对应权限的普通用户)时,执行:
ionice -c 1 -n 0 bazel build <构建目标,比如//...>
参数含义:
-c 1:指定IO调度类为实时类,优先级高于系统默认的普通尽力而为类、空闲类进程-n 0:指定调度类内的优先级数值,范围0-7,数值越小优先级越高,0是最高级只需要比系统默认优先级稍高、不想抢占其他进程IO(普通用户直接能用,不需要root)时,执行:
ionice -c 2 -n 2 bazel build <构建目标>
参数含义:
-c 2:使用系统默认的普通尽力而为调度类,该类下系统默认优先级为4-n 2:设置优先级为2,比默认值高两个等级,构建时会比普通后台进程优先拿到IO资源,不会过度影响其他前台程序运行
方法2:给已经启动的bazel进程及子进程批量调优先级
如果bazel build已经跑起来了才要调优先级,不用重启构建,直接给bazel所在的整个进程组设置IO优先级就行:
- 先查bazel主进程的进程组ID(PGID):
ps -o pgid= $(pgrep -x bazel) | tr -d ' '
- 用ionice给整个进程组设置优先级,组内所有现存进程、后续新拉起的子进程都会自动应用该优先级:
# 示例:设置为普通类优先级2 ionice -c 2 -n 2 --pgid <上一步查到的PGID数值>
踩坑提示
- 普通用户默认不能设置实时类(
-c 1)IO优先级,如果不想每次用sudo启动bazel(sudo启动会把bazel缓存目录属主改成root,后续普通用户跑bazel会报权限错误),可以在/etc/security/limits.conf加一行配置,把your_username换成你自己的用户名,保存后重新登录就生效:
your_username hard ioprio_rt 0
- 4.0及以上所有主流版本bazel的沙箱隔离机制都不会重置进程IO优先级,子进程继承逻辑完全正常,不需要给沙箱加额外配置。
内容的提问来源于stack exchange,提问作者mystery_doctor
相关产品推荐
相关产品推荐

