Как установить ulimits для сервиса, запускающегося при загрузке?

18

Мне нужно, чтобы mysql использовал большие страницы, чтобы установить ulimit - я сделал это в limit.conf. Однако limit.conf (pam_limits.so) не читается для init, только для "настоящих" оболочек. Я решил это раньше, добавив «ulimit -l» в функцию запуска initscript. Мне нужен какой-то повторяемый способ сделать это, теперь, когда ящики управляются с помощью chef, и мы не хотим принимать файл, который фактически принадлежит RPM.

jayofdoom
источник
Пожалуйста, посмотрите, если вы попали в ту же ошибку. serverfault.com/questions/415570/…
Минто Джозеф

Ответы:

8
$ echo "* hard nofile 102400" >> /etc/security/limits.conf
$ echo "* soft nofile 102400" >> /etc/security/limits.conf
$ sysctl -w fs.file-max=102400
$ sysctl -p

4 шага могут изменить пределы вашей системы немедленно, и могут работать после перезагрузки. Вы можете изменить число «102400» на максимальное количество открытых файлов в вашей системе Linux, как вы хотите. и

$ sysctl -p

загрузить в настройках sysctl из указанного файла или /etc/sysctl.conf, если ничего не указано.

Sofring
источник
2
limit.conf не читается inittab, так как limit.so не читается для него. Возможно, вы сможете взломать PAM, но я не могу понять, какой файл он может прочитать.
Xarses
Обратите внимание, что подстановочный знак *не работает для rootпользователя, вам придется указать rootявно ...
Мэтт
@Xarses прав. limit.conf не будет применен для некоторых демонов, запускающихся во время загрузки. Я не верю, что это отвечает на вопрос.
Алхимик
2

/etc/sysctl.conf должен иметь возможность устанавливать элементы ulimits. Я не смог проверить это хорошо, но опрос говорит, что вы сможете остановиться после того, как он установлен в sysctl.conf.

Я нашел различные темы, которые показывают, что это все еще проблема, и моя команда и я обсудили некоторые варианты этого, мы нашли два возможных обходных пути.

Вариант 1. Большинство исходных скриптов rhel initscripts /etc/init.d/functions, вы можете изменить там настройки ulimit

Вариант 2: init утверждает, что / etc / initscript исходит каждый раз перед тем, как init вызывает что-либо, смотрите: http://linux.die.net/man/5/initscript . Достаточно интересно, что они говорят, где люди могут установить ulimit =)

Xarses
источник
1

Автономный фрагмент рецепта на основе этого URL:

http://pro.benjaminste.in/post/318453669/increase-the-number-of-file-descriptors-on-centos-

Фрагмент рецепта:

