Distributions
› Ubuntu
› Fedora
› CentOS
中文资源站
› 网易开源镜像站
qemu32
V2EX  ›  Linux

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

  •  
  •   qemu32 · Oct 7, 2022 · 5727 views
    This topic created in 1497 days ago, the information mentioned may be changed or developed.

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

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

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

    30 replies  •  2022-10-10 16:17:35 +08:00
    codehz
    codehz
    Oct 7, 2022
    1
    听起来适合用 SCHED_IDLE
    qemu32
    qemu32
    OP
    Oct 7, 2022
    2
    @codehz 能否具体一点,怎么用 SCHED_IDLE 来实现我的需求?
    codehz
    codehz
    Oct 7, 2022
    3
    @qemu32 用 chrt -i -p 0 <PID> 的方式调整
    microxiaoxiao
    microxiaoxiao
    Oct 7, 2022 via Android
    4
    cggroup 试试,现在 linux 轻量级虚拟化不都是用的它么
    qemu32
    qemu32
    OP
    Oct 7, 2022
    5
    @codehz 不行哦,没有任何效果,我的测试方法是启动如下两个任务:

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

    stress --cpu 12 --timeout 60

    我的 cpu 是 12 个核心,这两个任务单独运行都会吃满 12 个核心,我使用 chrt 设置 sysbench 进程的调度类型,没有任何效果,sysbench 进程仍然会占用整个系统 50%的 cpu 。
    codehz
    codehz
    Oct 7, 2022
    6
    chrt 只影响一个线程,你得给每个线程都设置一遍
    qemu32
    qemu32
    OP
    Oct 7, 2022
    7
    @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
    codehz
    Oct 7, 2022
    8
    要不试试 realtime 内核,然后把其他任务都设置成实时?
    codehz
    codehz
    Oct 7, 2022
    9
    (搜索了一圈,还有一个方案是内核补丁加上 MuQSS 调度器,然后使用 SCHED_IDLEPRIO 调度类型,部分发行版提供了相关工具,叫做 schedtool (只有在启用特定内核(例如-ck 内核)之后才有可能设定的非标准类型
    qemu32
    qemu32
    OP
    Oct 7, 2022
    10
    @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
    qemu32
    OP
    Oct 7, 2022
    11
    有哪个发行版的内核是打上了 MuQSS 补丁的吗?
    或者哪里能下载已经编译好的打上了 MuQSS 补丁的内核的 rpm 或 deb 包?
    qemu32
    qemu32
    OP
    Oct 7, 2022
    12
    @codehz 有哪个发行版的内核是打上了 MuQSS 补丁的吗?
    或者哪里能下载已经编译好的打上了 MuQSS 补丁的内核的 rpm 或 deb 包?
    dorothyREN
    dorothyREN
    Oct 7, 2022
    13
    这么费劲 还不如装个虚拟机设置 6 个 core 。
    qemu32
    qemu32
    OP
    Oct 7, 2022
    14
    @dorothyREN 你是不是没看懂我的需求?

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

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

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

    和

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

    感觉没有任何区别
    qemu32
    qemu32
    OP
    Oct 7, 2022
    18
    @des 我就是想问一下 v 友有没有对进程调度比较熟,能直接解决这个问题的,如果没有我就只能自己研究实现了。
    qemu32
    qemu32
    OP
    Oct 7, 2022
    19
    @ArchieMeng @des 我刚才用自己编译的内核试了一下设置 nice 是管用的,但 fedora 36 的内核设置 nice 没有任何效果,虚拟机和物理机都没效果。
    L4Linux
    L4Linux
    Oct 7, 2022 via Android
    20
    @codehz #6 chrt 不影响 child 是从哪里看的?我想了解一下。
    L4Linux
    L4Linux
    Oct 7, 2022 via Android
    21
    @codehz 我找到了,manpage 里有写一个 -a 的参数。。。
    ArchieMeng
    ArchieMeng
    Oct 7, 2022 via Android❤️1
    22
    @des 如果说是限制单个进程和其子进程的 Core 使用数量,没有必要用虚拟机,可以用 systemd-run --user --scope -p CPUQuota=xxx 来实现。但这个是限制整体 CPU 使用率的。个人建议是用 taskset 直接绑定到固定的几个核心上,这样不会有太频繁的 Context Switch ,性能会好些。
    weiasd
    weiasd
    Oct 7, 2022
    23
    cgroup 行不行
    qemu32
    qemu32
    OP
    Oct 7, 2022
    24
    @ArchieMeng 我发现只要内核配置了 CONFIG_SCHED_AUTOGROUP nice 就不起作用了
    choury
    choury
    Oct 7, 2022❤️1
    25
    @qemu32 /proc/sys/kernel/sched_autogroup_enabled 写 0 禁用掉
    systemcall
    systemcall
    Oct 7, 2022
    26
    我觉得你研究这些,还不如用虚拟机,遇到要共享的文件夹就共享过去
    虚拟机可以完美实现你的需求。现在的 KVM 的效率是很高的,你又用不到 GPU
    qemu32
    qemu32
    OP
    Oct 7, 2022
    27
    将 nice 和 taskset 结合起来用可以满足我的需求,比如我的机器有 12 个核心,我指定用 11 个核心运行编译任务,并且把优先级设置到最低,类似这样:

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

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

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

    dummyuser soft priority 19
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   4714 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 156ms · UTC 03:36 · PVG 11:36 · LAX 19:36 · JFK 22:36
    ♥ Do have faith in what you're doing.