Warum ist die Anzahl der geöffneten Dateien in Linux begrenzt?

136

Im Moment weiß ich, wie man:

  • Suchlimit für offene Dateien pro Prozess: ulimit -n
  • Zählen Sie alle geöffneten Dateien von allen Prozessen: lsof | wc -l
  • Erhalte die maximal erlaubte Anzahl offener Dateien: cat /proc/sys/fs/file-max

Meine Frage ist: Warum gibt es in Linux ein Limit für offene Dateien?

Xanpeng
quelle
2
@ Rob ein wenig gegoogelt und findet , dass es eine ist Gabel Bombe , kann es verwendet werden , um offene Datei Grenze zu erklären?
Xanpeng
6
Nun, Prozesslimits und Datei-Limits sind wichtig, damit Dinge wie Gabelbomben einen Server / Computer nicht für alle Benutzer kaputt machen, sondern nur für den Benutzer, der dies tut und nur vorübergehend. Andernfalls könnte jemand auf einem gemeinsam genutzten Server eine Gabelbombe auslösen und sie für alle Benutzer, nicht nur für sich selbst, außer Gefecht setzen.
Rob
3
Nizza, das einige sehr nützliche Befehle zusammenfasst! : +1:
Joshua Pinter
7
@Rob, eine Fork-Bombe hat nichts damit zu tun, da das Dateilimit pro Prozess gilt und bei jedem Forken kein neues Datei-Handle geöffnet wird.
Psusi

Antworten:

86

Der Grund dafür ist, dass das Betriebssystem Speicher zum Verwalten jeder geöffneten Datei benötigt und der Speicher eine begrenzte Ressource ist - insbesondere bei eingebetteten Systemen.

Als Root-Benutzer können Sie die maximale Anzahl der geöffneten Dateien pro Prozess (über ulimit -n) und pro System (z echo 800000 > /proc/sys/fs/file-max. B. ) ändern .

Jofel
quelle
21
Es gibt auch einen Sicherheitsgrund: Wenn es keine Grenzen gäbe, könnte eine Userland-Software endlos Dateien erstellen, bis der Server ausfällt.
Coren
15
@Coren Die hier diskutierten Grenzwerte gelten nur für die Anzahl der Open File Handler. Da ein Programm auch Datei-Handler schließen kann, kann es beliebig viele Dateien erstellen, bis der gesamte verfügbare Speicherplatz voll ist. Um dies zu verhindern, können Sie Datenträgerkontingente oder getrennte Partitionen verwenden. Sie sind in dem Sinne wahr, dass ein Aspekt der Sicherheit darin besteht, die Erschöpfung von Ressourcen zu verhindern - und dafür gibt es Grenzen.
Jofel
1
@jofel Danke. Ich vermute, dass geöffnete Datei-Handles durch Instanzen der Strukturdatei dargestellt werden , und die Größe dieser Struktur ist ziemlich klein (Byte-Ebene). Kann ich also /.../file-maxeinen ziemlich großen Wert festlegen, solange der Speicher nicht belegt ist?
Xanpeng
7
@xanpeng Ich bin kein Kernel-Experte, aber soweit ich sehen kann, file-maxscheint die Standardeinstellung für RAM-Größe geteilt durch 10 KB zu sein. Da der pro Datei-Handler verwendete reale Speicher viel kleiner sein sollte ( struct fileplus einige treiberabhängige Speicher), scheint dies eine recht konservative Grenze zu sein.
Jofel
63

Bitte beachten Sie, dass lsof | wc -lviele doppelte Einträge zusammengefasst werden (gegabelte Prozesse können Dateizugriffsnummern usw. gemeinsam nutzen). Diese Zahl könnte viel höher sein als das eingestellte Limit /proc/sys/fs/file-max.

Gehen Sie folgendermaßen vor, um die aktuelle Anzahl der geöffneten Dateien aus der Sicht des Linux-Kernels zu ermitteln:

cat /proc/sys/fs/file-nr

Beispiel: Dieser Server hat 40096 von maximal 65536 offenen Dateien, obwohl lsof eine viel größere Anzahl meldet:

# cat /proc/sys/fs/file-max
65536
# cat /proc/sys/fs/file-nr 
40096   0       65536
# lsof | wc -l
521504
Grebneke
quelle
1
Da lsofviele Dateien zweimal oder öfter gemeldet werden /dev/null, können Sie beispielsweise Folgendes raten:lsof|awk '{print $9}'|sort|uniq|wc -l
Yvan
Sie können verwenden lsof|awk '!a[$NF]++{c++}END{print c}', um die nicht doppelte Anzahl der geöffneten Dateien abzurufen.
P ...
18

Ich denke, das hat hauptsächlich historische Gründe.

Ein Unix Dateideskriptor ist ein kleiner intWert, zurückgeführt durch Funktionen wie openund creatund weitergegeben read, write, closeund so weiter.

Zumindest in früheren Versionen von Unix war ein Dateideskriptor lediglich ein Index für ein Array von Strukturen mit fester Größe pro Prozess, wobei jede Struktur Informationen zu einer geöffneten Datei enthält. Wenn ich mich recht erinnere, haben einige frühe Systeme die Größe dieser Tabelle auf ungefähr 20 begrenzt.

Neuere Systeme haben höhere Grenzwerte, haben jedoch das gleiche allgemeine Schema weitgehend außerhalb der Trägheit beibehalten.

Keith Thompson
quelle
1
20 war die Solaris-Grenze für FILE-Datenstrukturen in der Sprache C. Die Anzahl der Dateihandles war immer größer.
Lothar
@Lothar: Interessant. Ich frage mich, warum sich die Grenzen unterscheiden würden. Angesichts der Funktionen filenound fdopenwürde ich erwarten, dass sie nahezu austauschbar sind.
Keith Thompson
Eine Unix-Datei ist mehr als nur das zurückgegebene Datei-Handle (int). Es gibt Festplattenpuffer und einen
Dateisteuerungsblock
@ChuckCottrill: Ja natürlich. Die meisten dieser Informationen müssen jedoch gespeichert werden, unabhängig davon, ob auf eine Datei über einen intDeskriptor oder über a zugegriffen wird FILE*. Wenn Sie über mehr als 20 Dateien geöffnet haben open(), würde dies fdopen()fehlschlagen?
Keith Thompson