【问题标题】:Networking with Kernel Bypass in Java [closed]在 Java 中使用内核绕过的网络 [关闭]
【发布时间】:2012-08-25 15:45:52
【问题描述】:

有没有人知道如何在 Java 中绕过内核?任何你好世界,或者这是火箭科学?

【问题讨论】:

  • 关闭这个的人对网络一无所知。伙计们干得好!
  • 这个问题的存在是有充分理由的。内核没有给我们提供与用户 API 相同数量的数据包吞吐量。老实说,我会就此向@Makoto、John Palmer、Don Roby、rene、Ben 提出上诉。

标签: java sockets networking tcp real-time


【解决方案1】:

如果你使用 solarflare,你可以使用他们的 API 来做内核绕过(我没有直接使用它,所以不能提供更多细节)。您还可以使用像 29West LBM 或 IBM LLM 这样的消息传递产品,它们支持各种硬件上的丰富功能。

正如@eSniff 提到的,JRE 有transferFrom() / transferTo() API,现在用于为支持它的系统公开sendfile(2) 等效项。定义了 API 的语义,因此可以透明地实现它以支持任意 2 个通道之间的 DMA 传输。

【讨论】:

  • 嘿,但是 transferFrom 和 transferTo 与 FileChannel 有关系!我在这里谈论的是用于网络的 SocketChannel 和 DatagramChannel :(
  • @chrisapotek 一个 socketChannel 既是一个 WritableByteChannel 又是一个 ReadableByteChannel,所以 .... someFileChannel.transferFrom(someSocketChannel, pos, count) / someFileChannel.transferTo( pos, count, someSocketChannel) 我只有我自己使用了 Netty 包装器,但这应该可以工作。
  • transferXxx 是公开 DMA 风格功能的标准 API。在 Oracle HotSpot JRE 中,从版本 7 开始,它仅针对文件和套接字实现。我认为它不会在用户空间内存缓冲区和套接字(即 RDMA)之间工作。也就是说,代码有扩展点,如果我没记错的话,新的通道类型可以由第 3 方的提供商库添加。
【解决方案2】:

搜索“Java 零拷贝缓冲区”或“Java NIO”或“Java Netty”。

这是关于Netty 和零拷贝的幻灯片:http://www.slideshare.net/danbim/zerocopy-eventdriven-servers-with-netty。这是一个使用 Netty 的示例项目。

或者你可以去更低级别并使用java.nio.channels类,你可以在这里阅读http://www.ibm.com/developerworks/linux/library/j-zerocopy/

【讨论】:

  • 这是很好的信息 eSniff。我正在使用 Java NIO,但这并没有绕过内核。
  • 我已经好几年没用 java 编程了,所以我不确定答案的相关性有多大。但为什么最近投反对票?
猜你喜欢
  • 2013-08-24
  • 2013-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-25
  • 1970-01-01
  • 2011-07-07
  • 2013-03-10
相关资源
最近更新 更多