Hello!

On Mon, Jul 22, 2019 at 01:12:38PM -0400, rihad wrote:

> И еще параллельно такой вопрос возник: у нас крутящиеся диски на одном из
> серверов, и proxy_cache_path levels=1:2 все это приводит к тому, что в
> каждой директории где-то 3-4 тысячи файлов

3-4 тысячи файлов на каталог - это плюс-минус нормально.

> (я так понимаю поменять на 2:2 + reload уже нельзя?).

Да, поменять levels можно только создав новый кэш, перекладывать 
из одной структуры в другую nginx не умеет.  Если попытаться 
поменять levels при reload'е - nginx выругается и откажется 
загружать новую конфигурацию.  Если остановить и запустить заново - 
сотрёт содержимое, не соответствующее заданным levels.

> cache_loader при старте работает довольно долго, но не
> грузит. Он очень мало CPU времени тратит или дискового, за сутки работы
> сейчас он потратил 0:04.37 (согласно ps) это 4 минуты, но он не
> заканчивается. lsof показывает что он очень много времени проводит на каждой
> из директорий кэша. А их тысячи. Надеюсь он не читает весь файл
> (преимущественно картинки), а только его начало с заголовками? ))

Сейчас cache loader вообще не читает файлы, только каталоги.
Чтобы работал побыстрее - можно поиграться с параметрами 
loader_files, loader_threshold и loader_sleep, подробности тут:

http://nginx.org/ru/docs/http/ngx_http_proxy_module.html#proxy_cache_path

Алгоритм загрузки кэша такой, чтобы не создавать излишней нагрузки 
на диски, и соответственно чтобы сервис не деградировал в процессе 
загрузки кэша.

При параметрах по умолчанию - loader_files 100, loader_sleep 50 
миллисекунд - и бесконечно быстрых дисках - загрузка кэша с 16 
миллионами файлов (16 x 16 x 16 x 4000 = 16384000) должна занимать 
чуть больше трёх часов (50ms * 16384000 / 100 = 8192000ms = 
8192s).

Если загрузка занимает больше - значит, срабатывает 
loader_threshold, и loader спит чаще, чем раз в 100 файлов.  Для 
вращающихся дисков это нормально.  Но это и в свою очередь означает, 
что если для ускорения загрузки начать увеличивать loader_files и 
loader_threshold, а равно уменьшать loader_sleep - нагрузка на 
диски станет больше, и кэш может начать тормозить.

> Может ли
> его такая тормознутость привести к повторному запросу ресурса из источника и
> повторному кэшированию? Что делает nginx когда в кэше пока объекта нет,
> пытается ли сам к диску обратиться?

Если загрузка кэша не завершена - nginx при обращении к элементу 
кэша, которого ещё нет в памяти, явно проверяет, есть ли 
соответствующий файл на диске.  То есть к лишним обращениям на 
бэкенд это не приводит.

-- 
Maxim Dounin
http://mdounin.ru/
_______________________________________________
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Ответить