Можно ли изменить мягкое - и жесткое ограничение в виде определенного процесса?
В моем случае мой процесс mongod
и многие веб-ресурсы говорят мне просто выполнить:
ulimit -n <my new value>
Мои нынешние мысли:
- Как команда узнает предел процесса, который я буду изменять? Разве это не изменит лимит файлов на всю систему?
- Я предполагаю, что эта команда только изменяет мягкое ограничение. Так есть ли способ увеличить жесткий лимит тоже?
Ответы:
Процесс может изменить свои пределы с помощью
setrlimit(2)
системного вызова. Когда вы бежите,ulimit -n
вы должны увидеть номер. Это текущее ограничение на количество дескрипторов открытых файлов (включая файлы, сокеты, каналы и т. Д.) Для процесса. Командаulimit
выполнилаgetrlimit(2)
системный вызов, чтобы узнать текущее значение.Вот ключевой момент: процесс наследует свой текущий лимит от своего родительского процесса. Поэтому, если вы запустите,
ulimit -n 64
вы установите ограничение оболочки для дескрипторов открытых файлов равным 64. Любой процесс, который запускает оболочка, будет иметь такое же ограничение, если только этот новый процесс не будет вызванsetrlimit()
соответствующим образом.Чтобы изменить
mongodb's
лимит дескриптора открытого файла, вы должны запуститьulimit -n 2048
(или любое другое большое количество, которое позволяет ваше ядро) оболочку. Затем вы использовали бы эту оболочку для запускаmongodb
. Как дочерний процесс,mongodb
наследовал бы (большое) ограничение на дескрипторы открытых файлов.Чтобы изменить ограничение на количество открытых файлов в системе, которое больше похоже на сумму ограничения на количество открытых файлов для всех процессов, вы должны сделать что-то вроде изменения
/etc/sysctl.conf
и запускаsysctl -p
. Посмотрите на значениеfs.file-max
параметра в/etc/sysctl.conf
.источник
Чтобы изменить пределы запущенного процесса, вы можете использовать команду утилиты
prlimit
.Что это делает внутренне, так это называть
setrlimit(2)
. Страница man prlimit должна содержать несколько полезных примеров вызова.Источник: https://sig-io.nl/posts/run-time-editing-of-limits-in-linux/
источник
too many files open
ошибки. Ваш ответ решил мою проблему, не останавливая процесс.По крайней мере, в Linux большинство дистрибутивов используют pam для аутентификации. Один модуль, который поставляется с PAM, является модулем ограничений . Цитирование из README для pam_limits:
The pam_limits PAM module sets limits on the system resources that can be obtained in a user-session. Users of uid=0 are affected by this limits, too.
В результате вы можете установить для каждого пользователя, для каждой группы и ограничения по умолчанию в обеих категориях: жесткие (для корневого каталога это необходимо, и процесс не может запросить более высокие) и мягкие ограничения. Мягкие ограничения обычно устанавливаются ниже жестких ограничений, и приложение может увеличивать их, пока не достигнет жесткого предела.
В вашем случае, если процесс, в котором вы хотите увеличить пределы, запускается как обычный пользователь, вы можете увеличить ограничения для этого пользователя или группы. Например, у меня есть несколько заданий mysql cron на некоторых серверах, которые требуют открытия дополнительных файловых дескрипторов, поэтому я установил это:
Нет ничего, что нужно перезапустить; когда вы су для этого пользователя, вы сразу видите, что новые ограничения вступают в силу.
Еще одна вещь, которую вы можете сделать, если вы работаете в типичной производной системе RedHat, это поместить нужный вызов ulimit в скрипт / etc / sysconfig / $ SERVICE. Например, сценарий инициализации apache называется /etc/init.d/httpd и содержит исходный файл конфигурации / etc / sysconfig / httpd, если он найден. Я нашел, что легче управлять этим, вместо того чтобы редактировать сам скрипт инициализации, потому что скрипты инициализации обновляются при обновлении rpm, но файлы sysconfig обновляются только в том случае, если они не изменены по умолчанию.
источник
Команда изменит ограничение для текущего процесса (вашей оболочки) и любого дочернего процесса (всего, что вы запускаете из оболочки впоследствии).
Процессы организованы в дереве. Каждый процесс имеет родителя (который его вызвал). Процесс номер 1, init, является специальным процессом в том смысле, что он является его собственным родителем. Такие инструменты, как htop или top, могут показать вам процессы, отображаемые в виде дерева родителей и детей.
источник