Jak ustawić limity dla usługi rozpoczynającej się przy starcie systemu?

18

Potrzebuję, aby mysql używał dużych stron, aby ustawić ulimit - zrobiłem to w limit.conf. Jednak limit.conf (pam_limits.so) nie jest wczytywany dla init, tylko dla „prawdziwych” powłok. Rozwiązałem to wcześniej, dodając „ulimit -l” do funkcji uruchamiania initscript. Potrzebuję jakiegoś powtarzalnego sposobu, aby to zrobić, teraz, gdy pudełka są zarządzane z szefem kuchni i nie chcemy przejmować pliku, który faktycznie jest własnością RPM.

jayofdoom
źródło
Sprawdź, czy napotykasz ten sam błąd. serverfault.com/questions/415570/…
Minto Joseph,

Odpowiedzi:

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 kroki mogą natychmiast zmienić limity systemu i mogą nadal działać po ponownym uruchomieniu. Możesz zmienić liczbę „102400” na liczbę maksymalnych otwartych plików w systemie Linux, jak chcesz. i

$ sysctl -p

aby załadować ustawienia sysctl z określonego pliku lub /etc/sysctl.conf, jeśli nie podano.

Sofring
źródło
2
Ograniczenia.conf nie są odczytywane przez inittab, ponieważ limit.so nie jest dla niego odczytywany. Możesz być w stanie zhakować PAM, ale nie mogę ustalić, który plik może odczytać.
Xarses
Zwróć uwagę, że symbol wieloznaczny *nie działa dla rootużytkownika, musisz rootjawnie określić ...
Matt
@Xarses ma rację. limit.conf nie zostanie zastosowany w przypadku niektórych demonów, zaczynając od rozruchu. Nie wierzę, że to odpowiada na pytanie.
Alchemist
2

/etc/sysctl.conf powinien mieć możliwość ustawienia pozycji ulimits. Nie byłem w stanie przetestować tego dobrze, ale z ankiety wynika, że ​​powinieneś być w stanie zatrzymać się po ustawieniu w sysctl.conf.

Znalazłem różne tematy, które pokazują, że wciąż jest to problem, a wraz z zespołem omawialiśmy niektóre opcje wokół tego problemu, znaleźliśmy dwa potencjalne obejścia.

Opcja 1: Większość skryptów źródłowych rhel /etc/init.d/functions, możesz zmienić tam ustawienia ulimit

Opcja 2: init twierdzi, że / etc / initscript jest pozyskiwany za każdym razem, zanim init spawnuje cokolwiek zobacz: http://linux.die.net/man/5/initscript . Co ciekawe, mówią, że ludzie mogą ustawić ulimit =)

Xarses
źródło
1

Samodzielny fragment przepisu na podstawie tego adresu URL:

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

Fragment przepisu:

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
Joe Goggins
źródło
0

Moim rozwiązaniem było po prostu zrobienie tego w naszym przepisie na szefa kuchni:

# 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

Powoduje to ulimit -lustawienie wszystkich skryptów skryptowych, co może być niepożądane w niektórych środowiskach, ale dla mnie jest w porządku.

W idealnym świecie zaktualizowałbym RPM, aby zawierał a /etc/sysconfig/mysqld, i umieściłbym tam to samo polecenie ulimit -l.

jayofdoom
źródło
0

Nie jestem pewien, czy jest to specyficzne dla dystrybucji, ale właśnie wprowadziłem zwiększenie limitu bezpieczeństwa, używając /etc/security/limits.d/20-somefile.confw Ubuntu.

Zamiast modyfikować istniejący plik, mam szablon ERB w mojej książce kucharskiej, ustawiam domyślne atrybuty w pliku atrybutów, a następnie nie muszę się martwić o użycie bloków ruby ​​z elementami „insert_line_if_no_match” - wydaje się to nieco bardziej skomplikowane i przepis jest trochę bardziej czytelny:

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

i to jest mój plik szablonu:

fs.filemax = <%= node[:mycookbook][:system_fs_filemax] %>
Brett
źródło
0

według strony podręcznika ulimit jest przestarzałe. Musisz użyć setrlimit. Problem polega na tym, że jest to wywołanie systemowe zamiast polecenia bash.

Miałem ten problem z przełożonym i właśnie to się dowiedziałem. Jeśli proces nie ma pliku konfiguracyjnego, który pozwala na wywołanie wywołania systemowego setrlimit (). Ustaw za pomocą ulimit w skrypcie bash /etc/init.d. To skrypt usługi, który rozpoczyna proces.

Jeśli proces ma plik konfiguracyjny, na przykład superwizor d, możesz użyć tego pliku konfiguracyjnego, aby ustawić liczbę plików i zlecić procesowi bezpośrednie wywołanie setrlimits ().

Opiekun: 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
źródło
0

Sposób RedHat, jak opisano w artykule 253043 (wymagana subskrypcja), polega na dodawaniu odpowiednich instrukcji ulimit /etc/sysconfig/<service name>. Na przykład:

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

(Użyj istniejącego pliku dla swojej usługi zamiast myServiceName.)

W przypadku demonów, które uruchamiają się bez użycia skryptu „sysconfig” RedHata, należy dodać odpowiednie wiersze ulimit do skryptu uruchamiania demona.

Steve Bonds
źródło
-1

Spróbuj skonfigurować to w pliku /etc/sysctl.conf

siupakabras
źródło
W tym celu potrzebne są elementy konfiguracji, które należą do sysctl.conf, i te są na miejscu - wystarczy zmodyfikować ulimity, aby umożliwić dostęp do tych stron.
jayofdoom
-1

Napisałem prywatną książkę kucharską, która służy nam do ustawiania ulimit i działa całkiem dobrze. W przypadku Ubuntu stwierdziliśmy, że jeśli potrzebujesz globalnego ustawienia ulimit, wymagana jest następująca sztuczka:

Dodaj następujące elementy do wspólnej sesji:

session required        pam_limits.so

i w limit.conf musisz mieć następujące elementy:

* soft  nofile  64000
* hard  nofile  65000

root  soft  nofile  64000
root  hard  nofile  65000

Część główna jest ważna, ponieważ wydaje się bez niej, że niektóre skrypty inicjujące nie będą działać poprawnie. Mamy więc książkę kucharską, która konfiguruje poniższe i działa świetnie.

Inną opcją, której używaliśmy dla Tomcat, było wdrożenie Tomcata, a następnie zastąpienie skryptu init niestandardową opcją, dla której ustawiamy ulimit i restartujemy tomcat. Działa to świetnie, ale jest nieco bardziej hackerskie niż pierwsze.

Mam nadzieję, że ta pomoc, a może kiedyś uda mi się otworzyć książkę kucharską, którą mamy wewnętrznie, ponieważ jest dość prosta, ale może być pomocna dla innych, takich jak ty.

Zuhaib
źródło
To nie rozwiąże problemu z plakatem. Pam jest wywoływana tylko wtedy, gdy użytkownik otworzy sesję (powłokę). Ponieważ system init jest uruchamiany niezależnie od sesji użytkownika, pam nie ma zastosowania.
Patrick