Центр Диагностики & База Системных Ошибок

Решения для Windows Server, Active Directory, 1С, СУБД, Linux, Cisco, MikroTik и IP-телефонии.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, баз данных и сетевого оборудования. Перед выполнением действий обязательно создайте резервную копию. При отсутствии необходимой квалификации обратитесь к ИТ-специалистам.
Nginx Error: open_file_cache max exceeded, cache thrashing Linux / DevOps

Nginx: open_file_cache max exceeded — Оптимизация кэша дескрипторов

Обновлено: 18.08.2026  ·  Официальная база знаний

При обслуживании сотен тысяч уникальных статических файлов производительность Nginx падает, а потребление CPU ядром возрастает из-за постоянных системных вызовов stat() и open(). В журнале фиксируется деградация кэша: open_file_cache max exceeded, cache thrashing.

ПараметрДефолтное значениеВлияние на дисковый ввод-вывод
open_file_cache maxoff (или малое число)Нехватка слотов для хранения метаданных горячих файлов
open_file_cache_min_uses1Любой одиночный запрос вытесняет популярные файлы из кэша
Cache ThrashingЧастая ротация элементовNginx тратит ресурсы CPU на постоянное удаление и вставку записей в LRU-кэш
  • Резкий рост процента I/O wait на сервере при раздаче статики.
  • Задержки при отдаче медиа-контента, картинок и пользовательских ассетов.
  1. Откройте /etc/nginx/nginx.conf и настройте директивы кэширования метаданных дескрипторов в блоке http или server:
    http {
        # Увеличьте размер кэша и время удержания неактивных элементов:
        open_file_cache max=50000 inactive=60s;
        
        # Интервал проверки актуальности метаданных на диске:
        open_file_cache_valid 30s;
        
        # Кэшировать только файлы, запрошенные минимум 2 раза за период inactive:
        open_file_cache_min_uses 2;
        
        # Кэшировать ошибки отсутствия файлов (предотвращает спам stat() при 404):
        open_file_cache_errors on;
    }
  2. Убедитесь, что лимит открытых файлов на уровне воркера worker_rlimit_nofile превышает емкость open_file_cache max как минимум в 1.5 раза.
  3. Проверьте синтаксис конфигурации:
    sudo nginx -t
  4. Примените обновленные параметры: sudo systemctl reload nginx.
Механизм работы: open_file_cache кэширует не сам контент файлов, а их открытые файловые дескрипторы, размеры и времена модификаций. Это избавляет ядро от необходимости повторно обращаться к диску и inode файловой системы при каждом GET-запросе.
Практический опыт инженера: Если на сервере раздаются миллионы мелких картинок (User Generated Content), параметр `open_file_cache_errors on;` критически важен — он предотвращает DoS файловой системы при сканировании несуществующих путей.

Частые вопросы (FAQ)

Что такое Cache Thrashing в open_file_cache?

Это состояние 'пробуксовки', когда емкость кэша слишком мала, и каждый новый запрос к уникальному файлу принудительно вытесняет из памяти метаданные часто запрашиваемых файлов по алгоритму LRU.

Зачем нужна директива open_file_cache_min_uses 2?

Она защищает кэш от засорения 'случайными' файлами, к которым обратились всего один раз (например, редкие поисковые боты), сохраняя ресурсы для постоянных посетителей.

Что происходит при обновлении файла на диске, если он закеширован?

По истечении времени open_file_cache_valid Nginx выполнит повторный вызов stat(). Если файл изменился, дескриптор будет переоткрыт автоматически.

Хранит ли open_file_cache содержимое файлов в оперативной памяти?

Нет. Директива сохраняет исключительно метаданные (дескрипторы, статус ошибок 404, размер, mtime). Для кэширования контента используется fastcgi_cache или proxy_cache.