23 ноября 2013 г., 13:03 пользователь Alex Vorona <voron@xxxxxxxxxx> написал:
22.11.2013 22:47, Gelun, Artem wrote:
> Добрый вечер, коллеги
>
> Помогите, пожалуйста, разобраться с тормозами при отдаче статики (файлы
> порядка 2-4 МБайт, около 700-1000 rps, keep-alive не используется со
> стороны клиента (!), 99% клиентских сессий - с localhost, отдача начинает
> тормозить где-то на 2.7-3 Gbps)
> проблема выглядит как периодическое "залипание" загрузки файла на некоторый
> интервал (от долей секунды до нескольких секунд).
перегрузка дисков?
Для "боевой" нагрузки - возможно и так. Но что тогда с tmpfs?
Или имеется ввиду перегрузка дисков и блокировка чего то (чего и когда?), что влечёт затыки и для tmpfs?
[...]
> LA на сервере высокий (в основном, из-за чтения с HDD), на 16 ядрах
> держится около 16.
Если клиент умеет ходить в unix-сокет (например nginx) - попробуйте перевести. Для HDD
nginx и ОС нужно настраивать так чтобы nginx читал с диска как можно бОльшими в пределах
разумного кусками, 512к-2048к например. Для этого прочитанные данные должны влазить в
буфер сокета, желательно также увеличить readahead, например через blockdev --setra
опять же, tmpfs, RA не актуален.
unix socket не умеет (пока). Вообще, мысль хорошая, спасибо.
в listen для проверки выставил уже запредельный sndbuf=8192k (благо памяти хватает), в sysctl - "net.ipv4.tcp_wmem = 40961310728388608" - всё равно затыки даже на файлах по 4МБайта.
При том затыкается именно где-то посередине в большинстве случаев, но в разные моменты (т.е. нет явной связи с объёмом закачки). Действительно ощущение, что что-то куда-то не влазит. Но, опять же, куда?
С апачем проблем нет, так как он скорее всего prefork, и не занимается переключением между
клиентами внутри одного процесса. С запущенным рядом ещё одним nginx, на который не идёт
нагрузка, также не должно быть проблем.
Насколько я понимаю, sendfile (который включен и должен отрабатывать) не блокирует worker'а. Единственное подозрение - воркеры блокируются при открытии файла с "перегруженного" HDD. Но:
1) как это проверить?
2) увеличение кол-ва worker'ов (до 64) не помогает
3) Если я правильно понимаю, при размере файла < размера буфера сокета и если sendfile_max_chunk не установлен, то sendfile должен вызываться один раз. Соответсвенно, если затык в nginx, то он будет перед началом отдачи данных. Но затыкаться может где угодно - и на 9%, и на 15%, и на 67%... (опять же, речь про tmpfs, с которой вообще никто ничего не читает, кроме теста)
А вообще я не уверен что при перегруженных HDD проблема имеет решение, если поступающих
запросов больше, чем может обслужить дисковая подсистема.