Ist es möglich, die weiche und harte Grenze eines bestimmten Prozesses zu ändern ?
In meinem Fall lautet mein Prozess mongod
und viele Webressourcen fordern mich auf, einfach Folgendes auszuführen:
ulimit -n <my new value>
Meine aktuellen Gedanken:
- Wie erkennt der Befehl das Limit des Prozesses , den ich ändern werde? Ändert dies nicht das Open File-Limit des gesamten Systems?
- Ich vermute, dass dieser Befehl nur die weiche Grenze ändert. Gibt es also eine Möglichkeit, das Hard Limit zu erhöhen?
Antworten:
Ein Prozess kann seine Grenzen über den
setrlimit(2)
Systemaufruf ändern . Wenn Sie laufenulimit -n
, sollten Sie eine Zahl sehen. Dies ist die derzeitige Begrenzung der Anzahl offener Dateideskriptoren (einschließlich Dateien, Sockets, Pipes usw.) für den Prozess. Derulimit
Befehl hat dengetrlimit(2)
Systemaufruf ausgeführt , um den aktuellen Wert zu ermitteln.Hier ist der entscheidende Punkt: Ein Prozess erbt sein aktuelles Limit vom übergeordneten Prozess. Wenn Sie also ausgeführt
ulimit -n 64
würden, würden Sie das Limit der offenen Dateideskriptoren dieser Shell auf 64 setzen. Jeder Prozess, den diese Shell startet, würde dasselbe Limit haben, es sei denn, dieser neue Prozess ruftsetrlimit()
entsprechend auf.Um das
mongodb's
Limit für den Deskriptor für geöffnete Dateien zu ändern , müssen Sieulimit -n 2048
eine Shell ausführen (oder eine beliebige Anzahl, die Ihr Kernel zulässt). Sie würden dann diese Shell verwenden, um zu startenmongodb
.mongodb
Würde als untergeordneter Prozess das (große) Limit für offene Dateideskriptoren erben.Um das Systemlimit für offene Dateien zu ändern, das eher der Summe aller offenen Dateideskriptoren für Prozesse entspricht, müssen Sie Änderungen vornehmen
/etc/sysctl.conf
und ausführensysctl -p
. Schauen Sie sich den Wert desfs.file-max
Parameters in an/etc/sysctl.conf
.quelle
Um die Grenzen eines laufenden Prozesses zu ändern, können Sie den Utility-Befehl verwenden
prlimit
.Was das intern macht, ist anzurufen
setrlimit(2)
. Die Manpage von prlimit sollte einige nützliche Aufrufbeispiele enthalten.Quelle: https://sig-io.nl/posts/run-time-editing-of-limits-in-linux/
quelle
too many files open
Fehler verursachte. Ihre Antwort löste mein Problem, ohne den Prozess anzuhalten.Zumindest unter Linux scheinen die meisten Distributionen pam zur Authentifizierung zu verwenden. Ein Modul, das mit pam geliefert wird, ist das Limits- Modul. Zitat aus der README für pam_limits:
The pam_limits PAM module sets limits on the system resources that can be obtained in a user-session. Users of uid=0 are affected by this limits, too.
Infolgedessen können Sie pro Benutzer, pro Gruppe und Standardlimits in beiden Kategorien Fest (Root legt dies fest und der Prozess kann keine höheren Anforderungen stellen) und Weichlimits festlegen. Die Soft-Limits sind normalerweise niedriger als die Hard-Limits und die App kann sie nach oben erhöhen, bis sie das Hard-Limit erreicht.
In Ihrem Fall können Sie die Grenzwerte für diesen Benutzer oder diese Gruppe erhöhen, wenn der Prozess, den Sie als regulärer Benutzer ausführen möchten, die Grenzwerte erhöhen soll. Als Beispiel habe ich einige mysql-cron-Jobs auf einigen Servern, die das Öffnen zusätzlicher Datei-Handles erfordern. Deshalb habe ich Folgendes festgelegt:
Es muss nichts neu gestartet werden. Wenn Sie sich an diesen Benutzer wenden, können Sie sofort sehen, dass die neuen Grenzwerte wirksam werden.
Eine weitere Möglichkeit, die Sie auf einem typischen von RedHat abgeleiteten System ausführen können, besteht darin, den gewünschten ulimit-Aufruf in das Skript / etc / sysconfig / $ SERVICE einzufügen. Das Init-Skript von apache heißt beispielsweise /etc/init.d/httpd und gibt die Konfigurationsdatei / etc / sysconfig / httpd aus, wenn sie gefunden wird. Ich habe festgestellt, dass dies einfacher zu handhaben ist, als das Init-Skript selbst zu bearbeiten, da Init-Skripte aktualisiert werden, wenn das RPM aktualisiert wird. Sysconfig-Dateien werden jedoch nur aktualisiert, wenn sie nicht vom Standard geändert werden.
quelle
Der Befehl ändert das Limit für den aktuellen Prozess (Ihre Shell) und jeden untergeordneten Prozess (alles, was Sie anschließend von der Shell ausführen).
Prozesse sind in einem Baum organisiert. Jeder Prozess hat einen übergeordneten Prozess (der ihn aufgerufen hat). Der Prozess 1, init, ist ein besonderer Prozess, da er ein eigener übergeordneter Prozess ist. Tools wie htop oder top können Ihnen Prozesse anzeigen, die als Baum von Eltern und Kindern angezeigt werden.
quelle