How do I change the number of open files limit in Linux? [closed]
When running my application I sometimes get an error about too many files open . Running ulimit -a reports that the limit is 1024. How do I increase the limit above 1024? Edit ulimit -n 2048 results in a permission error.
I just went through this on Centos 7 (same on RHEL) and made a blog post covering it because I had so much trouble even with all these posts: coding-stream-of-consciousness.com/2018/12/21/…. Often along with open files, you need to increase nproc which actually resides in multiple settings files. and if you use systemd/systemctl that has its own separate settings. It’s kind of nuts.
4 Answers 4
You could always try doing a ulimit -n 2048 . This will only reset the limit for your current shell and the number you specify must not exceed the hard limit
Each operating system has a different hard limit setup in a configuration file. For instance, the hard open file limit on Solaris can be set on boot from /etc/system.
set rlim_fd_max = 166384 set rlim_fd_cur = 8192
On OS X, this same data must be set in /etc/sysctl.conf.
kern.maxfilesperproc=166384 kern.maxfiles=8192
Under Linux, these settings are often in /etc/security/limits.conf.
There are two kinds of limits:
- soft limits are simply the currently enforced limits
- hard limits mark the maximum value which cannot be exceeded by setting a soft limit
Soft limits could be set by any user while hard limits are changeable only by root. Limits are a property of a process. They are inherited when a child process is created so system-wide limits should be set during the system initialization in init scripts and user limits should be set during user login for example by using pam_limits.
There are often defaults set when the machine boots. So, even though you may reset your ulimit in an individual shell, you may find that it resets back to the previous value on reboot. You may want to grep your boot scripts for the existence ulimit commands if you want to change the default.
Ulimit (limits.conf) настройка частых проблем в Linux
ulimit — ограничения текущего процесса, например количество одновременно открытых файлов. Справка man limits.conf. Конфигурационный файл находится /etc/security/limits.conf.
Установка лимитов с помощью ulimit может предотвратить катастрофу в ваших системах Linux, но вам нужно предвидеть, где ограничения будут иметь смысл, а где они вызовут проблемы.
Чтобы увидеть ограничения, связанные с вашим логином, используйте команду ulimit -a. Если вы используете учетную запись обычного пользователя, вы, скорее всего, увидите что-то вроде этого:
~$ ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 7728 max locked memory (kbytes, -l) 65536 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 7728 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited
Сразу бросается в глаза, что вы не можете создавать дампы ядра, потому что ваш максимальный размер файла ядра (core file size ) равен 0. Пока размер файла ядра равен нулю, дампы ядра не допускаются. Это имеет смысл для большинства пользователей, поскольку они, вероятно, не будут ничего делать с дампом ядра, кроме его удаления, но если вам нужен дамп ядра для отладки проблем вашего приложения, вы можете настроить свой основной файл размер до неограниченного.
Изменять лимиты вы можете в конфигурационном файле, обычно /etc/security/limits.conf, или при помощи командной строки. Помните что при изменении лимитов через командную строку, ваши изменения не сохранятся после перезагрузки ОС. Например для изменения максимального количества пользовательских процессов (max user processes) используйте ключ u (из листинга вывода команды ulimit -a):
В limits.conf для каждого пользователя или группы можно задать ограничения. Каждое ограничение задается в отдельной строке. Например для группы developers настроим ограничения пределов открытия файлов, где hard жестко задали количество, а при достижении нижнего предела значения soft пользователи будут получать предупреждения):
@developers soft nofile 2048 @developers hard nofile 8192
Too many open files
Asterisk IP-PBX (IP-АТС) — свободное решение компьютерной телефонии rtp.c: Unable to allocate RTP socket: Too many open files res_timing_timerfd.c: Read error: Bad file descriptor
Ошибка «Too many open files» (Слишком много открытых файлов) означает, что сервер исчерпывает ресурс на максимальный предел открытых файлов (max open file limit).
Нужно увеличить ограничение на количество одновременно открытых файлов в файле limits.conf. Для начала проверим какой предел установлен в ОС, для этого используем данные из файловой системы ProcFS. И проверим параметр задающие число одновременно открытых файлов
# cat /proc/sys/fs/file-max 348651
Зададим для пользователя asterisk
# nano /etc/security/limits.conf . asterisk soft nofile 65535 asterisk hard nofile 65535 .
core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 20 file size (blocks, -f) unlimited pending signals (-i) 16382 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 65536 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) unlimited virtual memory (kbytes, -v) unlimited file locks (-x) unlimited
ulimit размеры файлов
В основном при работе в системе UNIX мы считаем, что ее ресурсы безграничны. Например, мы не заботимся о том, что созданный файл получится «слишком большим», а это не так уж редко в персональных компьютерах на гибких дисках. Если же мы занимаемся сопровождением и администрированием системы UNIX, то мы должны быть готовы иметь дело с ситуациями, когда превышаются различные предельные значения системы. Всегда лучше исследовать эти вопросы заранее в некритичных ситуациях, поэтому давайте рассмотрим пределы размеров файлов и их смысл.
Некоторые параметры «зашиты» в ядро системы при ее генерации. Одним из таких значений является максимальный размер файла. Он определяет наибольшее число блоков, которые может занимать файл. Этот параметр тесно связан с принятым в UNIX методом использования индексных дескрипторов файла (inodes). Это наборы указателей, среди которых первые десять указывают на блоки данных, следующий указывает на другую таблицу, следующий — на таблицу, указывающую на таблицу и т.д.
Имеется еще одно ограничение размера файла, которое определено для каждого пользователя во время работы в системе — число ulimit (user limit — пользовательский предел). Это значение устанавливается в момент вашей регистрации в системе и представляет собой число блоков по 512 байт, которые вы можете записать в любой заданный файл. В shell’е имеется команда ulimit, которая при ее вызове без аргументов выводит это число. Эта же команда позволяет вам уменьшить ваше значение ulimit. Только суперпользователь (root) может УВЕЛИЧИТЬ значения ulimit.
Побочным эффектом уменьшения значения ulimit является то, что вы не можете снова увеличить его до регистрационного значения. Значение ulimit остается таким же на все время работы вашего shell, поэтому для восстановления регистрационного значения вам необходимо выйти из системы, а затем снова зарегистрироваться.
Еще одним интересным моментом является то, что если вы установите ваше значение ulimit равным 0, вы не сможете создать никакие файлы! Максимально допустимым размером файла в данном случае является нулевой, поэтому никакой файл не может быть создан. Это представляется достаточно резонным, однако существуют такие ситуации, когда файл нулевого размера МОЖЕТ существовать. Опять же, для восстановления вашего обычного значения ulimit необходимо выйти из системы, а затем снова зарегистрироваться.
Как отмечалось ранее, увеличить значение ulimit может только суперпользователь. Эта процедура довольно проста. Сначала нужно увеличить значение ulimit командой ulimit, а затем запустить shell. Этот новый shell имеет новое значение ulimit. Если мы хотим, чтобы система загружалась с shell, имеющим большее значение ulimit, мы можем установить программу в inittab (таблице инициализации системы), чтобы эта операция выполнялась автоматически.
Nginx количество открытых сокетов, файлов (файловые дескрипторы)
В Nginx файловые дескрипторы необходимы для каждого соединения с клиентом, для возврата статического файла из кэша. Количество потребных дескрипторов может быстро возрастать. Однако общее количество дескрипторов ограничено операционной системой. Ограничение на количество одновременно открытых сокетов: Обычно, большая часть nix систем ограничивает количество сокетов до 1024.
Предполагаем что процессы сервера Nginx запущены от пользователя nginx. Для удобства просмотра ограничений операционной системы для пользователя nginx, залогинемся под ним. Стандартный запуска su не поможет (получим ошибку: This account is currently not available), так пользователь системный, нужно использовать ключи:
# su -l nginx -s /bin/bash $ whoami nginx
Или просто запустим команду от имени nginx:
# su nginx -s /bin/bash -c 'ulimit -a'
Давайте соберем текущие значения.
Текущий лимит (Soft limit) открытых файлов на процесс для текущего пользователя
su nginx -s /bin/bash -c 'ulimit -Sn' 1024
Максимальный лимит (Hard limit) открытых файлов на процесс для текущего пользователя
su nginx -s /bin/bash -c 'ulimit -Hn' 4096
Посчитать количество открытых файлов всеми процессами
Посчитать количество открытых файлов всеми процессами, по данным ядра Линукс. Мы увидим 3 цифры (число открытых в данный момент файлов; число открытых, но не используемых файлов; максимальное число открытых файлов).
# cat /proc/sys/fs/file-nr 2112 0 94547
Максимальный лимит открытых файлов для всей системы
# cat /proc/sys/fs/file-max 94547
Исходя из полученных цифр выше, минимально рекомендуемые цифры для Nginx ulimit, получились такие. Добавим их в файл /etc/security/limits.conf
nginx soft nofile 4096 nginx hard nofile 10240
Теперь меняем лимиты в nginx, для этого в файле /etc/nginx/nginx.conf в самом начале, примерно после строк
user nginx; пишем worker_rlimit_nofile 10240;
Директива worker_rlimit_nofile изменяет ограничение на количество файлов, открытых в рабочем процессе.
Заключение или Рекомендация
Не ставьте число лимитов больше 65535. В случае входящих соединений, очевидного лимита в 65535 соединений нет, скорей всего вы упретесь в лимит на файловые дескрипторы (сокеты), для каждого соединения нужен сокет. При этом лимиты могут быть на уровне пользовательских лимитов (и надо учесть для сервисов запускаемых через systemd действуют отдельные лимиты, а не те, которые указываются в limits.conf). Обычно по умолчанию лимиты дескрипторов в районе 1024-4096, существенно ниже 65535. Для очень большого количества сокетов необходимо будет так же менять sysctl на максимальное число открытых файлов, а возможно и пересобирать ядро, чтобы обойти заложенные верхние ограничения.