24 ноября 2013 г., 19:26 пользователь Валентин Бартенев <vbart@xxxxxxxxx> написал:
On Sunday 24 November 2013 14:39:59 Gelun, Artem wrote:
> Валентин, спасибо. Видимо, я перепутал с BSD-шным sendfile...
>
> Комментарий "он будет зваться ровно столько раз, сколько понадобиться
> для отдачи всего файла" относится, судя по всему, именно к BSD? потому
> что на Linux просто блокируется вызов до получения полного файла и
> всё.
Нет. Как уже выше выяснили, он ещё EAGAIN возвращает.
Ну EAGAIN, вроде, остаётся только при недостаточности буфера сокета. А в моём первом вопросе было "при размере файла < размера буфера сокета", соответственно, данных должно быть меньше, чем буфер и EAGAIN возвращаться не должен. Или я опять что-то не так понял? ))
>
> Используем небольшой свой модуль, который из имени файла делает, по
> сути, range и отдаёт ответ с кодом 200. Внутри он вызывает
> ngx_http_output_filter, который занимается всем вводом-выводом, так
> что "в кишки" мы не лезем.
Там много нюансов, чтобы сломать nginx не обязательно лезть "в кишки".
>
> Включать AIO - не вариант. Отсутствие RA снижает производительность
> дисков очень значительно (даже при выставлении больших буферов -
> видимо, за счёт RA RAID-контроллера, который тоже отключается) +
> отсутствие sendfile прибавляет почти десяткок процентов system time на
> и без того нагруженном сервере...
Отсутствие RA?
ReadAhead, который отключается при DIRECT_IO, который обязателен для AIO в linux.