V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
layxy
V2EX  ›  程序员

关于 vertx 的 Event Loop 和 Work Pool 资源分配问题

  •  
  •   layxy · 2023-11-21 09:21:42 +08:00 · 1031 次点击
    这是一个创建于 378 天前的主题,其中的信息可能已经有所发展或是发生改变。

    看了官方文档,Event Loop 用于处理非阻塞或者短耗时场景,查了资源推荐 Event Loop 数量和 cpu 核心数量保持一致,那 Event Loop 占用了所有 cpu 资源,还能再创建 Work Pool 吗,如果创建 work pool 执行了阻塞逻辑或密级计算型任务,会不会影响 event loop

    7 条回复    2023-11-22 09:17:38 +08:00
    afeiche
        1
    afeiche  
       2023-11-21 09:24:36 +08:00
    会啊,毕竟他这个还是系统的线程,依赖于操作系统的调度,要不就是根据 cpu 的核数合理的分配线程数,要不就把 work verticle 分开部署
    pigspy
        2
    pigspy  
       2023-11-21 09:31:44 +08:00
    1 ,Event Loop 占用了所有 cpu 资源,还能再创建 Work Pool 吗?
    当然可以
    2,如果创建 work pool 执行了阻塞逻辑或密级计算型任务,会不会影响 event loop ?
    会影响
    Goooooos
        3
    Goooooos  
       2023-11-21 10:20:10 +08:00
    你可能对线程的概念不太了解,可以看看操作系统相关原理
    nothingistrue
        4
    nothingistrue  
       2023-11-21 10:24:41 +08:00
    vertx 基于 netty ,Event Loop 跟 Work Pool 都是 Netty 的架构概念。

    Event Loop 跟 Work Pool 都是 Netty 的启动项,启动时候就建好的,不存在「再创建」。Work Pool 内部再由 ChanleHandle 组成 Pipeline 。至于来得消息咋处理的,就看你 Pipeline 怎么组了。

    Event Loop 全权负责 TCP 连接的 IO ,但也仅仅负责这些,它不负责最终处理,而是将其转给 Work Pool 。所以 Event Loop 基本不可能占用太多的 CPU 资源(楼主这里可能需要再补充一下线程的知识)。Event Loop 数量和 cpu 核心数量保持一致,我没见过这个推荐,实际上可能就是随口一说。这玩意大多数情况下,开一个就够了,它应该是最大数量没必要超过 cpu 核心数量。

    Work Pool 是否会阻塞,取决于 Pipeline 怎么设计。如果是全同步的 Pipeline ,那么 Work Pool 就是阻塞的。如果这时候再执行长时任务,那么系统的并发量,就被限制成了 Work Pool 的个数。Work Pool 阻塞的时候,技术层面上讲 Event Loop 并没有阻塞。但是,因为 Event Loop 无法再往 Work Pool 送数据了,它实际层面上被阻塞了。如果 Pipeline 中间有任何一个 ChanleHandle 是异步的,那么 Work Pool 就是非阻塞的,这时候全程非阻塞。
    cloud107202
        5
    cloud107202  
       2023-11-21 10:39:48 +08:00
    > 那 Event Loop 占用了所有 cpu 资源
    不会,cpu 会给线程分配时间片,不存在某线程完全占用某个核心

    eventloop threadpool 线程数量 <= core size 是因为超过了没有意义,受到并行限制


    > 如果创建 work pool 执行了阻塞逻辑或密级计算型任务,会不会影响 event loop
    粗略的讲,也不会。阻塞任务不占用 cpu 时间片,比如用 jstack 等工具去观察线程的状态机,等待锁是 blocked 等待定时器是 timed-waiting.

    跑密集运算场景,整体上看会对机器的 cpu 资源负载升高,但是这是可预期的正常的工作负载。反而因为密集运算跑在 work pool 的某个线程,不会干扰/拖慢 event loop 完成事件派发
    layxy
        6
    layxy  
    OP
       2023-11-22 09:17:33 +08:00
    @nothingistrue 感谢大佬解答
    layxy
        7
    layxy  
    OP
       2023-11-22 09:17:38 +08:00
    @cloud107202 感谢大佬解答
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6031 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 02:16 · PVG 10:16 · LAX 18:16 · JFK 21:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.