6

我是 Java NIO 的新手,并且已经使用了一点。我有一个一般性的查询。如果您正在设计超低延迟应用程序和高吞吐量应用程序,那么使用非阻塞 IO 会明显受益于两者中的哪一个?

我的理解是,非阻塞 IO 肯定有助于提高吞吐量,因为工作线程没有阻塞,因此不会等待响应,并且可以自由地触发新请求,直到之前的请求得到处理。一旦我们得到先前触发的请求的响应,工作线程就可以异步处理它们,从而提高吞吐量。

但是,我无法看到非阻塞 IO 如何直接使低延迟应用程序受益。

我猜“异步行为是避免争用的好方法”。如果是这样的话,低竞争意味着低延迟。因此 NIO 可能有助于降低延迟。是否有意义?

4

2 回答 2

2

“异步行为是避免争用的好方法。” - 仅在使用单线程时。如果线程很多,争用是不可避免的。您必须使用多线程(有或没有 NIO)来获得高吞吐量和/或低延迟。

NIO 仅有助于保持较低的线程数量(大约可用处理器的数量),从而节省内存(每个线程消耗大量内存)并允许大量同时连接,但通常比阻塞 IO 性能更差。

于 2014-02-11T19:45:12.570 回答
1

这一切都取决于... :)

  • 如果您有多个并发线程 <= CPU 内核数,那么您可以使用阻塞 IO/NIO 获得低延迟。通常,在阻塞 IO/NIO 的情况下,吞吐量会稍差一些。参见例如:http: //vanillajava.blogspot.ru/2011/08/comparing-java-7-async-nio-with-nio.html

  • 如果您有大量线程,则每个连接的线程模型比异步 NIO 更不受欢迎。主要是因为您支付了上下文切换的成本,这可能不是那么小(调用系统调度程序的时间,更多的缓存未命中等)。例如,请参见:http ://www.cs.rochester.edu/u/cli/research/switch.pdf 更多线程 = 更多总价 :) 在这里,我们需要异步 NIO 来实现延迟和吞吐量。

于 2014-03-04T23:09:20.663 回答