How to fix ‘too many open files’ in linux

‘Too Many Open Files’ error & Open File Limits in Linux

Now we know that these titles mean that a process has opened too many files (file descriptors) and cannot open new ones. In Linux, the maximum open file limits are set by default for each process or user and the values are rather small.

We, at Bobcares have monitored this closely and have come up with a few solutions:

Increase the Max Open File Limit in Linux

A large number of files can be opened if we change the limits in our Linux OS. In order to make new settings permanent and prevent their reset after a server or session restart, make changes to /etc/security/limits.conf. by adding these lines:

  • hard nofile 97816
  • soft nofile 97816

If it is using Ubuntu, add this line as well:

session required pam_limits.so

These parameters allow to set open file limits after user authentication.

After making the changes, reload the terminal and check the max_open_files value:

# ulimit -n 97816

Increase the Open File Descriptor Limit per service

A change in the limit of open file descriptors for a specific service, rather than for an entire operating system is possible.

For example, if we take Apache, to change the limits, open the service settings using systemctl:

systemctl edit httpd.service

Once the service settings is open, add the limits required. For example;

LimitNOFILE=16000 LimitNOFILESoft=16000

After making the changes, update the service configuration and restart it:

# systemctl daemon-reload # systemctl restart httpd.service

To ensure the values have changed, get the service PID:

# systemctl status httpd.service

For example, if the service PID is 3724:

# cat /proc/3724/limits | grep “Max open files”

Thus, we can change the values for the maximum number of open files for a specific service.

Set Max Open Files Limit for Nginx & Apache

In addition to changing the limit on the number of open files to a web server, we should change the service configuration file.

For example, specify/change the following directive value in the Nginx configuration file /etc/nginx/nginx.conf:

worker_rlimit_nofile 16000

While configuring Nginx on a highly loaded 8-core server with worker_connections 8192, we need to specify

8192*2*8 (vCPU) = 131072 in worker_rlimit_nofile

Then restart Nginx.

For apache, create a directory:

# mkdir /lib/systemd/system/httpd.service.d/

Then create the limit_nofile.conf file:

# nano /lib/systemd/system/httpd.service.d/limit_nofile.conf

Add to it:

LimitNOFILE=16000

Do not forget to restart httpd.

Alter the Open File Limit for Current Session

To begin with, run the command:

# ulimit -n 3000

Once the terminal is closed and a new session is created, the limits will get back to the original values specified in /etc/security/limits.conf.

To change the general value for the system /proc/sys/fs/file-max, change the fs.file-max value in /etc/sysctl.conf:

fs.file-max = 100000

Finally, apply:

# sysctl -p # sysctl -p net.ipv4.ip_forward = 1 fs.file-max = 200000 # cat /proc/sys/fs/file-max 200000

Conclusion

To conclude, today, we figured how our Support Engineers solve the error, ‘Too Many Open Files’ and discussed options to change the default limits set by Linux.

Ошибка too many open files Linux

Дословно эта ошибка означает, что программа открыла слишком много файлов и больше ей открывать нельзя. В Linux установлены жёсткие ограничения на количество открываемых файлов для каждого процесса и пользователя.

Посмотреть, сколько файлов можно открыть в вашей файловой системе, можно, выполнив команду:

Посмотреть текущие ограничения количества открытых файлов для пользователя можно командой:

Утилита ulimit возвращает два вида ограничений — hard и soft. Ограничение soft вы можете менять в любую сторону, пока оно не превышает hard. Ограничение hard можно менять только в меньшую сторону от имени обычного пользователя. От имени суперпользователя можно менять оба вида ограничений так, как нужно. По умолчанию отображаются soft-ограничения:

Чтобы вывести hard, используйте опцию -H:

Вы можете изменить ограничение, просто передав в ulimit новое значение:

Но поскольку hard-ограничение составляет 4000, то установить лимит больше этого значения вы не сможете. Чтобы изменить настройки ограничений для пользователя на постоянной основе, нужно настроить файл /etc/security/limits.conf. Синтаксис у него такой:

имя_пользователя тип_ограничения название_ограничения значение

Вместо имени пользователя можно использовать звездочку, чтобы изменения применялись ко всем пользователям в системе. Тип ограничения может быть soft или hard. Название — в нашем случае нужно nofile. И последний пункт — нужное значение. Установим максимум — 1617596.

Нужно установить значение для soft и hard параметра, если вы хотите, чтобы изменения вступили в силу. Также убедитесь, что в файле /etc/pam.d/common-session есть такая строчка:

Если её нет, добавьте в конец. Она нужна, чтобы ваши ограничения загружались при авторизации пользователя.

Если вам нужно настроить ограничения только для определенного сервиса, например  Apache или Elasticsearch, то для этого не обязательно менять все настройки в системе. Вы можете сделать это с помощью systemctl. Просто выполните:

И добавьте в открывшейся файл такие строки:

Здесь мы устанавливаем максимально возможное ограничение как для hard- так и для soft-параметра. Дальше нужно закрыть этот файл и обновить конфигурацию сервисов:

Затем перезагрузить нужный сервис:

Убедится, что для вашего сервиса применились нужные ограничения, можно, открыв файл по пути /proc/pid_сервиса/limits. Сначала смотрим PID нужного нам сервиса:

Затем смотрим информацию:

Увеличить Max Open File Limit в Unix/Linux

Приведу команды на различные Unix/Linux ОС

Увеличить Max Open File Limit в Linux

