Linux opened files limit

«Max open files» for working process

Additional info: my process is ‘java’. I need to increase “Max open files” without stopping the process.

8 Answers 8

Another option is to use the prlimit command (from the util-linux package). For example if you want to set the maximum number of open files for a running process to 4096:

I’m using linux mint (Ubuntu based) and I can’t find it in the default installation. Normally it’s part of the package util-linux but eve this package on Mint doesn’t bring this command.

➜ ~ lsb_release -d Description: Ubuntu 16.04.1 LTS ➜ ~ whereis prlimit prlimit: /usr/bin/prlimit /usr/share/man/man2/prlimit.2.gz /usr/share/man/man1/prlimit.1.g

As a system administrator: The /etc/security/limits.conf file controls this on most Linux installations; it allows you to set per-user limits. You’ll want a line like myuser — nofile 1000 .

Within a process: The getrlimit and setrlimit calls control most per-process resource allocation limits. RLIMIT_NOFILE controls the maximum number of file descriptors. You will need appropriate permissions to call it.

I don’t know of any. If there is, I suspect you’ll find it buried deep in some Linux-specific programming guide, because I can’t fathom where else standard POSIX would put it.

Sometimes limits.conf is not taken into account and you have to set DefaultLimitNOFILE in /etc/systemd/system.conf and user.conf .

You could use gdb, break into the process, call the aforementioned syscalls to raise the limit you’re interested in, then continue the job and exit gdb. I’ve edited things on the fly this way a few times.

Your app wouldn’t be down, but just frozen for the moment while you performed the call. if you’re quick (or you script it!), it’ll likely not be noticeable.

Yeah, this is somewhat like tweaking the Matrix to make things work. stop the world, edit a variable, continue the world. oh! DeJaVu! I am the One! (well, when I have gdb!)

echo -n "Max open files=20:20" > /proc/$pid/limits 

. works in RHEL5.5 and RHEL6.7.

Note that the «-n» is mandatory; a trailing newline will generate a complaint about invalid arguments.

This link details how to change this system wide or per user.

Many application such as Oracle database or Apache web server needs this range quite higher. So you can increase the maximum number of open files by setting a new value in kernel variable /proc/sys/fs/file-max as follows (login as the root):

$ sysctl -w fs.file-max=100000

You need to edit /etc/sysctl.conf file and put following line so that after reboot the setting will remain as it is

Thanks for a link. But I’ve found it before asking 🙂 But the problem is to change parameter without stopping process (on runtime) and for process-wide.

Читайте также:  Установка libreoffice astra linux

@wako: It can’t be done from outside the process (unless you’re running one of the very latest development kernels, which is unlikely)

Yes, it is possible to increase the limits in /proc//limits at run time. Just find the pid and execute below command:

echo -n "Max open files=20:20" > /proc/$pid/limits 

The following commands give the max # of open files per process permissible by default limits (soft and hard respectively):

You can use a program or a command to change these limits. Look at ulimit (man ulimit).

On Ubuntu 16.04, with a rethinkdb process running, none of these solutions worked.

I kept getting error: accept() failed: Too many open files.

What ultimately worked was this in my /etc/security/limits.conf file. Note the nproc in addition to the nofile. As I understand it, root needs to specified separately.

* soft nofile 200000 * hard nofile 1048576 root soft nofile 200000 root hard nofile 1048576 * soft nproc 200000 * hard nproc 1048576 root soft nproc 200000 root hard nproc 1048576 

You can see the system max files by running cat /proc/sys/fs/file-max . I just set mine to a high maximum well within reason for the size of the server.

You can verify the max open files your process is allowed by running cat /proc//limits .

Источник

Исправляем ошибку “Too many open files“ в Linux

date

14.09.2022

user

VyacheslavK

directory

Linux

comments

комментария 4

Очень часто при работе на высоконагруженных Linux серверах могут возникать ошибки “too many open files”. Это означает, что процесс открыл слишком много файлов (читай файловых дескрипторов) и не может открыть новые. В Linux ограничения “max open file limit“ установлены по умолчанию для каждого процесса и пользователя, и они не слишком высокие.

В данной статье мы рассмотрим, как проверить текущие ограничения на количество открытых файлов в Linux, как изменить этот параметр для всего сервера, для отдельных сервисов и для сеанса. Статья применима для большинства современных дистрибутивов Linux (Debian, Ubuntu, CentOS, RHEL, Oracle Linux, Rocky и т.д.)

Ошибка: 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

ошибка too many opne files в nginx

HTTP: Accept error: accept tcp [::]:: accept4: too many open files.
OSError: [Errno 24] Too many open files.

Максимально количество файловых дескрипторов, которые могут быть открыты в вашей файловой системе всеми процессами можно узнать так:

Читайте также:  Справка по терминалу linux

Чтобы узнать, сколько файлов открыто сейчас, выполните:

  • 7744 — суммарное количество открытых файлов
  • 521– число открытых файлов, но которые сейчас не используются
  • 92233720– максимальное количество файлов, которое разрешено открывать

В Linux ограничение на максимальное количество открытых файлов можно натсроить на нескольких уровнях:

