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

169 天前
 layxy

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

785 次点击
所在节点    程序员
7 条回复
afeiche
169 天前
会啊,毕竟他这个还是系统的线程,依赖于操作系统的调度,要不就是根据 cpu 的核数合理的分配线程数,要不就把 work verticle 分开部署
pigspy
169 天前
1 ,Event Loop 占用了所有 cpu 资源,还能再创建 Work Pool 吗?
当然可以
2,如果创建 work pool 执行了阻塞逻辑或密级计算型任务,会不会影响 event loop ?
会影响
Goooooos
169 天前
你可能对线程的概念不太了解,可以看看操作系统相关原理
nothingistrue
169 天前
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
169 天前
> 那 Event Loop 占用了所有 cpu 资源
不会,cpu 会给线程分配时间片,不存在某线程完全占用某个核心

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


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

跑密集运算场景,整体上看会对机器的 cpu 资源负载升高,但是这是可预期的正常的工作负载。反而因为密集运算跑在 work pool 的某个线程,不会干扰/拖慢 event loop 完成事件派发
layxy
168 天前
@nothingistrue 感谢大佬解答
layxy
168 天前
@cloud107202 感谢大佬解答

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

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

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

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

© 2021 V2EX