LINUX.ORG.RU

writev/vmsplice on sockets


0

1

Есть буфер (кусками), который распределен для реализации zero-copy посредством mmap().

Сокет неблокирующий.

Делается вызов writev/vmsplice на файловом дескрипторе сокета с передачей ему соответствующего iovec.

Вопросы: 1. Безопасно ли после вызова writev/vmsplice модифицировать переданный буфер? То есть гарантируется ли то, что после вызова на НЕБЛОКИРУЮЩЕМ сокете данные буфера (по размеру он не более нескольких килобайт) перемещены в ядре в безопасное место и буфер может быть использован для других целей или освобожден?

2. Как вообще такие вещи делать грамотно?

Пруфы приветствуются.

Спасибо заранее.

vmsplice делается только на fd от пайпа - на сетевой оно делаться немогет

а грамотно ... просто в юзерспейсе :)
с доступом до сетевой напрямую из юзерспейса не получилось ?

ae1234 ★★
()
Ответ на: комментарий от ae1234

http://forum.soft32.com/linux/splice-vmsplice-performance-test-results-ftopic...

Вот старые но интересные примеры Сам не пробовал.

Насчет задачи - есть фрагменты сообщений для одного сокета, их могут быть несколько десятков. Хочу за один системный вызов передать их сокету для отправки в неблокирующем режиме. С сокетом в один момент времени ГАРАНТИРОВАННО работает один поток.

vmsplice или writev - неважно, главное сделать это за 1 сисколл на 1 сокет.

А теперь суть вопроса - после возврата допустим writev (отмечу, что вызов синхронный, но неблокирующий), который сказал, что он записал нужное мне количество байт, когда я могу в эти буферы (которые в iovec) писать свои данные очередные, то есть могу ли я это делать сразу после возврата или надежнее будет через epoll получить сигнал о готовности сокета к приему пакетов?

Меня в данной ситуации беспокоит асинхронность и zero-copy. Особо то, что буферы выделены через mmap().

Касательно того прожекта - пока отложил, но не отбросил пока - о результатах обязательно отпишусь :)

westtrd
() автор топика
Ответ на: комментарий от Deleted

Пруф можно?

Особо в связи с тем, что это разделяемая с ядром память (mmap) Плюс, есть ли особенности в связи с неблокирующим I/O?

Спасибо

westtrd
() автор топика
Ответ на: комментарий от ae1234

Кстати, очень интересные решения на сей счет с открытыми кодами у ntop (компании)

westtrd
() автор топика
Ответ на: комментарий от westtrd

при writev - если он в не блокируещем и записал все данные - что в переданных буферах - то сразу после возвращения можно менять буферы
он ведь именно копирует - тут и сомнения быть то не могет

а вот vmsplice другое дело

ae1234 ★★
()
Ответ на: комментарий от ae1234

Достаточно старые результаты, но интересно местами. Будет момент, попробую.

westtrd
() автор топика
Ответ на: комментарий от westtrd

ну а какие пруфы то
vmsplice маппирует несколько буферов от юзера пайп
и само собой нельзя трогать эти буфферы - пока не закончили выдавать данные с этого пайпа

выдавать то будет в сетевой сокет через splice

ae1234 ★★
()
Ответ на: комментарий от ae1234

ну иль наоборот можно

что будет когда после vmsplice
заюзали splice в сетевой сокет - то если поменять содержимое буферов - результат будет интересным :)

ae1234 ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.