Чтобы вывести текущее ограничение на количество открытых файлов в ядре Linux, выполните:

fs.file-max - максимальное количество открытых файлов в linux

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

По умолчанию количество файлов для одного процесса этого ограничено числом 1024.

Выведем максимальное количество для одного пользователя (max user processes):

Умножаем 1024 * 5041 дает нам 5161984 – это максимально количество открытых файлов всеми процессами пользователя.

В Linux есть два типа ограничений на количество открытых файлов: Hard и Soft. Soft ограничения носят рекомендательный характер, при превышении значения пользователь будет получать предупреждения. Если количество открытых файлов превысило hard лимит, пользователь не сможет открыть новые файлы пока не будет закрыты ранее открытые.

Для просмотра текущих лимитов используется команда ulimit с опцией -S (soft) или -H (hard) и параметром -n (the maximum number of open file descriptors).

Для вывода Soft-ограничения:

Для вывода Hard-ограничения:

ulimit hard квота на количество открытых дескрипторов

Глобальные ограничения на количество открытых файлов в Linux

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

Имя_пользователя тип_огрничение название_ограничения значение
apache hard nofile 978160 apache soft nofile 978160

Вместо имени пользователя можно указать * . Это означает, что это ограничение будет применяться для всех пользователей Linux:

* hard nofile 97816 * soft nofile 97816

Например, вы получили ошибку too many open files для nginx. Проверьте, сколько файлов разрешено открывать процессу этому пользователю:

$ sudo -u nginx bash -c ‘ulimit -n’

Для нагруженного сервера этого недостаточно. Добавьте в /etc/security/limits.conf строки

nginx hard nofile 50000 nginx soft nofile 50000

В старых ядрах Linux значение fs.file-max может быть равно 10000. Поэтому проверьте это значение и увеличьте его, чтобы оно было больше чем ограничение в limits.conf:

Читайте также:  Snd usb audio linux

Это временно увеличит лимит. Чтобы новые настройки стали постоянными, нужно добавить в файл /etc/sysctl.conf строку:

Проверьте, что в файле /etc/pam.d/common-session (Debian/Ubuntu или /etc/pam.d/login для CentOS/RedHat/Fedora) есть строчка:

session required pam_limits.so

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

После изменений, перезапустите терминал и проверьте значение лимита max_open_files:

Увеличить лимит открытых файловых дескрипторов для отдельного сервиса

Вы можете изменить лимит на количество открытых файловых дескрипторов для конкретного сервиса, а не для всей системы. Рассмотрим на примере apache. Чтобы изменить значения, откройте настройки службы через systemctl:

# systemctl edit httpd.service

Добавьте необходимые лимиты, например:

[Service] LimitNOFILE=16000 LimitNOFILESoft=16000

nginx.conf настроить limitnofile

После изменения, нужно обновить конфигурацию сервиса и перезапустить его:

# systemctl daemon-reload
# systemctl restart httpd.service

Чтобы проверить, изменились ли значения, нужно получить PID сервиса:

# systemctl status httpd.service

Например, вы определил PID сервиса 32724:

# cat /proc/32724/limits | grep «Max open files”

Значение должно быть 16000.

настройка max open filex для сервиса в linux centos

Так вы изменили значения Max open files для конкретного сервиса.

Увеличить количество открытых файлов для Nginx и Apache

После того, как вы увеличил ограничения на количество открытых файлов для сервера, нужно также поправить конфигурационный файл службы. Например, для веб-сервера Nginx в файле конфигурации /etc/nginx/nginx.conf нужно задать значение в директиве:

worker_rlimit_nofile 16000

Директива worker_rlimit_nofile задает ограничение на количество файлов, открытых в рабочем процессе ( RLIMIT_NOFILE ). В Nginx файловые дескрипторы нужны для возврата статического файла из кэша для каждого подключения клиента. Чем больше пользователей использует ваш сервер и чем больше статических файлов отдает nginx, тем большее количество дескрипторов используется. Сверху максимальное количество дескрипторов ограничивается на уровне ОС и/или сервиса. При превышении количеств открытых файлов nginx появится ошибка socket() failed (24: Too many open files) while connecting to upstream .

При настройке Nginx на высоконагруженном 8-ядерном сервере с worker_connections 8192 нужно в worker_rlimit_nofile указать 8192*2*8 (vCPU) = 131072.

После чего выполнить рестарт Nginx:

# nginx -t && service nginx -s reload

Для apache, нужно создать директорию:

После этого создайте файл limit_nofile.conf:

httpd изменить LimitNOFILE

Не забудьте перезапустить сервис httpd.

Лимиты file-max для текущей сессии

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

Если указать здесь значение большее, чем заданное в hard limit, появится ошибка:

-bash: ulimit: open files: cannot modify limit: Operation not permitted

задать ulimit max_files для пользователя в linux

Когда вы завершите текущую сессию терминала и откроете новую, лимиты вернутся к начальным значениям, указанным в файле /etc/security/limits.conf.

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

Предыдущая статьяПредыдущая статья Следующая статья Следующая статья

Источник

Оцените статью
Adblock
detector