Wie ändere ich die Anzahl der geöffneten Dateien unter Linux? [geschlossen]


194

Beim Ausführen meiner Anwendung wird manchmal eine Fehlermeldung angezeigt too many files open.

Ausführen von ulimit -aBerichten, dass das Limit 1024 beträgt. Wie erhöhe ich das Limit über 1024?

Bearbeiten ulimit -n 2048 führt zu einem Berechtigungsfehler.



Ich habe dies gerade auf Centos 7 (das gleiche auf RHEL) durchgesehen und einen Blog-Beitrag darüber verfasst, weil ich selbst mit all diesen Beiträgen so viele Probleme hatte: coding-stream-of-consciousness.com/2018/12/21/… . Oft müssen Sie zusammen mit geöffneten Dateien nproc erhöhen, das sich tatsächlich in mehreren Einstellungsdateien befindet ... und wenn Sie systemd / systemctl verwenden, das seine eigenen separaten Einstellungen hat. Es ist irgendwie verrückt.
John Humphreys - w00te

Wenn Sie VSCode unter Linux verwenden, kann diese Problemumgehung
Juri Sinitson

Antworten:


153

Sie könnten immer versuchen, eine ulimit -n 2048. Dadurch wird nur das Limit für Ihre aktuelle Shell zurückgesetzt, und die von Ihnen angegebene Anzahl darf das harte Limit nicht überschreiten

Jedes Betriebssystem verfügt in einer Konfigurationsdatei über ein anderes Hard-Limit-Setup. Beispielsweise kann das Limit für fest geöffnete Dateien unter Solaris beim Booten von / etc / system festgelegt werden.

set rlim_fd_max = 166384
set rlim_fd_cur = 8192

Unter OS X müssen dieselben Daten in /etc/sysctl.conf festgelegt werden.

kern.maxfilesperproc=166384
kern.maxfiles=8192

Unter Linux befinden sich diese Einstellungen häufig in /etc/security/limits.conf.

Es gibt zwei Arten von Grenzen:

  • Soft Limits sind einfach die derzeit erzwungenen Limits
  • Harte Grenzwerte markieren den Maximalwert, der durch Festlegen eines weichen Grenzwerts nicht überschritten werden kann

Weiche Grenzwerte können von jedem Benutzer festgelegt werden, während harte Grenzwerte nur von root geändert werden können. Limits sind eine Eigenschaft eines Prozesses. Sie werden vererbt, wenn ein untergeordneter Prozess erstellt wird. Daher sollten während der Systeminitialisierung in Init-Skripten systemweite Grenzwerte festgelegt werden und Benutzerbeschränkungen während der Benutzeranmeldung festgelegt werden, z. B. mithilfe von pam_limits.

Beim Starten der Maschine werden häufig Standardeinstellungen festgelegt. Auch wenn Sie Ihr ulimit in einer einzelnen Shell zurücksetzen, stellen Sie möglicherweise fest, dass es beim Neustart auf den vorherigen Wert zurückgesetzt wird. Möglicherweise möchten Sie Ihre Boot-Skripte nach den vorhandenen ulimit-Befehlen durchsuchen, wenn Sie die Standardeinstellung ändern möchten.


4
Kannst du mir sagen, wie man das in Windows benutzt?
Pritam

@hoyhoy Ich kann es ändern, 2048aber nicht als 4500warum? siehe dies
alhelal

@ GaneshKrishnan Was soll man in die von Ihnen erwähnten Linux-Dateien einfügen?
Aviral Sanjay

@Pritam Windows hat keine ulimit. Sie müssen angeben, was Sie verwenden (z. B. WSL, Cygwin).
Melebius

99

Wenn Sie Linux verwenden und den Berechtigungsfehler erhalten haben, müssen Sie das zulässige Limit in der Datei /etc/limits.confoder erhöhen /etc/security/limits.conf(wo sich die Datei befindet, hängt von Ihrer spezifischen Linux-Distribution ab).

Fügen Sie beispielsweise der Zeile die limits.confDatei hinzu, damit jeder auf dem Computer die Anzahl der geöffneten Dateien auf 10000 erhöhen kann.

* hard nofile 10000

Melden Sie sich dann ab und erneut bei Ihrem System an, und Sie sollten in der Lage sein:

ulimit -n 10000

ohne einen Berechtigungsfehler.


6
HINWEIS: Der Platzhalter gilt nicht für rootBenutzer. Sie müssen angeben, root hard nofile 10000ob Sie das rootLimit anpassen möchten .
Joshua Pinter

1
@JoshPinter Haha, ich habe gerade die letzten 3 Stunden damit verbracht, jedes einzelne Tutorial durchzugehen, um das zu ändern, ulimitund schließlich herausgefunden, dass ich als root angemeldet bin. Deshalb habe ich den 1024 immer wieder gesehen ulimit -a. Ich änderte die Wildpflege und fügte ein *Inneres hinzu limits.conf. Jetzt ist alles in Ordnung (ich benutze SSH-Schlüssel, keine Sorge: P) - Danke !!!
NiCk Newman

1
@NiCkNewman Ich bin froh, dass du darüber lachst! Das ist eine gute Eigenschaft eines Programmierers / Sysops. Ich habe das Gleiche getan und war nicht so gemütlich. Ich bin froh, dass es geholfen hat! :)
Joshua Pinter

ERGÄNZUNG: In diesem Verzeichnis finden Sie möglicherweise auch eine Konfiguration : /etc/security/limits.d/.
Waldemar Wosiński

2
Ich habe /etc/security/limits.conf zum ersten Mal geöffnet und festgestellt, dass dort alles kommentiert ist. Was ist dann der Standardwert von "hard nofile"?
Ka3ak

36

1) Fügen Sie die folgende Zeile hinzu /etc/security/limits.conf

webuser hard nofile 64000

Melden Sie sich dann als Webbenutzer an

su - webuser

2) Bearbeiten Sie die folgenden zwei Dateien für den Webbenutzer

append Bashrc und Bash_profile Datei , indem Sie

echo "ulimit -n 64000" >> .bashrc ; echo "ulimit -n 64000" >> .bash_profile

3) Melden Sie sich ab, dann wieder an und überprüfen Sie, ob die Änderungen korrekt vorgenommen wurden:

$ ulimit -a | grep open
open files                      (-n) 64000

Das ist es und sie boomt, boom boom.


9
Wenn Sie Ihre Zeile in der Datei "limits.conf" von "hart" in "weich" ändern, sollte dies der neue Standard sein und keine Änderungen an Bash-Profilen erfordern.
RishiD

Scheint, als würden Sie zusätzliche Schritte wiederholen. Das Festlegen von Grenzwerten allein entspricht dem Profil, gilt jedoch für alle Sitzungen.
Eddie

6

Wenn einige Ihrer Dienste in Grenzen geraten, ist es manchmal einfacher, entsprechende Befehle in das Init-Skript des Dienstes einzufügen. Zum Beispiel, wenn Apache Berichte erstellt

[alert] (11) Ressource vorübergehend nicht verfügbar: apr_thread_create: Worker-Thread kann nicht erstellt werden

Versuchen Sie zu setzen ulimit -s unlimitedin /etc/init.d/httpd. Dies erfordert keinen Neustart des Servers.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.