Вопрос к тем, кто силен и в Java и в Linux:
Есть ли возможность организовать "zero copy" из SocketChannel/AsynchronousSocketChannel в SocketChannel/AsynchronousSocketChannel средствами Java под Linux не используя JNI? Т.е. передачу данных из сокета в сокет, при котором:
1) мы не вытаскиваем данные из user space в kernel space
2) соответственно делаем только два копирования при помощи DMA и никаких копирования при помощи CPU
---
FileChannel.transferTo(long position, long count, WritableByteChannel target) как говорят
тут под Linux делается через zero-copy. Вопрос в том, могу ли организовать что-то подобное socket-to-socket? Видимо, надо использовать ByteBuffer.allocateDirect.
Здравствуйте, Golovach Ivan, Вы писали:
GI>Вопрос к тем, кто силен и в Java и в Linux:
GI>Есть ли возможность организовать "zero copy" из SocketChannel/AsynchronousSocketChannel в SocketChannel/AsynchronousSocketChannel средствами Java под Linux не используя JNI? Т.е. передачу данных из сокета в сокет, при котором:
GI>1) мы не вытаскиваем данные из user space в kernel space
GI>2) соответственно делаем только два копирования при помощи DMA и никаких копирования при помощи CPU
GI>---
GI>FileChannel.transferTo(long position, long count, WritableByteChannel target) как говорят тут под Linux делается через zero-copy. Вопрос в том, могу ли организовать что-то подобное socket-to-socket? Видимо, надо использовать ByteBuffer.allocateDirect.
ну я так понимаю суть в том, чтобы получить память в kernel space, что сделает ByteBuffer.allocateDirect.
Вероятно запись в сокет области памяти аллоцированной подобным образом позволит избежать дополнительного копирования. Почему бы не попробовать на тестовом примере и не сравнить с традиционным вариантом?
Здравствуйте, Golovach Ivan, Вы писали:
GI>Вопрос к тем, кто силен и в Java и в Linux:
GI>Есть ли возможность организовать "zero copy" из SocketChannel/AsynchronousSocketChannel в SocketChannel/AsynchronousSocketChannel средствами Java под Linux не используя JNI? Т.е. передачу данных из сокета в сокет, при котором:
GI>1) мы не вытаскиваем данные из user space в kernel space
GI>2) соответственно делаем только два копирования при помощи DMA и никаких копирования при помощи CPU
GI>---
GI>FileChannel.transferTo(long position, long count, WritableByteChannel target) как говорят тут под Linux делается через zero-copy. Вопрос в том, могу ли организовать что-то подобное socket-to-socket? Видимо, надо использовать ByteBuffer.allocateDirect.
Не, allocateDirect не поможет, это просто пямять вне JVM.
Если я не ошибаюсь, SocketChannel implements WritableByteChannel & ReadableByteChannel, а у файла есть transferTo & transferFrom, так, что можно сделать, что-то с файлом посередине. Файл можно сделать memory mapped. Не знаю насколько быстро это будет работать...