Ändern Sie ulimit (offene Dateien) eines bestimmten Prozesses

27

Ist es möglich, die weiche und harte Grenze eines bestimmten Prozesses zu ändern ?

In meinem Fall lautet mein Prozess mongodund 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?
Prüfung
quelle
Haben Sie diese wertvolle Information gelesen? docs.mongodb.org/manual/reference/ulimit
tink
Ja, ich habe alles auswendig gelernt. Ich bin mir nicht sicher, ob mir etwas fehlt, aber auf dieser Seite erfahren Sie nur, wie Sie die Details anzeigen können. Sie müssen nur ulimit -n <Wert> schreiben ...
test

Antworten:

29

Ein Prozess kann seine Grenzen über den setrlimit(2)Systemaufruf ändern . Wenn Sie laufen ulimit -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. Der ulimitBefehl hat den getrlimit(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 64wü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 ruft setrlimit()entsprechend auf.

Um das mongodb'sLimit für den Deskriptor für geöffnete Dateien zu ändern , müssen Sie ulimit -n 2048eine Shell ausführen (oder eine beliebige Anzahl, die Ihr Kernel zulässt). Sie würden dann diese Shell verwenden, um zu starten mongodb. mongodbWü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.confund ausführen sysctl -p. Schauen Sie sich den Wert des fs.file-maxParameters in an /etc/sysctl.conf.

Bruce Ediger
quelle
Was für eine großartige Erklärung! Vielen Dank. Ich werde es gleich versuchen!
Test
Diese Antwort hat mir sehr geholfen, aber das Problem ist jetzt, dass die harte Grenze 2048 ist, und dies ist in meinem Fall nicht genug. 1) Wie finde ich das Limit, das mein Kernel zulässt? 2) Kann die HARD LIMIT jetzt geändert werden? Danke noch einmal!
Test
@test - Ich habe das harte Limit noch nie angehoben. Fand dies: blog.samat.org/2011/04/05/… und dieses wiki.brekeke.com/wiki/Increase-File-Descriptor-Limit-on-Linux Sie sagen dasselbe.
Bruce Ediger
18

Um die Grenzen eines laufenden Prozesses zu ändern, können Sie den Utility-Befehl verwenden prlimit.

prlimit --pid 12345 --nofile=1024:1024

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/

user7610
quelle
Das hat mir den Tag gerettet, danke. Ich hatte einen langen laufenden Python-Prozess, der too many files openFehler verursachte. Ihre Antwort löste mein Problem, ohne den Prozess anzuhalten.
Visionscaper
1

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:

$ cat /etc/security/limits.d/mysql.conf
@mysql           soft    nofile          100000
@mysql           hard    nofile          200000

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.

Todd Lyons
quelle
Beste und praktischste Lösung.
Nelaaro
0

Wie erkennt der Befehl das Limit des Prozesses, den ich ändern werde? Ändert dies nicht das Open File Limit des gesamten Systems?

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.

user7610
quelle