用普通用户运行的 lxc 如何设置 cgroup cpu 调度的优先级?

2025 年 5 月 8 日
 wniming

先说一下需求,我有一台 9950x 的台式机作为 all in one 服务器,其中有一个用普通用户运行的 lxc 是作为编译服务器使用的,我希望在执行编译任务时能吃满系统的所有 cpu 资源,但如果在执行编译任务时这台机的其他服务也需要 cpu 资源,作为编译服务器的 lxc 容器能给其他的服务让步,所以需要给 lxc 容器设置最低的 cpu 调度优先级。

如果是 root 用户运行的 lxc 可以在 lxc 的容器的配置文件里用 lxc.cgroup2.cpu.weight 或 lxc.cgroup2.cpu.weight.nice 来设置,但用普通用户运行的 lxc 这两个设置都不起作用(测试方法是在 lxc 容器内和容器外各运行一个吃满所有 cpu 的进程,然后通过 top 查看两个进程各占用多少的 cpu ),已经问了 chatgpt ,结果 chatgpt 给了很多不存在的配置,感觉还是不如来这里问 v 友靠谱。

这里说的普通用户运行的 lxc 是指用 https://linuxcontainers.org/lxc/getting-started/ 这篇文档里 "Create Unprivileged Containers as a User" 这个部分的配置方式配置的 lxc 。

物理机的系统是 fedora 42 。

1926 次点击
所在节点    Linux
6 条回复
yanqiyu
2025 年 5 月 8 日
systemd 应该默认给了 user@.service 的 Delegate=cpu ,这样子 rootless 应该能够操作 user@uid.service 下面的 cpu controller 才对?

要不要试一试用
systemd-run --unit=lxc-unit --user -p CPUWeight=10 --collect --pty lxc ...
来启动 lxc 看看能不能把 lxc 放进去设置了 cpu controller 的环境?
wniming
2025 年 5 月 8 日
@yanqiyu 我也觉得理论上应该起作用,但是刚才我用一个全新安装的 fedora 42 又重新试了一下还是不行,而且如果是在 lxc 配置文件里指定 lxc.cgroup2.cpu.weight 的话,在 lxc 内部 cat /sys/fs/cgroup/cpu.weight 是能看到变化的,但如果是用 systemd-run --unit=lxc-unit --user -p CPUWeight=10 --collect --pty lxc-start -F f42 这条命令的话,在 lxc 内部 cat /sys/fs/cgroup/cpu.weight 没有看到变化。
yanqiyu
2025 年 5 月 8 日
@wniming cgroup2 是一个树状的结构,要是你 systemd-cgls 显示 lxc 的容器内部的进程(和他们的 cgroup 控制器)在 lxc-unit 下面的话就是生效了。

你可以把这个 weight 理解成 systemd 给 lxc-unit 设置的低 weight 其实是控制 lxc-unit 的整个树的 weight 都低,再往下的 weight 可以理解成树内部的优先级的分配,所以要是 lxc 创建了额外的 cgroup 层级你看到/sys/fs/cgroup/cpu.weight =100 是正常的。
wniming
2025 年 5 月 8 日
@yanqiyu systemd-cgls 的输出结果中没有 lxc-unit , 而且在 sysfs 下查看虽然有 lxc-unit.service 但是这个和 lxc-f42-0.scope 是平级关系

root@localhost:/home/d# cat /sys/fs/cgroup/user.slice/user-1000.slice/user@1000.service/app.slice/lxc-unit.service/cpu.weight
10
root@localhost:/home/d#
root@localhost:/home/d# cat /sys/fs/cgroup/user.slice/user-1000.slice/user@1000.service/app.slice/lxc-f42-0.scope/cpu.weight
100
root@localhost:/home/d#
yanqiyu
2025 年 5 月 8 日
@wniming #4 说明 lxc 这个坏东西想办法把自己漏出去了?要么试一试
systemd-run --user --scope -p "Delegate=yes" -p "CPUWeight=10" --unit lxc-unit lxc-start -F f42
yanqiyu
2025 年 5 月 8 日
@wniming #4 突然意识到还有个可能的办法是设置 lxc-.scope.d 里面的 drop-in 来配 CPUWeight ,语法可以看 https://www.freedesktop.org/software/systemd/man/latest/systemd.unit.html

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1130316

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX