Legen Sie das maximale Dateilimit für einen laufenden Prozess fest

27

Ich habe einen langen Prozess, der irgendwann die maximale Anzahl offener Dateien erreichen wird. Ich weiß, wie ich das ändern kann, nachdem es fehlgeschlagen ist, aber gibt es eine Möglichkeit, dies für den laufenden Prozess über die Befehlszeile zu ändern?

kāgii
quelle

Antworten:

28

Auf neueren Kerneln (2.6.32+) unter CentOS / RHEL können Sie dies zur Laufzeit mit / proc / <pid> / limits ändern:

cd /proc/7671/
[root@host 7671]# cat limits  | grep nice
Max nice priority         0                    0                    
[root@host 7671]# echo -n "Max nice priority=5:6" > limits
[root@host 7671]# cat limits  | grep nice
Max nice priority         5                    6                    
Sig-IO
quelle
Das regiert! Hatte keine Ahnung, dass du in die limits-Datei schreiben könntest.
15.
4
funktioniert nicht für mich auf Ubuntu 12.04
Poma
5
Dies funktioniert auf meinem 3.2-Kernel nicht . Ich vermute, Ihre Distribution hat einen speziellen inoffiziellen Patch dafür, da ich keine Spur dieses Patches in der Datei fs / proc / base.c des Kernels sehe .
Totor
Könnte sein ... Ich weiß, dass es in RHEL / CentOS-Kerneln vorhanden ist. Es scheint in Debian-Kerneln nicht vorhanden zu sein.
Sig-IO
2
'setprlimit' ist der zukunftssichere und empfohlene Weg, siehe nächste Antwort
Sig-IO
26

Wie hier dokumentiert , prlimitkönnen Sie mit dem mit util-linux 2.21 eingeführten Befehl die Grenzen laufender Prozesse lesen und ändern.

Dies ist ein Nachfolger des beschreibbaren /proc/<pid>/limitsKernels, der nicht in den Mainline-Kernel integriert wurde. Diese Lösung sollte funktionieren.

Wenn Sie noch nicht haben prlimit(1), können Sie den Code zu einer minimalistischen Version in der prlimit(2)Manpage finden .

Sig-IO
quelle
2
+1 für die minimalistische Version in der Manpage!
Totor
Warnung: "memcached" schlägt fehl, wenn Sie "nolimit" für den Prozess ändern, nachdem er auf ein Limit gestoßen ist. Es ist nicht immer eine gute Idee, die beschreibbaren Grenzwerte zu verwenden
John
2

Sie können ulimit man ulimitmit der Option -n versuchen, aber die Mag-Seite erlaubt es den meisten Betriebssystemen nicht, dies festzulegen .

Mit können Sie eine systemweite Beschränkung für Dateibeschreibungen festlegen sysctl -w fs.file-max=Nund die Änderungen nach dem Start in beibehalten/etc/sysctl.conf

Ich würde jedoch auch vorschlagen, den Prozess zu untersuchen, um festzustellen, ob wirklich so viele Dateien zu einem bestimmten Zeitpunkt geöffnet sein müssen und ob Sie tatsächlich einige Dateien schließen und dabei effizienter sein können.

Oneiroi
quelle
Die offene Datei ist ein Fehler, aber ich konnte es nicht herausfinden. Während ich dies gerne tun würde, stürzt die Produktion mittags regelmäßig ab.
kāgii
ulimitWendet keine Einstellungen auf laufende Prozesse an .
try-catch-finally
0

Der Prozess kann seine eigenen Soft-Limits ändern, wenn er dazu programmiert ist (oder wenn Sie es schaffen, ihn zu hacken), aber seine Hard-Limits können nicht erhöht werden, es sei denn, er verfügt über die CAP_SYS_RESOURCE-Funktion. Sie können die Grenzwerte zur Laufzeit in überprüfen /proc/$pid/limits.

Tobu
quelle