nginx-1.1.1
Maxim Dounin
mdounin на mdounin.ru
Ср Авг 24 13:33:17 UTC 2011
Hello!
On Wed, Aug 24, 2011 at 01:22:48PM +0400, Михаил Монашёв wrote:
> Здравствуйте, Maxim.
>
> >> >> Изменения в nginx 1.1.1 22.08.2011
> >> >>
> >> >> *) Изменение: теперь загрузчик кэша за каждую итерацию обрабатывает
> >> >> число файлов, указанное в параметре load_files, или же работает не
> >> >> больше времени, указанное в параметре loader_threshold.
> >>
> >> > To Миша:
> >>
> >> > Это изменение должно лечить долгую загрузку кеша под нагрузкой.
> >> > Потестируй пожалуйста, вылечились ли у тебя проблемы при
> >> > настройках по умолчанию.
> >>
> >> Затестил. С выключенным алгоритмом кеш-лоадер работаел 6 минут ( кушал
> >> 50-60% процессора в top-e). С дефолтным включённым - 65 мин (кушал ~3%
> >> процессора в top-e).
>
> > Количество файлов при этом - примерно такое же, как ты озвучивал
> > ранее (3 * 16 * 256 * 500), правильно?
>
> Да.
>
> 3 зоны по 400Мб.
>
> > Т.е. фактически расчётное время для полной загрузки с учётом
> > loader_files и loader_sleep по умолчанию (100 и 50ms
> > соответственно), ok.
>
> Я не считал. Сейчас от жары плохо соображаю как посчитать.
Я в прошлый раз считал, базовые цифры не изменились: время
ожидания нового алгоритма загрузки кеша - (количество файлов /
loader_files) * loader_sleep, т.е. 3072s в твоём случае при
настройках по умолчанию.
> > (И да, смотреть на процессор - достаточно бессмысленно, надо
> > смотреть на загрузку дисков в gstat.)
>
> Не скажи. Например, когда кэш загружается, то происходит резкий
> всплеск потребления процессора кэш-лоадером, вплоть до 100% одного
> cpu. Как при этом обслуживаются запросы я не знаю.
>
> Также по загрузке проца можно сравнивать скорости загрузки кэша :-)
>
> Подозреваю, что если б у меня был SSD-диск, то кэш-лоадер упёрся бы в
> процессор. И опять же, не знаю, как при этом работали бы другие
> процессы, которым тоже надо читать и писать инфу в шаред-мем.
(Спасибо за предоставленный доступ, потестировал, результаты
ниже.)
Как я и предполагал, при loader_files=1000 кеш грузится ~10 минут
(чуть медленнее, чем при loader_files=1000000 в твоих тестах).
При этом даже под нагрузкой оно практически не упирается в диск:
каталоги большей частью в кеше OS. Массовых срабатываний
loader_threshold не отмечено: обработка 1000 файлов в среднем
занимает ~ 100ms.
Оценить влияние на нормальную работу достаточно сложно всилу
плавающей нагрузки, но судя по netstat -w10 - bandwidth не
проседает. Скорее всего в данном случае влияния на работу нет (по
крайней мере из-за IO), т.к. используется aio + 30 рабочих
процессов, и конкурентность доступа к дискам высока. У одного
процесса cache loader'а просто нет шансов на что-либо существенно
повлиять.
А вот с CPU интереснее. При loader_files=1000 оно ест ~25% одного
ядра, и судя по всему заметная часть этого времени - спинлоки. В
частности, в снятом ktrace на 64 итерации (обработка 64000 файлов
соответственно) - более 150 уходов в sem_wait().
В общем и целом я склоняюсь к мнению, что безопаснее оставить
текущии настройки загрузщика. Они обеспеивают загрузку даже
достаточно больших кешей за вменяемое время, минимально влияя на
производительность сервера в целом. При этом если время загрузки
критично - можно рекомендовать тюнить параметры загрузщика (в
частности, увеличивать loader_files).
Maxim Dounin
Подробная информация о списке рассылки nginx-ru