2012-08-25 47 views
6

有沒有人想過如何在Java中做內核旁路?任何地方的世界你好,還是火箭科學?在Java中使用內核旁路的網絡

+11

關閉此事的人對網絡無能爲力。幹得好! – chrisapotek

+0

這個問題存在很好的理由。內核不會像用戶API那樣爲我們提供相同數量的數據包吞吐量。老實說,我會對@Makoto,John Palmer,Don Roby,rene,Ben提出這個問題。 –

回答

1

搜索「Java Zero-Copy Buffers」或「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/

+0

這是很棒的信息eSniff。我正在使用Java NIO,但不能繞過內核。 – chrisapotek

+0

我在java中沒有編寫程序,所以我不確定這個答案有多相關。但爲什麼最近降價呢? – eSniff

5

如果使用的是Solarflare的,你可以使用他們的API來完成的內核旁路(我並沒有直接使用它,所以不能提供更多細節)。您還可以使用像29West LBM或IBM LLM這樣的消息傳送產品,它們支持各種硬件的豐富功能。

作爲@eSniff提到的,JRE有transferFrom()/transferTo() API,它現在被用來公開支持它的系統的等價物sendfile(2)。 API的語義被定義爲可以透明地實現以支持任何2個通道之間的DMA傳輸。

+0

嘿,但transferFrom和transferTo與FileChannel有關!我在這裏談論SocketChannel和DatagramChannel: – chrisapotek

+0

@chrisapotek一個socketChannel既是一個WritableByteChannel也是一個ReadableByteChannel,所以.... someFileChannel.transferFrom(someSocketChannel,pos,count)/ someFileChannel.transferTo(pos,count,someSocketChannel )我自己只使用了Netty包裝器,但這應該起作用 – eSniff

+1

transferXxx是暴露DMA樣式功能的標準API在Oracle HotSpot JRE中,從版本7開始,它僅用於文件和套接字。我認爲它不會在用戶空間內存緩衝區和套接字(即RDMA)之間起作用。也就是說,代碼具有擴展點,如果我沒有弄錯,新的通道類型可以由第三方的提供程序庫添加。 – ddimitrov