Auf Linux-Computern werden die Systemressourcen unter den Benutzern aufgeteilt. Wenn Sie versuchen, mehr als Ihren fairen Anteil zu nutzen, erreichen Sie eine Obergrenze. Sie riskieren auch, andere Benutzer oder Prozesse zu blockieren.
Gemeinsam genutzte Systemressourcen
Neben Milliarden anderer Aufgaben ist der Kernel eines Linux-Computers ständig damit beschäftigt, zu überwachen, wer wie viele endliche Systemressourcen wie RAM und Prozessorzyklen nutzt. Ein Mehrbenutzersystem erfordert ständige Aufmerksamkeit, um sicherzustellen, dass Personen und Prozesse nicht mehr Systemressourcen beanspruchen als nötig.
Es ist zum Beispiel nicht fair, wenn jemand so viel CPU-Zeit beansprucht, dass der Computer für alle anderen langsam erscheint. Selbst wenn Sie die einzige Person sind, die Ihren Linux-Computer benutzt, gibt es Grenzen für die Ressourcen, die Ihre Prozesse nutzen können. Schließlich sind Sie nur einer von vielen Benutzern.
Einige Systemressourcen sind wohlbekannt und offensichtlich, wie z. B. der Arbeitsspeicher, die Prozessorzyklen und der Platz auf der Festplatte. Aber es gibt viele, viele andere Ressourcen, die überwacht werden und für die jeder Benutzer – oder jeder Prozess, der zu einem Benutzer gehört – eine definierte Obergrenze hat. Eine davon ist die Anzahl der Dateien, die ein Prozess gleichzeitig geöffnet haben darf.
Wenn Sie jemals die Fehlermeldung “Too many files open” in einem Terminalfenster gesehen oder in Ihren Systemprotokollen gefunden haben, bedeutet dies, dass die Obergrenze erreicht wurde und der Prozess keine weiteren Dateien mehr öffnen darf.
Es sind nicht nur die Dateien, die Sie geöffnet haben
Es gibt auf Systemebene eine Grenze für die Anzahl der geöffneten Dateien, die Linux verwalten kann. Es ist eine sehr große Anzahl, wie wir gleich sehen werden, aber es gibt trotzdem eine Grenze. Jeder Benutzerprozess hat eine Zuweisung, die er nutzen kann. Sie erhalten jeweils einen kleinen Teil des gesamten Systems, der ihnen zugeteilt wird.
Was tatsächlich zugeteilt wird, ist eine bestimmte Anzahl von Dateimanagern. Jede Datei, die geöffnet wird, benötigt einen Dateimanager. Selbst bei recht großzügigen Zuweisungen auf Systemebene können Datei-Handles schneller genutzt werden, als Sie sich vorstellen können.
Linux abstrahiert fast alles, um es als Datei erscheinen zu lassen. Manchmal handelt es sich nur um einfache Dateien. Aber auch andere Aktionen, wie das Öffnen eines Verzeichnisses, verwenden eine Dateihandle. Linux verwendet spezielle Blockdateien als eine Art Treiber für Hardwaregeräte. Zeichenspezifische Spezialdateien sind sehr ähnlich, werden aber häufiger mit Geräten verwendet, die ein Durchsatzkonzept haben, wie Pipes und serielle Schnittstellen.
Blockspezialdateien verarbeiten Datenblöcke auf einmal und Zeichenspezialdateien verarbeiten jedes Zeichen separat. Auf diese beiden Spezialdateien kann man nur mit Hilfe von Dateihandles zugreifen. Bibliotheken, die von einem Programm verwendet werden, verwenden einen Dateimanager, Streams verwenden Dateimanager und Netzwerkverbindungen verwenden Dateimanager.
Die Abstraktion all dieser unterschiedlichen Anforderungen, damit sie als Dateien erscheinen, vereinfacht die Schnittstellenbildung mit ihnen und ermöglicht es, dass Dinge wie Piping und Streams funktionieren.
Sie können sehen, dass Linux hinter den Kulissen Dateien öffnet und Dateimanager verwendet, nur um sich selbst auszuführen – ohne Rücksicht auf Ihre Benutzerprozesse. Die Anzahl der geöffneten Dateien ist nicht nur die Anzahl der Dateien, die Sie geöffnet haben. Fast alles im Betriebssystem verwendet Dateigriffe.
Dateigriff-Grenzen
Die maximale Anzahl von Dateigriffen im System kann mit diesem Befehl gesehen werden.
cat /proc/sys/fs/file-max
Dieser Befehl gibt eine groteske Zahl von 9,2 Quintillionen zurück. Dies ist der theoretische Höchstwert des Systems. Es ist der größte mögliche Wert, den Sie in einer vorzeichenbehafteten 64-Bit-Ganzzahl unterbringen können. Ob Ihr armer Computer tatsächlich so viele geöffnete Dateien gleichzeitig verarbeiten kann, ist eine ganz andere Frage.
Auf Benutzerebene gibt es keinen expliziten Wert für die maximale Anzahl an geöffneten Dateien, die Sie haben können. Man kann sie aber ungefähr berechnen. Um die maximale Anzahl an Dateien zu ermitteln, die einer Ihrer Prozesse öffnen kann, können wir den Befehl ulimit
mit der Option -n
(offene Dateien) verwenden.
ulimit -n
Und um herauszufinden, wie viele Prozesse ein Benutzer maximal haben kann, verwenden wir ulimit
mit der Option -u
(Benutzerprozesse).
ulimit -u
Durch Multiplikation von 1024 und 7640 erhalten wir 7 823 360. Natürlich werden viele dieser Prozesse bereits von Ihrer Desktop-Umgebung und anderen Hintergrundprozessen verwendet. Dies ist also ein weiteres theoretisches Maximum, das Sie realistischerweise nie erreichen werden.
Die wichtige Zahl ist die Anzahl der Dateien, die ein Prozess öffnen kann. Standardmäßig liegt sie bei 1024. Es ist wichtig zu beachten, dass das gleichzeitige 1024-malige Öffnen derselben Datei gleichbedeutend mit dem gleichzeitigen Öffnen von 1024 verschiedenen Dateien ist. Sobald Sie alle Ihre Dateimanager verwendet haben, sind Sie fertig.
Es ist möglich, die Anzahl der Dateien, die ein Prozess öffnen kann, anzupassen. Es gibt eigentlich zwei Werte, die Sie beachten müssen, wenn Sie diese Anzahl anpassen. Der erste ist der aktuelle Wert oder der Wert, auf den Sie versuchen, ihn zu setzen. Das ist die sogenannte weiche Grenze. Es gibt auch eine obere Grenze, die der höchste Wert ist, auf den Sie die weiche Grenze bringen können.
Die Betrachtungsweise ist folgende: Die weiche Grenze ist eigentlich der “aktuelle Wert” und die obere Grenze ist der höchste Wert, den der aktuelle Wert erreichen kann. Ein normaler Benutzer, der nicht root ist, kann sein Softlimit auf einen beliebigen Wert erhöhen, bis er sein Hardlimit erreicht hat. Ein Root-Benutzer kann seine Hardgrenze erhöhen.
Um die aktuellen Soft- und Hardgrenzen zu sehen, verwenden Sie ulimit
mit den Optionen -S
(Soft) und -H
(Hard) sowie der Option -n
(offene Dateien).
ulimit -Sn
ulimit -Hn
Um eine Situation zu schaffen, in der wir sehen können, dass das weiche Limit angewendet wird, haben wir ein Programm erstellt, das wiederholt Dateien öffnet, bis es fehlschlägt. Es wartet dann auf einen Tastenanschlag, bevor es auf alle Dateimanager verzichtet, die es verwendet hat. Das Programm heißt open-files
.
./open-Files
Es öffnet 1021 Dateien und scheitert, wenn es versucht, die Datei 1022 zu öffnen.
1024 minus 1021 ist gleich 3. Was ist mit den anderen drei Dateimanagern passiert? Sie wurden für die Streams STDIN
, STDOUT
, und STDERR
verwendet. Sie werden automatisch für jeden Prozess erstellt. Sie haben immer die Dateideskriptorwerte 0, 1 und 2.
Wir können sie sehen, indem wir den Befehl lsof
mit der Option -p
(Prozess) und der Prozess-ID des Programms open-files
verwenden. Praktischerweise druckt sie ihre Prozess-ID im Terminalfenster aus.
lsof -p 11038
Natürlich kann es in einer realen Situation vorkommen, dass Sie nicht wissen, welcher Prozess gerade alle Dateimanager übernommen hat. Um Ihre Nachforschungen zu beginnen, können Sie diese punktierte Befehlsfolge verwenden. Sie wird Ihnen die fünfzehn produktivsten Benutzer von Dateihandles auf Ihrem Computer anzeigen.
lsof | awk '{ print $1 " " $2; }' | sort -rn | uniq -c | sort -rn | head -15
Um mehr oder weniger Einträge zu sehen, stellen Sie den Parameter -15
auf den Befehl head
ein. Sobald Sie den Prozess identifiziert haben, müssen Sie feststellen, ob er rebelliert und zu viele Dateien öffnet, weil er außer Kontrolle geraten ist, oder ob er die Dateien wirklich braucht. Wenn er sie wirklich braucht, müssen Sie sein Limit für die Manipulation von Dateien erhöhen.
Softlimit erhöhen
Wenn wir das Softlimit erhöhen und unser Programm erneut ausführen, sollten wir sehen, dass es mehr Dateien öffnet. Wir werden den Befehl ulimit
und die Option -n
(Dateien öffnen) mit einem numerischen Wert von 2048 verwenden. Dies wird das neue Softlimit sein.
ulimit -n 2048
Diesmal haben wir 2045 Dateien erfolgreich geöffnet. Wie erwartet sind es drei Dateien weniger als 2048, was auf die Dateimanager zurückzuführen ist, die für STDIN
, STDOUT
, und STDERR
verwendet werden.
Permanente Änderungen vornehmen
Die Erhöhung des Softlimits wirkt sich nur auf die aktuelle Shell aus. Öffnen Sie ein neues Terminalfenster und überprüfen Sie das Softlimit. Sie werden feststellen, dass es sich um den alten Standardwert handelt. Aber es gibt eine Möglichkeit, global einen neuen Standardwert für die maximale Anzahl geöffneter Dateien, die ein Prozess haben kann, festzulegen, der dauerhaft ist und Neustarts überlebt.
Veraltete Ratschläge empfehlen Ihnen oft, Dateien wie “/etc/sysctl.conf” und “/etc/security/limits.conf”. Auf systemd-basierten Distributionen funktionieren diese Ausgaben jedoch nicht konsistent, insbesondere bei grafischen Anmeldesitzungen.
Die hier gezeigte Technik ist der Weg, wie Sie dies auf systemd-basierten Distributionen tun können. Es gibt zwei Dateien, mit denen wir arbeiten müssen. Die erste ist die Datei “/etc/systemd/system.conf”. Wir müssen sudo
.
sudo gedit /etc/systemd/system.conf
Suchen Sie nach der Zeile, die die Zeichenfolge “DefaultLimitNOFILE” enthält. Entfernen Sie die Raute “#” am Anfang der Zeile und ändern Sie die erste Zahl so, dass sie dem entspricht, was Sie für Ihr neues Software-Limit für Prozesse wünschen. Wir haben uns für 4096 entschieden. Die zweite Zahl in dieser Zeile ist das strikte Limit. Wir haben sie nicht geändert.
Speichern Sie die Datei und schließen Sie den Editor.
Wir müssen diesen Vorgang an der Datei “/etc/systemd/user.conf” wiederholen.
sudo gedit /etc/systemd/user.conf
Nehmen Sie die gleichen Anpassungen an der Zeile mit der Zeichenfolge “DefaultLimitNOFILE.”
Speichern Sie die Datei und schließen Sie den Editor. Sie müssen Ihren Computer entweder neu starten oder den Befehl systemctl
mit der Option daemon-reexec
verwenden, damit systemd
erneut ausgeführt wird und die neuen Einstellungen übernimmt.
sudo systemctl daemon-reexec
Das Öffnen eines Terminalfensters und die Überprüfung des neuen Limits sollten den neuen Wert anzeigen, den Sie festgelegt haben. In unserem Fall ist es 4096.
ulimit -n
Wir können überprüfen, ob es sich um einen tatsächlichen und funktionierenden Wert handelt, indem wir unser Programm zum Löschen von Dateien erneut starten.
./open-Files
Das Programm kann die Datei 4094 nicht öffnen, was bedeutet, dass 4093 Dateien geöffnet worden sind. Das ist unser Erwartungswert, 3 weniger als 4096.
Alles ist eine Datei
Deshalb ist Linux so abhängig von Dateimanagern. Jetzt wissen Sie, wie Sie Ihre Quote erhöhen können, wenn sie Ihnen allmählich ausgeht.