Wie setze ich ulimits für einen Dienst, der beim Booten startet?

18

Ich brauche, damit MySQL große Seiten verwendet, um ein Ulimit zu setzen - das habe ich in der limits.conf gemacht. Allerdings wird limits.conf (pam_limits.so) nicht für init eingelesen, sondern nur für "echte" Shells. Ich habe dies zuvor gelöst, indem ich der initscript-Startfunktion ein "ulimit -l" hinzufügte. Ich brauche eine Art wiederholbaren Weg, um dies zu tun, da die Boxen jetzt von Chef verwaltet werden und wir keine Datei mehr übernehmen wollen, die eigentlich im Besitz des RPM ist.

jayofdoom
quelle
Bitte schauen Sie nach, ob Sie den gleichen Fehler finden. serverfault.com/questions/415570/…
Minto Joseph

Antworten:

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

Die 4 Schritte können die Grenzen Ihres Systems sofort ändern und auch nach dem Neustart noch funktionieren. Sie können die Zahl "102400" in die Anzahl der maximal geöffneten Dateien in Ihrem Linux-System ändern, wie Sie möchten. und

$ sysctl -p

sysctl-Einstellungen aus der angegebenen Datei oder /etc/sysctl.conf laden, wenn keine angegeben sind.

Sofring
quelle
2
limits.conf wird von inittab nicht gelesen, da limit.so nicht dafür gelesen wird. Sie sind möglicherweise in der Lage, PAM zu hacken, aber ich kann nicht herausfinden, welche Datei es lesen könnte.
Xarses
Beachten Sie, dass der Platzhalter *für rootBenutzer nicht funktioniert . Sie müssen ihn rootexplizit angeben ...
Matt
@Xarses ist richtig. limit.conf wird für einige Daemons nicht angewendet, die beim Booten starten. Ich glaube nicht, dass dies die Frage beantwortet.
Alchemist
2

/etc/sysctl.conf sollte in der Lage sein, die ulimits-Elemente festzulegen. Ich konnte das nicht gut testen, aber die Umfrage besagt, dass Sie in der Lage sein sollten, anzuhalten, nachdem es in sysctl.conf eingestellt wurde.

Ich habe verschiedene Themen gefunden, die zeigen, dass es immer noch ein Problem ist, und mein Team und ich haben einige Optionen diskutiert, um dies zu beheben. Wir haben zwei mögliche Problemumgehungen gefunden.

Option 1: Die meisten Rhel-Initskripte stammen aus /etc/init.d/functions. Sie können dort die Einstellungen für ulimit ändern

