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

15 小时 23 分钟前
 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 。

517 次点击
所在节点    Linux
6 条回复
yanqiyu
15 小时 2 分钟前
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
13 小时 41 分钟前
@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
12 小时 40 分钟前
@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
12 小时 14 分钟前
@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
10 小时 46 分钟前
@wniming #4 说明 lxc 这个坏东西想办法把自己漏出去了?要么试一试
systemd-run --user --scope -p "Delegate=yes" -p "CPUWeight=10" --unit lxc-unit lxc-start -F f42
yanqiyu
10 小时 43 分钟前
@wniming #4 突然意识到还有个可能的办法是设置 lxc-.scope.d 里面的 drop-in 来配 CPUWeight ,语法可以看 https://www.freedesktop.org/software/systemd/man/latest/systemd.unit.html

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

https://yangjunhui.monster/t/1130316

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

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

© 2021 V2EX