ПРОЕКТЫ 


  АРХИВ 


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, 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




 




Copyright © Lexa Software, 1996-2009.