异步I / O的主要用例是什么

时间:2011-09-22 07:56:17

标签: java performance asynchronous

我的应用程序不是基于Web的,只需要使用套接字来为大约1000个客户端提供服务。吞吐量和延迟对我来说至关重要。目前正在使用NIO的select(),但考虑在NIO.2中继续使用异步IO。

  1. 何时应使用异步I / O?
  2. 异步I / O的主要用例是什么?

2 个答案:

答案 0 :(得分:3)

如果您使用的是Infiniband网络,我建议您查看异步IO。

Comparing Java 7 Async NIO with NIO.

但是,如果您使用的是常规以太网,那么速度越快就越慢。编码比使用非阻塞IO更复杂,非阻塞IO比使用阻塞IO更复杂。

如果延迟是最重要的,我建议您考虑使用像Solarflare这样的内核旁路网络适配器。但是,如果你可以接受100微秒的延迟,那么你不太可能需要它。

答案 1 :(得分:3)

在需要扩展以处理许多并发连接的情况下,异步IO非常好。从历史上看,这样做的一种方法是为每个连接专用一个线程,但这种方法有限制you can read about here。使用异步IO,您可以使用更少的线程更轻松地处理许多事情,从而更好地扩展。

根据问题,它可能是也可能不是正确的方法,因为在延迟方面没有任何东西可以击败单个线程。然而,这是一个非常极端的结束,意味着你关心微秒。在许多情况下,需要在延迟和吞吐量/可扩展性之间进行权衡。

无论如何,它归结为您想要解决的问题以及您的期望(数字)需要达到的目标。异步IO很棒,很多情况都是同步的。您可能还需要考虑其他一些事项,例如协议。对同一数据(流)感兴趣的多个客户端可能表示您想要查看多播。如果每个客户端专用流量,那么这可能不是方法。

不知道你的延迟要求,但假设它们不是几微秒我肯定会看到只是读取你有1000个客户端的异步IO。异步IO决不会慢,同步/单线程连接可能无法很好地扩展。