Re: Затыки при отдаче статики

Gelun, Artem a at gelun.ru
Sun Nov 24 10:39:59 UTC 2013


Валентин, спасибо. Видимо, я перепутал с BSD-шным sendfile...

Комментарий "он будет зваться ровно столько раз, сколько понадобиться
для отдачи всего файла" относится, судя по всему, именно к BSD? потому
что на Linux просто блокируется вызов до получения полного файла и
всё.

Используем небольшой свой модуль, который из имени файла делает, по
сути, range  и отдаёт ответ с кодом 200. Внутри он вызывает
ngx_http_output_filter, который занимается всем вводом-выводом, так
что "в кишки" мы не лезем.

Включать AIO - не вариант. Отсутствие RA снижает производительность
дисков очень значительно (даже при выставлении больших буферов -
видимо, за счёт RA RAID-контроллера, который тоже отключается) +
отсутствие sendfile прибавляет почти десяткок процентов system time на
и без того нагруженном сервере...

Итого либо переходить на FreeBSD, либо писать что-то своё/переделывать
существующее, что способно синхронно во много тредов отдавать файлы с
sendfile вместо nginx (тот же апач не умеет отдавать на range ответ
200 + нужно корректно работать с кэшом на HDD, который тормозит не
меньше) ....

Всем спасибо, война закончена ))


23 ноября 2013 г., 20:50 пользователь Валентин Бартенев
<vbart at nginx.com> написал:
> On Saturday 23 November 2013 18:54:38 Gelun, Artem wrote:
> [..]
>> До этого момента я убеждённо считал, что если файл открыт как O_NONBLOCK,
>> то sendfile будет неблокирующим и при недостатке данных вернёт EAGAIN.
>
> EAGAIN он вернет только когда заполнит буфер сокета.
>
> man sendfile
>
>        EAGAIN Nonblocking I/O has been selected using O_NONBLOCK and the write
>               would block.
>
>
>> Я ошибаюсь? или откуда может появиться время его выполнения в почти 8.7
>> секунды???....
>
> Ошибаетесь.
>
> sendfile() на Linux блокируется на чтении с диска, так же как и read().
>
> --
> Валентин Бартенев
> _______________________________________________
> nginx-ru mailing list
> nginx-ru at nginx.org
> http://mailman.nginx.org/mailman/listinfo/nginx-ru


Подробная информация о списке рассылки nginx-ru