ruby_block "edit /etc/sysctl.conf" do
  _file = "/etc/sysctl.conf"
  _comment = "# TWEAK BY CHEF"
  _content = "fs.file-max = 512000"
  block do
    file = Chef::Util::FileEdit.new(_file)
    file.insert_line_if_no_match(/#{Regexp.escape(_comment)}/, "#{_comment}\n#{_content}")
    file.write_file
  end
  not_if "cat #{_file} | grep '#{_comment}'"
  notifies :run, "execute[sysctl -p]", :immediately
end

execute "sysctl -p" do
  command "sysctl -p"
  returns 255 # which would normally signify error, but doesn't on sysctl on CentOS
  action :nothing
end

ruby_block "edit /etc/security/limits.conf" do
  _file = "/etc/security/limits.conf"
  _comment = "# TWEAK BY CHEF"
  _content = "* - nofile 65535"
  block do
    file = Chef::Util::FileEdit.new(_file)
    file.insert_line_if_no_match(/#{Regexp.escape(_comment)}/, "#{_comment}\n#{_content}")
    file.write_file
  end
  not_if "cat #{_file} | grep '#{_comment}'"
end
Джо Гоггинс
источник
0

Моим решением было сделать это по рецепту нашего шеф-повара:

# Ensure ulimits are properly set for the initscript
bash "Set Ulimits" do
    user "root"
    code <<-EOH
    echo -e "n#Setting ulimits. Performed by chef recipe MYSQLULIMIT\nulimit -l" >> /etc/sysconfig/init
    EOH
    not_if "grep MYSQLULIMIT /etc/sysconfig/init"
end

Это приводит к ulimit -lтому, что устанавливается для всех начальных сценариев, что может быть нежелательно в некоторых средах, но хорошо для моего.

В идеальном мире я бы обновил RPM, включив в него /etc/sysconfig/mysqld, и вставил туда ту же команду ulimit -l.

jayofdoom
источник
0

Не уверен, насколько это конкретно для дистрибутива, но я только что включил увеличение лимита безопасности при использовании /etc/security/limits.d/20-somefile.confв Ubuntu.

Вместо того, чтобы изменять существующий файл, у меня есть шаблон ERB в моей кулинарной книге, я устанавливаю атрибуты по умолчанию в файле атрибутов, и мне не нужно беспокоиться об использовании рубиновых блоков с материалом "insert_line_if_no_match" - который кажется немного более сложным и рецепт немного более читабелен, как это:

execute "activate_sysctl" do
  user "root"
  command "sysctl -p /etc/sysctl.d/10-filemax.conf"
  action :nothing
end

template "/etc/sysctl.d/10-filemax.conf" do
  source "system/filemax.conf"
  action :create
  notifies :run, "execute[activate_sysctl]", :immediately
end

и тогда это мой файл шаблона:

fs.filemax = <%= node[:mycookbook][:system_fs_filemax] %>
Brett
источник
0

согласно справочной странице ulimit устарела. Вам нужно использовать setrlimit. Проблема в том, что это системный вызов, а не команда bash.

У меня была эта проблема с руководителем, и это то, что я узнал. Если у процесса нет файла конфигурации, который позволяет вам выполнить системный вызов setrlimit (). Установите его с помощью ulimit в своем скрипте /etc/init.d bash. Это служебный скрипт, который запускает ваш процесс.

Если у процесса есть файл конфигурации, например, supervisor d, то вы можете использовать этот файл конфигурации, чтобы установить количество файлов и сделать так, чтобы процесс непосредственно вызвал setrlimits ().

Руководитель: http://supervisord.org/configuration.html#supervisord-section-settings

TomcaT: http://www.jayway.com/2012/02/11/how-to-really-fix-the-too-many-open-files-problem-for-tomcat-in-ubuntu/

einarc
источник
0

Способ RedHat, описанный в статье 253043 (требуется подписка), заключается в добавлении соответствующих операторов ulimit /etc/sysconfig/<service name>. Например:

# echo "ulimit -SHn 10240   # nfile" >> /etc/sysconfig/myServiceName

(Используйте существующий файл для вашей службы вместо myServiceName.)

Для демонов, которые запускаются без использования скрипта RedHat «sysconfig», вам необходимо добавить соответствующие строки ulimit в скрипт запуска демона.

Стив Бондс
источник
-1

Попробуйте настроить это в файле /etc/sysctl.conf

siupakabras
источник
Для этого необходимы элементы конфигурации, которые принадлежат sysctl.conf, и они есть - нам просто нужно изменить ulimits, чтобы обеспечить доступ к этим огромным страницам.
jayofdoom
-1

Я на самом деле написал личную поваренную книгу шеф-повара, которая используется для установки ulimit для нас, и она работает довольно хорошо. Для Ubuntu мы нашли следующий трюк, если вам нужна глобальная настройка ulimit:

Добавьте следующее к вашей общей сессии:

session required        pam_limits.so

и в limit.conf у вас должно быть следующее:

* soft  nofile  64000
* hard  nofile  65000

root  soft  nofile  64000
root  hard  nofile  65000

Корневая часть важна, так как кажется, что некоторые сценарии инициализации не будут работать правильно. Итак, у нас есть поваренная книга, которая настроена следующим образом, и она прекрасно работает.

Другим вариантом, который мы использовали для Tomcat, было развертывание Tomcat, а затем перезаписать сценарий инициализации с помощью пользовательского параметра, для которого мы установили бы ulimit и перезапустили tomcat. Это прекрасно работает, но немного более хакерски, чем первый.

Я надеюсь, что это поможет, и, возможно, когда-нибудь я смогу открыть исходный код поваренной книги, которая у нас есть, поскольку она довольно проста, но может быть полезна другим, таким как вы.

Zuhaib
источник
Это не решит проблему плаката. Pam вызывается только тогда, когда пользователь открывает сеанс (оболочку). Поскольку система init запускается независимо от пользовательских сессий, pam не применяется.
Патрик