Изменить ulimit (открыть файлы) определенного процесса

27

Можно ли изменить мягкое - и жесткое ограничение в виде определенного процесса?

В моем случае мой процесс mongodи многие веб-ресурсы говорят мне просто выполнить:

ulimit -n <my new value>

Мои нынешние мысли:

  • Как команда узнает предел процесса, который я буду изменять? Разве это не изменит лимит файлов на всю систему?
  • Я предполагаю, что эта команда только изменяет мягкое ограничение. Так есть ли способ увеличить жесткий лимит тоже?
тест
источник
Вы прочитали эту ценную информацию? docs.mongodb.org/manual/reference/ulimit
Дзынь
Да, я выучил все наизусть ... Я не уверен, что что-то упустил, но эта страница только говорит вам, как просмотреть детали. Он только говорит вам написать ulimit -n <value> ...
test

Ответы:

29

Процесс может изменить свои пределы с помощью 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.

Брюс Эдигер
источник
Какое великолепное объяснение! Большое спасибо. Я попробую это прямо сейчас!
тест
Этот ответ мне очень помог, но теперь проблема в том, что жесткий предел составляет 2048, и этого недостаточно в моем случае. 1) как найти предел, который позволяет мое ядро? 2) Возможно ли изменить HARD LIMIT сейчас? Еще раз спасибо!
тест
@test - я никогда не поднимал жесткий лимит. Нашел вот это: blog.samat.org/2011/04/05/… и вот это wiki.brekeke.com/wiki/Increase-File-Descriptor-Limit-on-Linux Они говорят то же самое.
Брюс Эдигер
18

Чтобы изменить пределы запущенного процесса, вы можете использовать команду утилиты prlimit.

prlimit --pid 12345 --nofile=1024:1024

Что это делает внутренне, так это называть setrlimit(2). Страница man prlimit должна содержать несколько полезных примеров вызова.

Источник: https://sig-io.nl/posts/run-time-editing-of-limits-in-linux/

user7610
источник
Это спасло мой день, спасибо. У меня был длительный процесс Python, который выдавал too many files openошибки. Ваш ответ решил мою проблему, не останавливая процесс.
Visionscaper
1

По крайней мере, в 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 на некоторых серверах, которые требуют открытия дополнительных файловых дескрипторов, поэтому я установил это:

$ cat /etc/security/limits.d/mysql.conf
@mysql           soft    nofile          100000
@mysql           hard    nofile          200000

Нет ничего, что нужно перезапустить; когда вы су для этого пользователя, вы сразу видите, что новые ограничения вступают в силу.

Еще одна вещь, которую вы можете сделать, если вы работаете в типичной производной системе RedHat, это поместить нужный вызов ulimit в скрипт / etc / sysconfig / $ SERVICE. Например, сценарий инициализации apache называется /etc/init.d/httpd и содержит исходный файл конфигурации / etc / sysconfig / httpd, если он найден. Я нашел, что легче управлять этим, вместо того чтобы редактировать сам скрипт инициализации, потому что скрипты инициализации обновляются при обновлении rpm, но файлы sysconfig обновляются только в том случае, если они не изменены по умолчанию.

Тодд Лайонс
источник
Лучшее и наиболее практичное решение.
nelaaro
0

Как команда узнает предел процесса, который я буду изменять? Разве это не изменит ограничения на количество открытых файлов в системе?

Команда изменит ограничение для текущего процесса (вашей оболочки) и любого дочернего процесса (всего, что вы запускаете из оболочки впоследствии).

Процессы организованы в дереве. Каждый процесс имеет родителя (который его вызвал). Процесс номер 1, init, является специальным процессом в том смысле, что он является его собственным родителем. Такие инструменты, как htop или top, могут показать вам процессы, отображаемые в виде дерева родителей и детей.

user7610
источник