Назад | Перейти на главную страницу

NGINX max_size и keys_zone, не удалось выделить узел в зоне ключей кеша

У нас очень динамичное приложение с высоким трафиком, и мы используем кеширование NGINX с динамическими URL-адресами. Мы хотим кэшировать эти URL-адреса для повторных запросов.

Мы несколько раз сталкивались с проблемой при масштабировании, когда мы достигаем максимального количества записей в keys_zone а затем сервер начинает выдавать 500 ошибок и пустые ответы от сервера для новых URL-адресов / файлов, которые никогда не запрашивались ранее. Видеть Nginx: `` нет памяти в зоне ключей кеша '', несмотря на много места для справки

Примеры ошибок:

[crit] 30568#0: ngx_slab_alloc() failed: no memory in cache keys zone "PAGES"`
[alert] 27697#27697: could not allocate node in cache keys zone "PAGES"

Наш кеш:

proxy_cache_path /usr/share/nginx/cache levels=1:1:2 keys_zone=PAGES:50m inactive=7d max_size=900m;

Расширение keys_zone размер или перезапуск временно решают проблему. Но мы стремимся поддерживать фиксированный кеш, который очищает старые неиспользуемые записи, а не расширяет keys_zone для поддержки каждого файла / URL, который мы могли бы обслуживать.

Вопросы, если у кого-то есть контекст того, как работает NGINX:

  1. Я понимаю, что мы создаем слишком много ключей в keys_zone со временем. Если мы сделаем max_size достаточно маленький, перестанет ли он создавать новые записи в keys_zone, а вместо этого перезаписывать существующие?
  2. Есть ли inactive param тоже имеет что-то из-за keys_zone? Поскольку наш неактивный набор довольно длинный, сохраняет ли это записи в keys_zone?
  3. Есть ли способ очистить keys_zone записи без перезапуска NGINX?

Вся документация есть Вот

Ответы:

  1. Нет, за это отвечает диспетчер кеша

Специальный процесс «диспетчера кэша» отслеживает максимальный размер кеша, установленный параметром max_size. При превышении этого размера удаляются наименее использованные данные. Данные удаляются в итерациях, сконфигурированных параметрами manager_files, manager_threshold и manager_sleep (1.11.5). За одну итерацию удаляется не более элементов manager_files (по умолчанию 100). Продолжительность одной итерации ограничена параметром manager_threshold (по умолчанию 200 миллисекунд). Между итерациями делается пауза, настраиваемая параметром manager_sleep (по умолчанию 50 миллисекунд).

  1. да

Кэшированные данные, к которым не осуществляется доступ в течение времени, указанного параметром inactive, удаляются из кеша независимо от их актуальности. По умолчанию неактивно установлено на 10 минут.

  1. Я предполагаю, что удаление кешированных файлов поможет, но это не рекомендуется. Рекомендуемый способ - настроить nginx под свои нужды.

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

Предложения:

  1. inactive=7d вероятно, слишком высокий и сохраняет ненужный кеш на очень долгое время. Возможно, это требуется для вашего варианта использования, но обратите внимание, что по умолчанию это 10 минут.

  2. Если вы создадите более 100 новых ключей в период между запусками «диспетчера кеша», он не сможет поддерживать его, и вам следует изменить manager_files и / или manager_threshold и / или manager_sleep параметры