Мне нужно, чтобы 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
Попробуйте настроить это в файле /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. Это отлично работает, но немного сложнее, чем первое.
Я надеюсь, что это поможет, и, возможно, когда-нибудь я смогу открыть исходный код кулинарной книги, которая есть у нас внутри, поскольку она довольно проста, но может быть полезна другим, как вы.