我是Java NIO的新手并且已经使用了一点。我有一个通用的查询。如果您正在设计超低延迟应用程序与高吞吐量应用程序,那么使用非阻塞IO会明显受益于哪两个?
我的理解是非阻塞IO当然应该有助于高吞吐量,因为工作线程没有阻塞,因此不等待响应,并且可以自由地发送新请求,直到之前的请求被提供。一旦我们获得先前激活的请求的响应,工作线程就可以异步处理它们,从而提高吞吐量。
但是,我无法看到非阻塞IO如何直接使低延迟应用程序受益。
我猜“异步行为是避免争用的好方法。”如果是这种情况,低争用意味着低延迟。因此,NIO可能有助于降低延迟。它有意义吗?
答案 0 :(得分:2)
“异步行为是避免争用的好方法。” - 仅在使用单线程时。如果有很多线程,争论是不可避免的。您必须使用多线程(使用或不使用NIO)来获得高吞吐量和/或低延迟。
NIO只能帮助保持线程数低(大约可用处理器数量),从而节省内存(每个线程占用大量内存)并允许大量同时连接,但通常比阻塞IO性能更差。
答案 1 :(得分: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来延迟和吞吐量。