zero copy sockets

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


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() или
просто прочитанные данные. Эти данные не меняются.

Самый простой способ узнать, что буфер больше не нужен - это ассинхронный
ввод/вывод в Win32. Когда операция выполнена, то буфер свободен.
В Юниксах с aio_read()/aio_write() дела никакие. Во FreeBSD сокетный AIO
немасштабируем, падуч и не делает zero copy. В Линуксе, когда я последний
раз смотрел, AIO на сокетах не поддерживался. А вообще nginx с
aio_read/aio_write работать умеет и, если в ядрах будет нормальная
поддержка, то до довести AIO до рабочего состояния можно очень быстро.


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





More information about the nginx-ru mailing list