Nginx: open_file_cache max exceeded — Оптимизация кэша дескрипторов
При обслуживании сотен тысяч уникальных статических файлов производительность Nginx падает, а потребление CPU ядром возрастает из-за постоянных системных вызовов stat() и open(). В журнале фиксируется деградация кэша: open_file_cache max exceeded, cache thrashing.
| Параметр | Дефолтное значение | Влияние на дисковый ввод-вывод |
|---|---|---|
open_file_cache max | off (или малое число) | Нехватка слотов для хранения метаданных горячих файлов |
open_file_cache_min_uses | 1 | Любой одиночный запрос вытесняет популярные файлы из кэша |
| Cache Thrashing | Частая ротация элементов | Nginx тратит ресурсы CPU на постоянное удаление и вставку записей в LRU-кэш |
- Резкий рост процента I/O wait на сервере при раздаче статики.
- Задержки при отдаче медиа-контента, картинок и пользовательских ассетов.
- Откройте
/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; } - Убедитесь, что лимит открытых файлов на уровне воркера
worker_rlimit_nofileпревышает емкостьopen_file_cache maxкак минимум в 1.5 раза. - Проверьте синтаксис конфигурации:
sudo nginx -t - Примените обновленные параметры:
sudo systemctl reload nginx.
open_file_cache кэширует не сам контент файлов, а их открытые файловые дескрипторы, размеры и времена модификаций. Это избавляет ядро от необходимости повторно обращаться к диску и inode файловой системы при каждом GET-запросе.Частые вопросы (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.