Як встановити обмеження для послуги, починаючи з завантаження?


18

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


Будь ласка, подивіться, чи не потрапили ви в ту саму помилку. 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, якщо такі не вказані.


2
limit.conf не читається inittab, тому що limit.so для нього не читається. Можливо, ви зможете зламати PAM, але я не можу зрозуміти, який файл він може прочитати.
Xarses

Зауважте, що підказка *не працює для rootкористувача, вам доведеться rootчітко вказати ...
Метт

@Xarses вірно. limit.conf не застосовуватиметься до демона, який починається під час завантаження. Я не вірю, що це відповідає на питання.
Алхімік

2

/etc/sysctl.conf має бути в змозі встановити елементи ulimits. Я не зміг перевірити це добре, але опитування стверджує, що ви повинні зупинитись після встановлення в sysctl.conf.

Я знайшов різні теми, які показують, що це все-таки проблема, і ми з моєю командою обговорили деякі варіанти цього питання, ми знайшли два можливих шляхи вирішення.

Варіант 1: Більшість джерел initscripts rhel /etc/init.d/functions, ви можете змінити налаштування ulimit там

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


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до встановлення для всіх incripts, що може бути небажаним у деяких середовищах, але добре для мого.

У ідеальному світі я би оновлював RPM, щоб він включав /etc/sysconfig/mysqldта додав ту саму команду ulimit -l.


0

Не впевнений, наскільки це специфічно для distro, але я тільки що включив підвищення межі безпеки за допомогою /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] %>

0

на думку man, сторінка ulimit застаріла. Вам потрібно використовувати setrlimit. Проблема в тому, що це системний виклик замість команди bash.

У мене були проблеми з керівником, і це я дізнався. Якщо в процесі відсутній конфігураційний файл, який дозволяє здійснювати виклик до системного виклику setrlimit (). Встановіть його з ulimit у своєму /etc/init.d bash-скрипті. Ось сценарій служби, який запускає ваш процес.

Якщо процес має конфігураційний файл, як, наприклад, супервайзер d, ви можете використовувати цей конфігураційний файл для встановлення кількості файлів, а сам процес здійснює виклик безпосередньо до встановлених обмежень ().

Супервізор: 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/


0

Шлях RedHat, як описано у статті 253043 (необхідна підписка), - це додавання до відповідних заяв без обмежень/etc/sysconfig/<service name> . Наприклад:

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

(Використовуйте існуючий файл для вашої служби замість myServiceName.)

Для демонів, які починаються без використання сценарію RedHat "sysconfig", вам потрібно буде додати відповідні лінійки ulimit до сценарію запуску демона.


-1

Спробуйте налаштувати його у /etc/sysctl.conf файл


Для цього потрібні фрагменти конфігурації, які належать до sysctl.conf, і такі є на місці - нам просто потрібно змінити пробні можливості, щоб мати доступ до цих величезних сторінок.
jayofdoom

-1

Насправді я написав приватну кухарську книгу-кухар, яка використовується для того, щоб нам не зрушити, і вона працює досить добре. Для ubuntu ми знайшли наступний трюк, якщо потрібно встановити глобальний параметр ulimit:

Додайте наступне до свого загального сеансу:

session required        pam_limits.so

та у limit.conf ви повинні мати наступне:

* soft  nofile  64000
* hard  nofile  65000

root  soft  nofile  64000
root  hard  nofile  65000

Коренева частина важлива, оскільки, здається, без цього сценарій init буде працювати неправильно. Тож у нас є кулінарна книга кухаря, яка налаштовує наступне, і вона чудово працює.

Іншим варіантом, який ми використовували для Tomcat, було розгортання Tomcat, а потім перезапис сценарію init з користувачем, який ми встановимо для обмеження і перезапустімо tomcat. Це чудово працює, але трохи хитріше, ніж перше.

Я сподіваюся, що це допоможе, і, можливо, коли-небудь я можу відкрити джерело кулінарної книги, яку ми маємо всередині, оскільки її досить просто не вистачає, але може бути корисною для інших, як ви.


Це не вирішить питання афіші. Pam викликається лише тоді, коли користувач відкриває сеанс (оболонку). Оскільки система init запускається незалежно від сеансів користувача, пам не застосовується.
Патрік
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.