【问题标题】:When to use selector and when to use blocking channels (performence)何时使用选择器以及何时使用阻塞通道(性能)
【发布时间】:2014-07-14 13:57:11
【问题描述】:
  • 假设有 1 到 30~ 个通道(UDP 和 TCP 通道)
  • 假设我们使用 NIO 通道
  • 假设我们在多核 CPU 上运行 有两种选择:

    1. 为每个通道定义 1 个线程(每个线程将被阻塞,直到有数据要读取) (所以所有线程都在等待 Q ......直到他们醒来) 或:
    2. 定义 1 个线程(带有选择器),它将读取数据(每次从不同的通道)
  • 最好的方法是什么?

  • 什么能给我最好的表现?

【问题讨论】:

  • 答案真的取决于你的要求。您需要最低延迟还是最高吞吐量?您可以为此投入多少核心?
  • 我正在写一个资产。因此可以更改延迟、吞吐量和#cores ...

标签: java multithreading parallel-processing selector channel


【解决方案1】:

在 Java 中,您无法对线程(具体)机制进行太多控制,因此您无法真正将线程绑定到某个核心(例如设置关联性),因此您不能期望拥有一个单一的线程会有很大的性能差异通过选择器进行线程处理或具有多个每通道线程。

鉴于我刚才的介绍,我们再谈高一点,好吗?

如果您有多个线程,每个通道一个,并且考虑到多核处理器,如果您有单线程处理,则可能有 N 个线程(其中 N 是内核数)同时执行如果我们可以保证一旦发出某个请求,就不会再有另一个请求到达,那么请求队列可能会有一定的速度。无论哪种方式,线程的处理最终都会通过上下文切换将线程从核心中取出,看看是否还有其他事情要做,如果没有,则将一些线程放回核心上执行。

有时会发生的情况是,您的线程不断从一个核心移动到另一个核心,这会杀死缓存,最终导致性能下降(许多其他因素也会影响)。

因此,根据同时到达的请求数量,我更喜欢多线程方法。

干杯。

【讨论】:

  • 顺便说一句,要在 Java 中将线程绑定到核心,请尝试 github.com/OpenHFT/Java-Thread-Affinity
  • @PeterLawrey 看起来很有趣!但是,我的答案基于 Java 提供的核心库。我会看看这个项目,谢谢你的参考。
  • 谢谢,那么,根据您在这里写的内容,当我们使用选择器时?使用选择器而不是多线程(每个通道线程......)有什么好处?
  • 我的理解是选择器可以让你只使用一个线程就可以使用更少的资源。使用将取决于问题,但正如我所说,为了获得最大吞吐量,多线程将允许您同时执行多个任务。
猜你喜欢
  • 2011-09-22
  • 2019-11-04
  • 1970-01-01
  • 2013-11-16
  • 1970-01-01
  • 2010-10-11
  • 2021-12-16
  • 1970-01-01
  • 2018-10-18
相关资源
最近更新 更多