Linux 系统上如何设置让某一个用户创建的进程几乎完全不影响到系统上其它用户进程的调度?

2022-10-07 13:07:13 +08:00
 qemu32

由于在编译程序时会吃满系统上所有的 cpu ,导致其他进程响应迟钝且执行缓慢,我想专门用一个用户来执行编译程序的任务,这个用户执行的进程可以在其他用户没有执行比较耗费 cpu 的进程时吃满所有的 cpu ,但只要有其它的用户需要 cpu ,这个用户所执行的进程就必须立即给其他用户让步。

简单来说,我就是想让编译任务可以在系统空闲时吃满所有的 cpu ,在系统上有其他进程需要 cpu 时就立即给其它进程让步,在尽可能不影响到其他进程的执行的前提下让编译进程更快的执行。

Linux 系统上是否有什么方式可以做到这一点?我试过调整编译进程的 nice 值,但感觉效果几乎没有。

3901 次点击
所在节点    Linux
30 条回复
codehz
2022-10-07 13:17:11 +08:00
听起来适合用 SCHED_IDLE
qemu32
2022-10-07 13:51:43 +08:00
@codehz 能否具体一点,怎么用 SCHED_IDLE 来实现我的需求?
codehz
2022-10-07 14:02:28 +08:00
@qemu32 用 chrt -i -p 0 <PID> 的方式调整
microxiaoxiao
2022-10-07 14:52:17 +08:00
cggroup 试试,现在 linux 轻量级虚拟化不都是用的它么
qemu32
2022-10-07 15:11:10 +08:00
@codehz 不行哦,没有任何效果,我的测试方法是启动如下两个任务:

sysbench --time=60 --threads=12 cpu run

stress --cpu 12 --timeout 60

我的 cpu 是 12 个核心,这两个任务单独运行都会吃满 12 个核心,我使用 chrt 设置 sysbench 进程的调度类型,没有任何效果,sysbench 进程仍然会占用整个系统 50%的 cpu 。
codehz
2022-10-07 15:15:31 +08:00
chrt 只影响一个线程,你得给每个线程都设置一遍
qemu32
2022-10-07 15:26:01 +08:00
@codehz 还是不行哦

for spid in $(ps -T -p $(pgrep sysbench) | grep -v SPID | cut -d" " -f 2); do sudo chrt -i -p 0 $spid; done

我这样子就是将 sysbench 的每个线程都设置了,没有任何效果
codehz
2022-10-07 15:32:46 +08:00
要不试试 realtime 内核,然后把其他任务都设置成实时?
codehz
2022-10-07 15:40:58 +08:00
(搜索了一圈,还有一个方案是内核补丁加上 MuQSS 调度器,然后使用 SCHED_IDLEPRIO 调度类型,部分发行版提供了相关工具,叫做 schedtool (只有在启用特定内核(例如-ck 内核)之后才有可能设定的非标准类型
qemu32
2022-10-07 15:46:20 +08:00
@codehz #8 x86 架构不支持 PREEMPT_RT 配置

x86 架构只能选择
PREEMPT_NONE "No Forced Preemption (Server)"
PREEMPT_VOLUNTARY "Voluntary Kernel Preemption (Desktop)"
PREEMPT "Preemptible Kernel (Low-Latency Desktop)"

我刚才试了 PREEMPT 也是不行的
qemu32
2022-10-07 15:51:59 +08:00
有哪个发行版的内核是打上了 MuQSS 补丁的吗?
或者哪里能下载已经编译好的打上了 MuQSS 补丁的内核的 rpm 或 deb 包?
qemu32
2022-10-07 15:52:39 +08:00
@codehz 有哪个发行版的内核是打上了 MuQSS 补丁的吗?
或者哪里能下载已经编译好的打上了 MuQSS 补丁的内核的 rpm 或 deb 包?
dorothyREN
2022-10-07 17:01:04 +08:00
这么费劲 还不如装个虚拟机设置 6 个 core 。
qemu32
2022-10-07 17:04:51 +08:00
@dorothyREN 你是不是没看懂我的需求?

坦白说我也是想借着这个问题研究一下内核的进程调度逻辑,要是能实现这个功能,那么也就算对内核的调度有了更深一点的理解。
ArchieMeng
2022-10-07 17:17:26 +08:00
从这个文章上看,nice 应该会起作用的。https://scoutapm.com/blog/restricting-process-cpu-usage-using-nice-cpulimit-and-cgroups
关于响应慢的问题,还有可能是 IO 瓶颈的问题,你也许需要设置 ionice 类别为 IDLE 。毕竟编译也是高并发 IO 的场景。
des
2022-10-07 17:37:05 +08:00
@qemu32 #15 楼上也能解决你说的问题啊,毕竟你也没说要研究内核调度。我也觉得虚拟机是最好的解决办法了,或者你试试用 docker/systemd 限制资源使用
qemu32
2022-10-07 17:44:37 +08:00
@ArchieMeng 我觉得跟 io 没关系。

你能在你的机器上试一下我 #5 楼回复里的那个测试用例,给 sysbench 设置了 nice 之后的效果吗?我试了没有任何效果

nice -n 19 sysbench --time=60 --threads=12 cpu run



sysbench --time=60 --threads=12 cpu run

感觉没有任何区别
qemu32
2022-10-07 17:46:42 +08:00
@des 我就是想问一下 v 友有没有对进程调度比较熟,能直接解决这个问题的,如果没有我就只能自己研究实现了。
qemu32
2022-10-07 18:00:44 +08:00
@ArchieMeng @des 我刚才用自己编译的内核试了一下设置 nice 是管用的,但 fedora 36 的内核设置 nice 没有任何效果,虚拟机和物理机都没效果。
L4Linux
2022-10-07 18:23:05 +08:00
@codehz #6 chrt 不影响 child 是从哪里看的?我想了解一下。

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

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

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

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

© 2021 V2EX