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

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

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

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

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

3900 次点击
所在节点    Linux
30 条回复
L4Linux
2022-10-07 18:32:43 +08:00
@codehz 我找到了,manpage 里有写一个 -a 的参数。。。
ArchieMeng
2022-10-07 19:06:00 +08:00
@des 如果说是限制单个进程和其子进程的 Core 使用数量,没有必要用虚拟机,可以用 systemd-run --user --scope -p CPUQuota=xxx 来实现。但这个是限制整体 CPU 使用率的。个人建议是用 taskset 直接绑定到固定的几个核心上,这样不会有太频繁的 Context Switch ,性能会好些。
weiasd
2022-10-07 20:40:10 +08:00
cgroup 行不行
qemu32
2022-10-07 20:42:05 +08:00
@ArchieMeng 我发现只要内核配置了 CONFIG_SCHED_AUTOGROUP nice 就不起作用了
choury
2022-10-07 20:50:15 +08:00
@qemu32 /proc/sys/kernel/sched_autogroup_enabled 写 0 禁用掉
systemcall
2022-10-07 21:09:21 +08:00
我觉得你研究这些,还不如用虚拟机,遇到要共享的文件夹就共享过去
虚拟机可以完美实现你的需求。现在的 KVM 的效率是很高的,你又用不到 GPU
qemu32
2022-10-07 21:38:31 +08:00
将 nice 和 taskset 结合起来用可以满足我的需求,比如我的机器有 12 个核心,我指定用 11 个核心运行编译任务,并且把优先级设置到最低,类似这样:

nice -n 19 taskset --cpu-list 0-10:1 make -j11
wangyzj
2022-10-08 09:28:46 +08:00
虚拟化方案
类似 docker 的 cgroup 或者 vm 的 kvm 之类的,或者装个 vmware
endle
2022-10-08 22:34:45 +08:00
@systemcall LZ 的需求不过是编译的时候控制一下 cpu 占用,没必要引入虚拟机吧

@qemu32 我之前看到过一篇博客,提到在现代多核系统里,设置 nice 值可能没有用。你要不要看一看 cgroups ?

https://blog.lilydjwg.me/2020/5/11/priority-and-nice-value-in-linux.215304.html
ruidoBlanco
2022-10-10 16:17:35 +08:00
/etc/security/limits.conf 加一行,然后 dummyuser 默认 nice 就是 19 了。

dummyuser soft priority 19

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

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

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

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

© 2021 V2EX