JVM Internals: socket-to-socket "zero copy"
От: Golovach Ivan Украина http://kharkovitcourses.blogspot.com
Дата: 29.06.12 09:38
Оценка:
Вопрос к тем, кто силен и в 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.
Re: JVM Internals: socket-to-socket "zero copy"
От: A13x США  
Дата: 29.06.12 13:44
Оценка:
Здравствуйте, 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.
Вероятно запись в сокет области памяти аллоцированной подобным образом позволит избежать дополнительного копирования. Почему бы не попробовать на тестовом примере и не сравнить с традиционным вариантом?
Re: JVM Internals: socket-to-socket "zero copy"
От: StanislavK Великобритания  
Дата: 02.07.12 11:22
Оценка:
Здравствуйте, 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. Не знаю насколько быстро это будет работать...
Re[2]: JVM Internals: socket-to-socket "zero copy"
От: StanislavK Великобритания  
Дата: 02.07.12 11:27
Оценка:
Здравствуйте, A13x, Вы писали:

A>Здравствуйте, Golovach Ivan, Вы писали:


A>ну я так понимаю суть в том, чтобы получить память в kernel space, что сделает ByteBuffer.allocateDirect.

Неправда. Нет там никакого kernel space, это будет просто память процесса.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.