Пределы дескриптора файла Ulimit, не применяемые для конкретного процесса

Недавно я проверил один из наших процессов redis на то, что ulimits, где применяется с использованием:

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», сервер перезагружается с тех пор, как лимиты были увеличены. Мы находимся на Squeeze Debian.

12 голосов | спросил UpTheCreek 4 22014vEurope/Moscow11bEurope/MoscowTue, 04 Nov 2014 16:55:29 +0300 2014, 16:55:29

3 ответа


18

В лимитах ресурсов 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 - глобальная глобальная конфигурация системы, мы не можем настраивать здесь конкретную конфигурацию пользователя. Он устанавливает максимальный объем ресурсов, который может быть использован всеми пользователями /процессами, помещенными в gether.

Команда

ulimit используется для установки пределов оболочки. И поэтому, когда ограничение устанавливается с помощью ulimit в оболочке, процесс, который генерируется из оболочки, получает это значение также из-за правила что child process наследует свойства parent processes.

Итак, для вашего случая, когда redis запускается как часть init Ничто из перечисленного не поможет вам напрямую. Правильный способ сделать это состоит в том, что вам нужно использовать команду ulimit, чтобы установить новое значение в самом скрипте инициализации. Как ниже в сценарии,

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, если есть какой-либо способ предоставления лимитов.

ответил Kannan Mohan 5 32014vEurope/Moscow11bEurope/MoscowWed, 05 Nov 2014 08:52:26 +0300 2014, 08:52:26
1

Параметр sysctl fs.file-max является широким глобальным пределом системы, я не думаю, что это хорошая идея, устанавливая в ulimit то же значение.

Если вы установили в ulimit 100000 и в sysctl.conf 100000 тоже, один пользователь может заблокировать систему

В любом случае, говоря о вашей проблеме, вы уверены, что ваша система использует pam_limits

man pam_limits
grep -i limit /etc/pam.d/*
ответил c4f4t0r 4 22014vEurope/Moscow11bEurope/MoscowTue, 04 Nov 2014 17:07:04 +0300 2014, 17:07:04
1

Вы включили pam_limits для sshd, но выполняется ли эта команда из сеанса SSH? Возможно, вам потребуется добавить ту же строку в /etc/pam.d/login и /или /etc/pam.d/su и /или /etc/pam.d/sudo.

ответил Omnipresence 4 22014vEurope/Moscow11bEurope/MoscowTue, 04 Nov 2014 17:17:00 +0300 2014, 17:17:00

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132