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

Java 异步I/O的主要用例是什么,java,performance,asynchronous,Java,Performance,Asynchronous,我的应用程序不是基于web的,只需要使用套接字来服务大约1000个客户端。吞吐量和延迟对我来说至关重要。目前正在使用NIO中的select(),但正在考虑在NIO中使用异步IO 什么时候应该使用异步I/O 异步I/O的主要用例是什么 如果您使用的是Infiniband网络,我建议您查看异步IO 然而,如果您使用的是常规以太网,那么它很可能既慢又快。编码比使用非阻塞IO更复杂,非阻塞IO比使用阻塞IO更复杂 如果延迟是最重要的,我建议您考虑使用内核旁路网络适配器,如Solarflare。但是,如

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

  • 什么时候应该使用异步I/O
  • 异步I/O的主要用例是什么

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

    然而,如果您使用的是常规以太网,那么它很可能既慢又快。编码比使用非阻塞IO更复杂,非阻塞IO比使用阻塞IO更复杂


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

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

    根据问题的不同,它可能是正确的方法,也可能不是正确的方法,因为在延迟方面,没有什么能比得上单个线程。然而,这是一个非常极端的结果,意味着你关心微秒。在许多情况下,延迟和吞吐量/可伸缩性之间需要权衡

    在任何情况下,这都取决于你想要解决什么问题,以及你的期望(数字)是什么。异步IO非常好,在许多情况下,同步IO也是如此。也可能还有其他的事情需要考虑,比如协议。对同一数据(流)感兴趣的多个客户端可能表示您希望查看多播。如果流量是每个客户端专用的,那么这可能不是方法


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

    当CPU/线程需要等待某些硬件响应时,请使用异步——异步允许线程中的CPU周期在此时执行其他操作。如果CPU/线程忙于工作(这意味着您的瓶颈不是I/O),那么它就没有用处。