【问题标题】:SocketChannel: Single or multi , which is better?SocketChannel: Single 或 multi ,哪个更好?
【发布时间】:2011-07-11 03:12:10
【问题描述】:

SocketChannel 是线程安全的,因此客户端和服务器之间的通信只需要一个通道。同时用于读/写操作的通道

但是,如果我们使用多通道(同一客户端和服务器之间有多个连接),是否会提高 io 性能???

如果可以,为什么??????

欢迎任何答案。

假设有一个缓存客户端,它从远程服务器轮询数据。

public class Client(){
    public Object getThroungOneChannel(Object key){
       getTheUniqueChannel().write(request);
       waitForResponse();
    }

    public Object getWithMultiChannel(Object key){
       getChannelFromAPool().write(request)
       waitForResponse();
    }
}

哪种方式io性能更好。

【问题讨论】:

  • 您的意思是同一连接的多个通道?同一连接如何获得两个不同的频道?
  • 不是同一个连接,而是在同一个客户端和服务器之间使用多个连接
  • +1 这个问题不值得投反对票。

标签: java networking nio


【解决方案1】:

一般来说,客户端和服务器之间的单个连接是最好的方法。我无法想象在同一个客户端和服务器之间传输相同数据的多个连接会有什么帮助。通过正确实现命令模式,您可以将通道的使用优化到最大,这实际上是 NIO 的全部优势。例如,假设即使您有一个线程写入通道阻塞生成数据,您也可以让另一个线程将一些其他数据写入同一通道,但您必须巧妙地编写代码以从 NIO 中提取出最好的。

对于您给出的示例,我相信,在微不足道的情况下,getThroungOneChannel() 的性能将优于 getWithMultiChannel()

【讨论】:

  • 我已经更新了这个问题。情况是我希望客户端同时执行发送请求。谢谢你的回答。
【解决方案2】:

通常使用多个 TCP 连接不会提高性能。

在“长胖管道网络”的情况下,单个 TCP 连接无法使用所有可用带宽。在这种情况下,多个 TCP 连接可能会提高性能。

谷歌“长肥管”获取更多信息。

【讨论】:

    【解决方案3】:

    来自 SocketChannel 类的 javadocs

    "套接字通道可以安全地被多个并发线程使用。它们支持并发读写,尽管在任何给定时间最多一个线程可能正在读取并且最多一个线程可能正在写入。connect 和 finishConnect 方法是相互的彼此同步,并且在调用这些方法之一正在进行时尝试启动读取或写入操作将阻塞,直到该调用完成。"

    所以看起来通过多个线程的读/写是序列化的。所以一个通道只有有限的吞吐量。但是,如果您正在谈论拥有多个通道 - 假设所有通道都连接到客户端/服务器上的不同套接字(端口),它应该具有更高的 IO 性能。测试将能够证明这一点,这里有一些示例,说明如何在此测试中使用 Socket 和 SocketChannel 类。 http://www.exampledepot.com/taxonomy/term/196

    HTH, K

    【讨论】:

    • 我已经阅读了文档。它只表示'connect'和'finishConnect'是相互同步的。这是否意味着读/写等其他操作可以同时执行!
    • 我感到困惑的是,物理网络设备也可能以序列化的方式服务器 io 请求。所以多连接可能没有意义
    • -1。网络是决定速率的步骤,而不是 CPU 或线程。
    【解决方案4】:

    有时,多个连接的性能优于单个连接,这通常是 ISP 进行流量整形,或者远程系统配置为每个连接仅提供一定数量的带宽时。

    【讨论】:

      猜你喜欢
      • 2017-06-18
      • 1970-01-01
      • 2013-03-16
      • 1970-01-01
      • 2011-02-22
      • 2013-06-06
      • 2013-11-02
      • 1970-01-01
      • 2013-03-21
      相关资源
      最近更新 更多