V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
ytterbium
V2EX  ›  问与答

如何保证重要进程不因为进程调度而频繁挂起?

  •  
  •   ytterbium · 2020-07-31 14:19:42 +08:00 via Android · 1387 次点击
    这是一个创建于 1601 天前的主题,其中的信息可能已经有所发展或是发生改变。
    具体情况是,主进程负责完成主要计算任务,主进程 fork 出多个子进程,每个子进程对应一种数据类型,子进程负责产生对应类型的数据,当主进程需要某类型的数据时,通过进程间通信从对应子进程拿数据。

    每个子进程每次只产生一个单位数据放入队列,随后进入 idle 状态,直到数据被主进程拿走,再产生新数据。主进程处理一单位数据所需时间约是子进程产生一单位数据的 4 分之一,但是数据类型多,且不会连续取最近 3 次取过的类型的数据。

    希望达到的效果是主进程除了少量时间花在进程间通信上,几乎不停断地处理数据。目前遇到的问题是由于子进程较多,负载过高,主进程频繁被调度,不能持续运行。目前是设置子进程 nice 为最低优先级,但是没有效果。服务器 40 CPUs,1 主进程,400+子进程。
    5 条回复    2020-08-01 13:10:27 +08:00
    yidinghe
        1
    yidinghe  
       2020-07-31 15:33:22 +08:00 via Android   ❤️ 1
    我能想到的就是分配指定一个 CPU 给主进程,子进程不得使用该 CPU 。
    sariya
        2
    sariya  
       2020-07-31 21:24:38 +08:00 via Android   ❤️ 1
    没这么搞的吧…子进程进入 idle 时是不是可以转去生成其他类型数据,把进程数降下来
    ytterbium
        3
    ytterbium  
    OP
       2020-07-31 22:53:18 +08:00 via Android
    @yidinghe 查了一下,python 的 psutil.cpu_affinity 可以指定 cpu,接下来试一试,谢谢你的建议


    @sariya 进程数不重要,毕竟绝大多数子进程都是挂起的,只要有子进程请求 cpu 时间,主进程就可能被中断
    sariya
        4
    sariya  
       2020-08-01 10:39:53 +08:00 via Android
    你的主进程一次取走 100 子进程的数据,那么接下来就有 100 进程等着和主进程抢 cpu 。除了 1 楼说的设置亲和度之外,何不把子进程数量降到 cpu 核心数,每个子进程依次产出多个类型,主进程还能一次打包带走,不降进程数是有什么特殊需要吗
    ytterbium
        5
    ytterbium  
    OP
       2020-08-01 13:10:27 +08:00 via Android
    @sariya 实际上是有多个主进程,每个主进程处理不同大类的数据,每个主进程有多个子进程产生大类下的小类,多个主进程处理一定数据量后会同步一次产生最终输出,主题里我简化了问题,进程数很难降低到 cpu 核心数以下。如果是每个子进程产生多个数据类型会出现主进程等待子进程的情况,比如子进程依次产生 1 ~ 100 号类型的数据,主进程速度快,已拿走的 100 个处理完后,子进程还没产生完,这时候请求 90 号数据,子进程还没产生,主进程就要等了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5412 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 06:52 · PVG 14:52 · LAX 22:52 · JFK 01:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.