On Sat, Apr 21, 2007 at 05:44:07PM +0400, Александр Ворона wrote:
Igor Sysoev пишет:
Дело в том, что lighttpd не использует EPOLLET, а nginx - использует.
Когда патч в ядре ограничивает объём передаваемых данных, то происходит
следующее - EPOLLET фиксирует состояние, что буфер свободен, об этом
сообщается приоложению (nginx'у), он делает sendfile. sendfile быстро
передаёт ограниченный объём, буфер по-видимому после этого полностью
свободный и новое событие не приходит.
а как тогда должен отрабатывать nginx, если бы sendfile() действительно
был неблокирующим(за что собственно и боремся) и быстро передавал
ограниченный обьём?
sendfile должен вернуть, сколько он смог передать. nginx это фиксирует,
выствляет таймаут на передачу и оставляет этот сокет в покое, пока
epoll снова не сообщит об освободившемся месте.