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