Для начала проверим какой предел установлен в ОС:

# cat /proc/sys/fs/file-max

Увеличиваем данный предел  в Linux

Мы можем увеличить лимиты для открытых файлов:

  • Временно.
  • Постоянно.

-===ВРЕМЕННО===-

Если есть необходимость увеличить лимит временно (для тестирования, например), то можно это сделать так:

# sysctl -w fs.file-max=500000

Или:

# echo "500000" > /proc/sys/fs/file-max

Вот еще один пример:

# ulimit -n 65635

-===ПОСТОЯННО===-

Если есть необходимость увеличить лимит навсегда, то  можно это сделать так:

# vim /etc/sysctl.conf

fs.file-max = 500000

Эти настройки будут сохраняться даже после перезагрузки системы. После добавления конфигурации в файл, выполните следующую команду, чтобы изменения вступили в силу:

# sysctl -p

Настройка лимитов для каждого пользователя

# vim /etc/security/limits.conf

Добавляем параметры:

* hard nofile 500000
* soft nofile 500000
root hard nofile 500000
root soft nofile 500000

Проверка установленных лимитов

Используйте следующую команду, чтобы увидеть максимальное чисто для открытых файлов:

# cat /proc/sys/fs/file-max

Подключаемся от пользователя (у меня это nginx):

# su nginx

Проверяем параметры Hard лимитов:

# ulimit -Hn

В консоле, можно ввести данную команду (очень удобно отображает):

# for pid in `pidof nginx`; do echo "$(< /proc/$pid/cmdline)"; egrep 'files|Limit' /proc/$pid/limits; echo "Currently open files: $(ls -1 /proc/$pid/fd | wc -l)"; echo; done

Проверяем параметры лимитов Soft:

# ulimit -Sn

Увеличить Max Open File Limit в Mac OS X

Выполним проверку лимитов с помощью:

$ launchctl limit maxfiles

Где:

  • Первый аргумент — soft limit.
  • Второй аргумент — hard limit.

Можно прописать в файл:

# vim ~/.bash_profile

Следующее значение:

ulimit -n 65536 200000

Вот и все!

Увеличюем nginx worker_rlimit_nofile  в nginx ( на уровне Nginx)

В nginx также можно увеличить лимиты с директивой worker_rlimit_nofile, которая позволяет увеличить этот лимит, если это не хватает данного ресурса на лету на уровне процесса:

# vim /etc/nginx/nginx.conf

И прописываем (редактируем):

# set open fd limit to 30000
worker_rlimit_nofile 30000;

После чего, проверяем конфигурацию nginx и перезапускаем его:
Save and close the file. Reload nginx web server, enter:

# nginx -t && service nginx -s reload

ulimit в Kali Linux

Включение ограничений на основе PAM в Unix/Lixux

Для Debian/Ubuntu

Редактируем файл (Debian/Ubuntu):

# vim /etc/pam.d/common-session

Вставляем:

session    required   pam_limits.so

Открываем еще один файл:

# vim /etc/security/limits.conf

Прописываем лимиты:

* soft nofile 65536
* hard nofile 200000

Открываем:

# vim /etc/ssh/sshd_config

И, приводим к виду:

UseLogin yes

И выполняем рестарт:

# reboot

Для CentOS/RedHat/Fedora

Редактируем файл (Debian/Ubuntu):

# vim /etc/pam.d/login

Вставляем:

session    required   pam_limits.so

Открываем еще один файл:

# vim /etc/security/limits.conf

Прописываем лимиты:

* soft nofile 65536
* hard nofile 200000

Открываем:

# vim /etc/ssh/sshd_config

И, приводим к виду:

UseLogin yes

И выполняем рестарт:

# reboot

У меня все! Статья «Увеличить Max Open File Limit в Unix/Linux», завершено.

Where can we find error, ‘Too Many Open Files’?

Since Linux has set a maximum open file limit by default, the system has a method for restricting the number of various resources a process can consume.

Usually the ‘Too Many Open Files’ error is found on servers with an installed NGINX/httpd web server or a database server (MySQL/MariaDB/PostgreSQL).

For example, when an Nginx web server exceeds the open file limit, we come across an error:

socket () failed (29: Too many open files) while connecting to upstream

To find the maximum number of file descriptors a system can open, run the following command:

# cat /proc/sys/fs/file-max

The open file limit for a current user is 1024. We can check it as follows:

# ulimit -n # cat /proc/sys/fs/file-max 97816 # ulimit -n 1024

There are two limit types: Hard and Soft. Any user can change a soft limit value but only a privileged or root user can modify a hard limit value.

However, the soft limit value cannot exceed the hard limit value.

To display the soft limit value, run the command:

# ulimit –nS

To display the hard limit value:

# ulimit -nH

‘Too Many Open Files’ Error & Open File Limits in Linux

First of all, let’s see where the ‘too many open files’ error appears. The most often it occurs on the servers with an installed NGINX/httpd web server or a database server (MySQL/MariaDB/PostgreSQL) when reading a large number of logs. For example, when an Nginx web server exceeds the open file limit, you will see an error:

socket () failed (29: Too many open files) while connecting to upstream

Using this command, you can get the maximum number of file descriptors your system can open:

The open file limit for a current user is 1024. You can check it as follows:

There are two limit types: Hard and Soft. A user can change a soft limit (however, the soft value cannot exceed the hard one). Only a privileged or root user can modify a hard limit value.

To display the soft limit, run this command:

To display the hard limit value:

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Техноарена
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: