Очень часто при работе на высоконагруженных Linux серверах могут возникать ошибки “too many open files». Это означает, что программа открыла слишком много файлов (читай файловых дескрипторов) и не может открыть новые. В Linux ограничения “max open file limit“ установлены по умолчанию для каждого процесса и пользователя, и они не слишком высокие.
В данной статье мы рассмотрим, как проверить текущие ограничения по количеству открытых файлов, как его изменить эту настройку для всего сервера, для отдельных сервисов и для сеанса.
- Ошибка: Too many open files и лимиты на количество открытых файлов в Linux
- Настройки лимитов ограничения на количество одновременно открытых файлов в Linux
- Увеличить лимита открытых файловых дескрипторов для отдельного сервиса
- Увеличение максимального количества открытых файлов для Nginx и Apache
- Лимиты file-max для текущей сессии
Ошибка: Too many open files и лимиты на количество открытых файлов в Linux
Для начала разберемся, где мы можем наблюдать ошибку “too many open files“. Чаще всего эта ошибка встречается на серверах с установленным веб-серверов NGINX/httpd, сервером БД (MySQL/MariaDB/PostgreSQL), при чтении большого количества логов. Например, когда веб-серверу Nginx не хватает лимита для открытия файлов, вы получите ошибку:
socket () failed (24: Too many open files) while connecting to upstream
Максимально количество файловых дескрипторов, которые могут быть открыты в вашей системе можно узнать так:
# cat /proc/sys/fs/file-max
Ограничение на количество открытых файлов для текущего пользователя – 1024. Можно проверить так:
# ulimit -n
Есть два типа ограничений: Hard и Soft. Пользователь может изменить лимит для soft ограничения (но значение soft не может превышать hard). Hard ограничение можно изменить только от привилегированного пользователя.
Для вывода Soft -граничения выполните:
# ulimit –nS
Для вывода Hard-ограничения:
# ulimit -nH
Настройки лимитов ограничения на количество одновременно открытых файлов в Linux
Чтобы разрешить всем сервисам открывать большее количество файлов, можно изменить лимиты на уровне всей ОС Linux. Чтобы новые настройки работали постоянно и не сбрасывались при перезапуске сервера или сессии, нужно поправить файл /etc/security/limits.conf. Добавьте строки:
* hard nofile 97816 * soft nofile 97816
Ели вы используете Ubuntu, нужно прописать строку:
session required pam_limits.so
Данный параметр добавляет возможность загрузки ограничений при авторизации пользователя.
После изменений, перезапустите терминал и проверьте значение лимита max_open_files:
[root@server ~]# ulimit -n
97816
Увеличить лимита открытых файловых дескрипторов для отдельного сервиса
Вы можете изменить лимит на количество открытых файловых дескрипторов для конкретного сервиса, а не для всей системы. Рассмотрим на примере apache. Чтобы изменить значения, откройте настройки службы через systemctl:
# systemctl edit httpd.service
Добавьте необходимые лимиты, например:
[Service] LimitNOFILE=16000 LimitNOFILESoft=16000
После изменения, нужно обновить конфигурацию сервиса и перезапустить его:
# systemctl daemon-reload
# systemctl restart httpd.service
Чтобы проверить, изменились ли значения, нужно получить PID сервиса:
# systemctl status httpd.service
Например, вы определил PID сервиса 32724:
# cat /proc/32724/limits | grep "Max open files”
Так вы изменили значения Max open files для конкретного сервиса.
Увеличение максимального количества открытых файлов для Nginx и Apache
При изменении ограничения на количество открытых файлов для веб-сервера, нужно также поправить конфигурационный файл службы. Например, для Nginx в файле конфигурации /etc/nginx/nginx.conf, нужно прописать/изменить значение в директиве:
worker_rlimit_nofile 16000
После чего выполнить рестарт Nginx.
Для apache, нужно создать директорию:
# mkdir /lib/systemd/system/httpd.service.d/
После этого создайте файл limit_nofile.conf:
# nano /lib/systemd/system/httpd.service.d/limit_nofile.conf
И добавьте в него:
[Service] LimitNOFILE=16000
Не забудьте перезапустить сервис httpd.
Лимиты file-max для текущей сессии
Чтобы изменить лимиты на открытые файлы в рамках вашей сессии терминала, выполните команду:
# ulimit -n 3000
При закрытии терминала и создания новой сессии, лимиты вернуться к начальным значениям, указанным в файле /etc/security/limits.conf.
Чтобы изменить общее значение в системе /proc/sys/fs/file-max, измените значение fs.file-max в /etc/sysctl.conf:
fs.file-max = 100000
И примените:
# sysctl -p
В данной статье мы разобрались, как решить проблему с недостаточным лимитом для открытых файловых дескрипторов в Linux и рассмотрели несколько вариантов изменения лимитов на сервере.
Спасибо за статью.
У меня возникает такая проблема в 1С Торговля ред.10 серверная при ручном запуске выгрузки товаров на сайт.
При чем если я это делаю с Linux клиента. Из под Windows клиента синхронизация проходит нормально.
Надеемся, что вы решите ваш вопрос с помощью этого мануала)
Как можно писать такую ересь в 2019 году?
1. file-max по дефолту уже лет 12 как устанавливается в зависимости от объёма опертивки, примерно 94000 на 1 гиг. То есть, советом его поставить в 100000 вы его увеличите разве что на виртуалке с 512 оперативки, а скорее вы его уменьшите! Но на таком количестве оперативки врядли лимит по файлам вас будет заботить
2. /etc/security/limits.conf влияет только на логин шелл.»Чтобы разрешить всем сервисам открывать большее количество файлов» — сервисы класть хотели с пробором на ваши лимиты.
Проверяйте лимиты в рантайме, cat /proc//limits, и вообще, всё проверяйте сами!
> Для apache, нужно создать директорию
sudo systemctl edit httpd.service
После редактирования автоматически сделается daemon-reload, останется только перезапустить сервис.
> лимиты вернуться
tsya.ru