Option 2: init behauptet, dass / etc / initscript jedes Mal vor dem Start von init bezogen wird (siehe http://linux.die.net/man/5/initscript) . Interessanterweise sagen sie, dass es dort ist, wo die Leute ulimit setzen können =)

Xarses
quelle
1

Eigenständiges Rezept-Snippet basierend auf dieser URL:

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

Rezept Schnipsel:

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
quelle
0

Meine Lösung bestand einfach darin, dies in unserem Kochrezept zu tun:

# 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

Dies bewirkt ulimit -l, dass das für alle Initskripte gesetzt wird, was in einigen Umgebungen unerwünscht sein kann, aber für meine in Ordnung ist.

In einer perfekten Welt würde ich das RPM so aktualisieren, dass es a enthält /etc/sysconfig/mysqld, und dort den gleichen Befehl ulimit -l einfügen.

jayofdoom
quelle
0

Ich bin mir nicht sicher, wie distro-spezifisch dies ist, aber ich habe gerade eine Erhöhung des Sicherheitslimits durch die Verwendung /etc/security/limits.d/20-somefile.confin Ubuntu eingeführt.

Anstatt eine vorhandene Datei ändern zu müssen, habe ich eine ERB-Vorlage in meinem Kochbuch, setze Standardattribute in einer Attributdatei und muss mich dann nicht um die Verwendung von Ruby-Blöcken mit "insert_line_if_no_match" -Stoff kümmern - das scheint etwas komplizierter und Das Rezept ist ein bisschen besser lesbar:

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

und dann ist dies meine vorlagendatei:

fs.filemax = <%= node[:mycookbook][:system_fs_filemax] %>
Brett
quelle
0

laut manpage ist ulimit veraltet. Sie müssen Setrlimit verwenden. Das Problem ist, dass es sich um einen Systemaufruf anstelle eines Bash-Befehls handelt.

Ich hatte dieses Problem mit dem Vorgesetzten und das habe ich herausgefunden. Wenn der Prozess keine Konfigurationsdatei hat, mit der Sie einen Aufruf von setrlimit () Systemaufruf tätigen können. Setzen Sie es mit ulimit in seinem /etc/init.d-Bash-Skript. Das ist das Service-Skript, das Ihren Prozess startet.

Wenn der Prozess eine Konfigurationsdatei hat, wie Supervisor d, können Sie diese Konfigurationsdatei verwenden, um die Anzahl der Dateien festzulegen, und den Prozess veranlassen, den Aufruf direkt an setrlimits () zu richten.

Supervisor: http://supervisord.org/configuration.html#supervisord-section-settings

TomcaT: http://www.jayway.com/2012/02/11/wie-wirklich-die--zu-viele-open-files-probleme-für-tomcat-in-ubuntu/ beheben

einarc
quelle
0

Wie in Artikel 253043 (Abonnement erforderlich) beschrieben, können Sie RedHat durch Hinzufügen entsprechender ulimit-Anweisungen ergänzen /etc/sysconfig/<service name>. Beispielsweise:

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

(Verwenden Sie die vorhandene Datei für Ihren Dienst anstelle von myServiceName.)

Für Daemons, die ohne das RedHat-Skript "sysconfig" gestartet werden, müssen Sie dem Daemon-Startskript die entsprechenden ulimit-Zeilen hinzufügen.

Steve Bonds
quelle
-1

Versuchen Sie, dies in der Datei /etc/sysctl.conf einzurichten

siupakabras
quelle
Dazu sind Konfigurationselemente erforderlich, die zu sysctl.conf gehören. Diese sind vorhanden. Sie müssen nur die ulimits ändern, damit auf diese riesigen Seiten zugegriffen werden kann.
Jayofdoom
-1

Ich habe tatsächlich ein privates Kochbuch geschrieben, mit dem ulimit für uns festgelegt wird und das ziemlich gut funktioniert. Für Ubuntu haben wir festgestellt, dass der folgende Trick erforderlich ist, wenn Sie eine globale ulimit-Einstellung wünschen:

Fügen Sie Ihrer gemeinsamen Sitzung Folgendes hinzu:

session required        pam_limits.so

und in der limit.conf muss folgendes vorhanden sein:

* soft  nofile  64000
* hard  nofile  65000

root  soft  nofile  64000
root  hard  nofile  65000

Der Root-Teil ist wichtig, da anscheinend einige Init-Skripte ohne ihn nicht korrekt funktionieren. Wir haben also ein Kochbuch, das das Folgende aufbaut und großartig funktioniert.

Eine weitere Option, die wir für Tomcat verwendet haben, war die Bereitstellung von Tomcat und das Überschreiben des Init-Skripts mit einer benutzerdefinierten Option, für die wir das ulimit festlegen und Tomcat neu starten würden. Das funktioniert super, ist aber etwas hackiger als das erste.

Ich hoffe diese Hilfe, und vielleicht kann ich eines Tages das Kochbuch, das wir intern haben, öffnen, da es ziemlich einfach ist, aber für andere wie Sie hilfreich sein könnte.

Zuhaib
quelle
Dies wird das Problem des Posters nicht lösen. Pam wird nur aufgerufen, wenn ein Benutzer eine Sitzung (Shell) öffnet. Da das Init-System unabhängig von Benutzersitzungen gestartet wird, gilt pam nicht.
Patrick