Змінення ulimit (відкритих файлів) певного процесу


27

Чи можна змінити м'яке - і жорстке обмеження у вигляді певного процесу?

У моєму випадку мій процес є, mongodі багато веб-ресурсів підказують мені просто виконати:

ulimit -n <my new value>

Мої поточні думки:

  • Як команда дізнається межу процесу, який я буду змінювати? Чи це не змінить ліміт відкритих файлів для всіх систем?
  • Я здогадуюсь, що ця команда змінює лише м'який межа. Так чи є спосіб збільшити жорсткий ліміт?

Чи читали ви цю цінну інформацію? docs.mongodb.org/manual/reference/ulimit
Дзинь

Так, я все це вивчив напам’ять. Я не впевнений, чи щось мені не вистачає, але ця сторінка лише розповідає, як переглянути деталі. Це лише каже вам написати ulimit -n <значення> ...
тест

Відповіді:


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) Чи можна змінити ГРИМ ТВОРУ зараз? Знову дякую!
тест

@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). Сторінка користувача prlimit повинна містити кілька корисних прикладів виклику.

Джерело: https://sig-io.nl/posts/run-time-editing-of-limits-in-linux/


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

1

Щонайменше, у Linux більшість дистрибутивів, як видається, використовують пам для автентифікації. Один модуль, який постачається з пам’яткою, є модулем обмежень . Цитування з програми README для пам_лімітів:

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.

Як результат, ви можете встановити обмеження для кожного користувача, групи та групи за замовчуванням в обох категоріях жорстких (root встановлює це і процес не може вимагати більш високих) та м'яких обмеженнях. Зазвичай м'які межі встановлюються нижчими від жорстких, і додаток може збільшувати їх вгору, поки не досягнуть жорсткої межі.

У вашому випадку, якщо процес, який ви хочете збільшити ліміти запуску, як звичайний користувач, ви можете збільшити ліміти для цього користувача або групи. Як приклад, у мене на деяких серверах є завдання mysql cron, на яких потрібно відкрити додаткові ручки файлів, тому я встановив це:

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

Немає нічого, що потрібно перезапустити; коли ви відповідаєте за цього користувача, ви можете відразу побачити, що нові обмеження набувають чинності.

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


Найкраще і практичне рішення.
nelaaro

0

Як команда дізнається межу процесу, який я буду змінювати? Чи це не змінить ліміт відкритих файлів для всіх систем?

Команда змінить обмеження для поточного процесу (вашої оболонки) та будь-якого дочірнього процесу (все, що ви запустите з оболонки згодом).

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.