Обмеження обмежень дескриптора файлу не застосовується для певного процесу


14

Нещодавно я перевірив один із наших процесів redis на те, що усуває, де застосовується:

cat /proc/<redis-pid>/limits

І був здивований, дізнавшись, що це низьке значення за замовчуванням:

Limit                     Soft Limit           Hard Limit           
Max open files            4016                 4016 

Мене здивувало, оскільки у нас налаштовано таке:

# /etc/sysctl.conf 
fs.file-max = 100000

.

# /etc/security/limits.conf
* soft nofile 100000
* hard nofile 100000

.

# /etc/ssh/sshd_config
UsePAM yes

.

# /etc/pam.d/sshd
session required pam_limits.so

Чи може хто-небудь сказати мені, чому підвищений ulimit не застосовується до запущеного процесу Redis?

Процес redis працює як користувач 'redis', сервер був перезавантажений з моменту збільшення лімітів. Ми на Debian Squeeze.

Відповіді:


19

В Linux ресурси обмеження можуть встановлюватися в різних місцях, виходячи з типу вимоги.

  1. /etc/security/limits.conf файл.
  2. /etc/sysctl.conf файл.
  3. ulimit командування

/etc/security/limits.confє частиною pam_limits, тому обмеження, встановлені в цьому файлі, читаються модулем pam_limits під час сеансів входу. Сеанс входу в систему може бути sshабо через terminal. І pam_limits не вплине на демон-процеси, про які йдеться тут .

/etc/sysctl.confце загальносистемна глобальна конфігурація, ми не можемо тут встановити специфічну для користувача конфігурацію. Він встановлює максимальний обсяг ресурсу, який можуть використовувати всі користувачі / процеси, що надходять до них.

ulimitкоманда використовується для встановлення меж оболонки. І тому, коли встановлено обмеження ulimitна оболонці, процес, який породжується від оболонки, також отримує це значення через правило, яке child processуспадковує parent processesвластивості.

І так у вашому випадку, оскільки redisрозпочате як частина initнічого з вищезгаданого не допоможе вам безпосередньо. Правильний спосіб цього полягає в тому, що вам потрібно використовувати ulimitкоманду для встановлення нового значення в самому скрипті init. Як і нижче в сценарії,

ulimit -n 100000
if start-stop-daemon --start --quiet --umask 007 --pidfile $PIDFILE --chuid redis:redis --exec $DAEMON -- $DAEMON_ARGS.

У списку побажань вже зареєстрована помилка, до якої можна додати ulimitфункцію start-stop-daemon .

Також перевірте redisконфігурацію, чи є там якийсь спосіб надання обмежень.


Чудовий підсумок Каннана! Зараз я пішов вперед і додав прошивку до сценарію запуску. Шкода, що немає можливості просто встановити ліміт для користувача, який буде працювати з деамонізованими процесами (оскільки у нас є кілька сценаріїв запуску), але це працює. Дякую!
UpTheCreek

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

2

Параметр sysctl fs.file-max - це широкий глобальний ліміт системи, я не думаю, що це гарне налаштування ідеї для зменшення того ж значення.

Якщо ви встановите ulimit 100000 і також sysctl.conf 100000, один користувач може заблокувати систему

У будь-якому випадку, говорячи про вашу проблему, ви не впевнені, що ваша система використовує пам’яті

man pam_limits
grep -i limit /etc/pam.d/*

Дякую - тоді я розглядаю можливість підняти значення fs.file-max. Щодо пам - я вважаю, що ми використовуємо це (я додав до запитання кілька додаткових конфігурацій). Я не дуже впевнений, що розумію PAM, оскільки, здається, наші налаштування відносяться до SSH, який не використовується цим користувачем. Чи є ще якийсь файл, який мені потрібно налаштувати? Я завжди міг поставити нескінченну настройку в сценаріїв init для redis, але я б краще цього не робив.
UpTheCreek

2

Ви ввімкнули pam_limits для sshd, але чи виконується ця команда з сеансу SSH? Можливо, вам доведеться додати той самий рядок до /etc/pam.d/loginта / або /etc/pam.d/suта / або /etc/pam.d/sudo.


Спасибі. Я підозрював, що це було не зовсім правильно. Процес йде почав цей рядок в init.d скрипт: if start-stop-daemon --start --quiet --umask 007 --pidfile $PIDFILE --chuid redis:redis --exec $DAEMON -- $DAEMON_ARGS. Яка пампа була б доречною в цьому випадку?
UpTheCreek

у своєму сценарії ви можете використовувати ulimit -n 100000
c4f4t0r

Чи використовує скрипт init.d su [user] -cкоманду для запуску сценарію як інший користувач, чи програма працює як root? Якщо він використовується su, то ви ввели його /etc/pam.d/su. Якщо ви працюєте як root, ви, ймовірно, краще з пропозицією c4f4t0r додати ulimitкоманду у свій сценарій init. rootдозволяється встановлювати будь-які обмеження, які вона хоче, тому вам не потрібно турбуватися про памп для цього випадку.
Усюдисутність

1
Спасибі. Він використовується --chuid redis:redisна start-stop-daemon. Зараз я додав пробну версію до сценарію запуску.
UpTheCreek
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.