Есть ли планы по поддержке 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