zero copy sockets

Igor Sysoev is at rambler-co.ru
Fri Dec 9 23:15:16 MSK 2005


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





More information about the nginx-ru mailing list