zero copy sockets

Igor Sysoev is at rambler-co.ru
Fri Dec 9 22:59:42 MSK 2005


On Fri, 9 Dec 2005, Igor Sysoev wrote:

> On Fri, 9 Dec 2005, Anton Yuzhaninov wrote:
>
>> Есть ли планы по поддержке zero copy sockets в nginx (для тех данных,
>> что не отдаются через sendfile, например при проксировании)?
>> 
>> Насколько я понял из http://people.freebsd.org/~ken/zero_copy/
>> Это возможно - от приложения для отправки данных используя zero copy
>> требуется писать в сокет порциями по 4к, выравнеными по границе
>> страниц памяти, и не изменять буфер сразу же после отправки данных.
>> 
>> С приемом данных все сложнее, но это и не очень нужно - входящий
>> трафик на веб-серверах сравнительно небольшой.
>
> Когда я разрабатывал архитектуру сервера, то изучал возможность
> поддержки zero copy (в коде есть даже какие-то следы на предмет zero copy).
>
> Во FreeBSD использовать zero copy sockets для произвольных данных,
> выравненных по 4К, сложно: нет простого метода узнать, когда можно
> менять буфер (читать в него новые данные или освобождать). Если буфер
> всё ещё используется ядром, то при попытке изменить данные будет
> page fault и ядро выделит новую страницу и скопирует туда данные
> этой страницы. Шило на мыло, если не хуже.
>
> Поэтому на данный момент zero copy sockets во FreeBSD имеет смысл
> использовать только для данных, живущих в кэше, будь то mmap() или
> просто прочитанные данные. Эти данные не меняются.

Причём тут возникает проблема, как разрешить zero copy только для части
сокетов. setsockopt() нет, включается только глобальным sysctl'ем.
Только манипулировать размером/положением буфера. А что делать, если
нужно вывести 16К в одном буфере.


Игорь Сысоев
http://sysoev.ru





More information about the nginx-ru mailing list