Назад | Перейти на главную страницу

Ограничения файлового дескриптора Ulimit не применяются для определенного процесса

Недавно я проверил один из наших процессов redis, какие ulimit применяются, используя:

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.

В 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 команда для установки нового значения в самом сценарии инициализации. Как показано ниже в сценарии,

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 конфигурации, если есть какой-либо способ указать ограничения.

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

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

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

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

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