先说一下需求,我有一台 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 。
1
yanqiyu 12 小时 35 分钟前
systemd 应该默认给了 [email protected] 的 Delegate=cpu ,这样子 rootless 应该能够操作 [email protected] 下面的 cpu controller 才对?
要不要试一试用 systemd-run --unit=lxc-unit --user -p CPUWeight=10 --collect --pty lxc ... 来启动 lxc 看看能不能把 lxc 放进去设置了 cpu controller 的环境? |
2
wniming OP @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 没有看到变化。
|
3
yanqiyu 10 小时 14 分钟前
@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 是正常的。 |
4
wniming OP @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/[email protected]/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/[email protected]/app.slice/lxc-f42-0.scope/cpu.weight 100 root@localhost:/home/d# |
5
yanqiyu 8 小时 20 分钟前
@wniming #4 说明 lxc 这个坏东西想办法把自己漏出去了?要么试一试
systemd-run --user --scope -p "Delegate=yes" -p "CPUWeight=10" --unit lxc-unit lxc-start -F f42 |
6
yanqiyu 8 小时 17 分钟前
@wniming #4 突然意识到还有个可能的办法是设置 lxc-.scope.d 里面的 drop-in 来配 CPUWeight ,语法可以看 https://www.freedesktop.org/software/systemd/man/latest/systemd.unit.html
|