ПРОЕКТЫ 


  АРХИВ 


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[2]: zero copy sockets



On Fri, 9 Dec 2005, Anton Yuzhaninov wrote:

9 декабря 2005 г., 22:48:05, Вы писали:

IS> Во FreeBSD использовать zero copy sockets для произвольных данных,
IS> выравненных по 4К, сложно: нет простого метода узнать, когда можно
IS> менять буфер (читать в него новые данные или освобождать). Если буфер
IS> всё ещё используется ядром, то при попытке изменить данные будет
IS> page fault и ядро выделит новую страницу и скопирует туда данные
IS> этой страницы. Шило на мыло, если не хуже.

Согласен, если будет происходить COW то с zero copy будет еще хуже.
А метод из мана на практике не работает?

From an application standpoint, the best way to guarantee that the data
has been sent out over the wire and freed by the kernel (for TCP-based
sockets) is to set a socket buffer size (see the SO_SNDBUF socket option
in the setsockopt(2) man page) appropriate for the application and net-
work environment and then make sure you have sent out twice as much data
as the socket buffer size before reusing a buffer.  For TCP, the send and
receive socket buffer sizes generally directly correspond to the TCP win-
dow size.

Это разумеется приблизительная оценка...

В том-то и дело, что это не простой метод. Я ещё придумал достаточно
точный алгоритм с использованием kqueue (kqueue сообщает о доступном
размере буфера), но это тоже не просто.

Хотя в целом ситуация ясна - идея красивая, но для практического
использования пока поддержка в ядре недостаточно проработана :(

Увы.


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




 




Copyright © Lexa Software, 1996-2009.