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

Как установить ulimit для запуска службы при загрузке?

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

$ 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, если не указан.

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

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

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

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

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

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

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

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

Автономный фрагмент рецепта на основе этого 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

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

# 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.

Не уверен, насколько это зависит от конкретного дистрибутива, но я только что добавил увеличение лимита безопасности, используя /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] %>

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

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

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

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

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

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

На самом деле я написал личную поваренную книгу, которая используется для установки 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. Это отлично работает, но немного сложнее, чем первое.

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