ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: zero copy sockets



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




 




Copyright © Lexa Software, 1996-2009.