Лимиты файловых дескрипторов (file descriptors)
Лимиты файловых дескрипторов (file descriptors) — это ограничения, которые операционная система накладывает на количество одновременно открытых файлов, сокетов и других ресурсов для каждого процесса или пользователя. Эти лимиты важны для стабильной работы серверов, особенно тех, которые обрабатывают большое количество одновременных соединений (например, веб-серверы, такие как Nginx, или серверы приложений, такие как PHP-FPM).
Что такое файловые дескрипторы?
Файловый дескриптор — это целое число, которое операционная система использует для идентификации открытых файлов, сокетов, каналов и других ресурсов ввода-вывода. Каждое открытое соединение (например, HTTP-запрос к веб-серверу) использует файловый дескриптор.
Зачем увеличивать лимиты файловых дескрипторов?
- Обработка большого количества соединений:
- Веб-серверы, такие как Nginx, и серверы приложений, такие как PHP-FPM, обрабатывают множество одновременных запросов. Каждое соединение использует файловый дескриптор.
- Если лимит файловых дескрипторов слишком низкий, сервер не сможет обрабатывать новые запросы, что приведет к ошибкам, таким как
Resource temporarily unavailable
.
- Предотвращение сбоев:
- Когда лимит файловых дескрипторов исчерпан, процессы не могут открывать новые файлы или сокеты. Это может привести к сбоям в работе сервисов, таких как Nginx или PHP-FPM.
- Оптимизация производительности:
- Увеличение лимитов позволяет серверу эффективно обрабатывать больше запросов одновременно, что особенно важно для высоконагруженных систем.
Как проверить текущие лимиты?
Чтобы проверить текущие лимиты файловых дескрипторов, выполните команду:
ulimit -n
Эта команда покажет максимальное количество файловых дескрипторов, которые может открыть текущий процесс. По умолчанию это значение часто равно 1024, что может быть недостаточно для высоконагруженных серверов.
Как увеличить лимиты файловых дескрипторов?
1. Временное увеличение (для текущей сессии)
Вы можете временно увеличить лимит для текущей сессии с помощью команды:
ulimit -n 65535
Это изменение будет действовать только до перезагрузки системы или завершения текущей сессии.
2. Постоянное увеличение (для всей системы)
Чтобы увеличить лимиты на постоянной основе, выполните следующие шаги:
a. Редактирование /etc/security/limits.conf
Откройте файл /etc/security/limits.conf
и добавьте следующие строки:
* soft nofile 65535
* hard nofile 65535
soft
— мягкий лимит (может быть изменен пользователем).hard
— жесткий лимит (максимальное значение, которое нельзя превысить).nofile
— параметр, отвечающий за лимит файловых дескрипторов.65535
— новое значение лимита (может быть увеличено до 1048576 или больше, в зависимости от системы).
b. Редактирование /etc/pam.d/common-session
и /etc/pam.d/common-session-noninteractive
Добавьте следующую строку в оба файла:
session required pam_limits.so
Это гарантирует, что лимиты будут применены для всех сессий.
c. Редактирование /etc/sysctl.conf
(опционально)
Для увеличения системного лимита файловых дескрипторов добавьте в файл /etc/sysctl.conf
следующие строки:
fs.file-max = 2097152
Затем примените изменения:
sudo sysctl -p
d. Перезагрузка системы
После внесения изменений перезагрузите систему, чтобы изменения вступили в силу:
sudo reboot
Как проверить, что изменения применились?
После перезагрузки выполните команду:
ulimit -n
Она должна вернуть новое значение (например, 65535
).
Также можно проверить системный лимит:
cat /proc/sys/fs/file-max
Пример использования в контексте Nginx и PHP-FPM
Если у вас высоконагруженный веб-сервер, увеличение лимитов файловых дескрипторов позволит:
- Nginx обрабатывать больше одновременных подключений.
- PHP-FPM обрабатывать больше запросов без ошибок
Resource temporarily unavailable
.
Рекомендации:
- Увеличивайте лимиты постепенно и тестируйте систему после каждого изменения.
- Убедитесь, что у сервера достаточно ресурсов (CPU, RAM) для обработки увеличенного количества соединений.
- Используйте мониторинг (например,
htop
,netstat
,ss
) для отслеживания использования файловых дескрипторов.
Если вы не уверены, какое значение выбрать, начните с 65535
и при необходимости увеличьте его.