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

Gena Makhomed gmm at csdoc.com
Sat Nov 23 14:07:53 UTC 2013


On 23.11.2013 14:32, Gelun, Artem wrote:

> ... чтение из tmpfs (считай, RAM) "застевает" в произвольные моменты
> времени по непонятным причинам.

причины могут быть разные. например, 1 - машина уходит в swap,
и на самом деле тогда "чтение из tmpfs" будет чтением с диска.
2 - если из tmpfs файлы считывает тот же nginx, который отдает
и файлы с диска. на дисковых операциях worker`ы nginx блокируюся,
поэтому и чтение из tmpfs тоже происходит с задержками и медленно.
3 - используется nginx с "левыми" модулями, которые и дают такие глюки.
4 - используется древняя версия nginx из EPEL, а не Pre-Built Packages 
для CentOS/RHEL из официального сайта http://nginx.org/en/download.html
подробнее - см. пост http://habrahabr.ru/post/195742/#comment_6797402
5 - и т.д. и т.п.

On 23.11.2013 13:11, Gelun, Artem wrote:

 >> Для HDD nginx и ОС нужно настраивать так чтобы nginx читал с диска
 >> как можно бОльшими в пределах разумного кусками, 512к-2048к например.

в некоторых случаях nginx сможет отдавать файлы быстрее, если выключить
sendfile и правильно настроить output_buffers (есть в архиве рассылки)

еще для отдачи больших файлов может помочь включение режима aio,
вот первая статья на эту тему: http://habrahabr.ru/post/68480/

чтобы уменьшить количество операций ввода/вывода - имеет смысл
для access_log включить buffer, например, размером в 1 мегабайт,
или вообще отключить access_log - "access_log off;".

все диски и разделы имеет смысл монтировать с опцией noatime.
в некоторых случаях может помочь использование XFS вместо ext4.

 > Насколько я понимаю, sendfile (который включен и должен отрабатывать)
 > не  блокирует worker'а.

блокирует. чтобы worker не блокировался - надо включать aio,
http://nginx.org/en/docs/http/ngx_http_core_module.html#aio

 > Единственное подозрение - воркеры блокируются при
 > открытии файла с "перегруженного" HDD. Но:
 > 1) как это проверить?

с помощью http://nginx.org/ru/docs/debugging_log.html
указав debug_connection только для своего IP-адреса.

 > 3) Если я правильно понимаю, при размере файла < размера буфера сокета и
 > если sendfile_max_chunk не установлен, то sendfile должен вызываться
 > один раз. Соответсвенно, если затык в nginx, то он будет перед началом
 > отдачи данных.

о том, что происходит когда включен sendfile и не установлен
параметр sendfile_max_chunk - написано в документации к nginx.

если выставить очень большой буфер сокета, - при 700-1000 rps
не знаю как поведет себя операционная система в такой ситуации.

особенно, когда кто-то захочет устроить Slowloris атаку против
сервера. или она сама собой будет, если много медленных клиентов.

уязвимость к Slowloris может быть и в том случае, если поставить
"output_buffers 1 512k;", потому что никакой искуственный интеллект
в nginx пока что не встроен и он не сможет распознать эту атаку
и автоматически сбросить размер буферов для медленных клиентов.
например, "output_buffers auto;" или "output_buffers adaptive;"

но если не поставить "output_buffers 1 512k;" - тогда будет много
iops для чтения файла с диска мелкими фрагментами и сервер тоже
будет не доступен клиентам, как и в случае DDoS-атаки Slowloris.

вот советы по тюнингу nginx в аналогичной ситуации:
http://mailman.nginx.org/pipermail/nginx/2012-May/033761.html

эти вопросы про оптимальную настройку nginx для отдачи файлов
уже давно FAQ, но на странице http://nginx.org/en/docs/faq.html
рекомендаций по настройке nginx для отдачи статики почему-то нет.

P.S.

кстати, стили на странице http://nginx.org/en/docs/faq.html
используются ужасные, все элементы списка сливаются между собой,
если между list items сделать больше интервал - читабельность вырастет.
да и подчеркивания в тексте имееют смысл только тогда, когда это редкие
слова или фразы являются гиперссылками. если весь текст подчеркнут -
читать его очень трудно и неудобно. на сайте http://nginx.org/ не нашел
информации куда писать с предложениями по улучшению доки, поэтому пишу
в список рассылки - вдруг кто-то увидит и исправит эти глюки/проблемы?

-- 
Best regards,
  Gena



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