Недавно я проверил один из наших процессов 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 ограничения ресурсов могут быть установлены в различных местах в зависимости от типа требований.
/etc/security/limits.conf
файл./etc/sysctl.conf
файл.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/*