Warum sind Dateihandles eine knappe Ressource?

7

Ich bin der Meinung, dass jedes Tutorial, das ich in den Servereinstellungen zur Ressourcenverwaltung lese, damit beginnt, dass Dateihandles eine knappe Ressource sind. Daher sollten wir versuchen, die Liste der geöffneten Dateien auf ein Minimum zu beschränken.

Aber ich verstehe nicht wirklich, warum sie eine knappe Ressource sind. Ist ein Dateideskriptor nicht nur eine Zahl? Wie viel Status muss Linux beispielsweise pro geöffneter Datei verfolgen? Ist die Anzahl der geöffneten Dateien aufgrund von Speicherproblemen oder etwas völlig anderem begrenzt?

Beta
quelle
Keine Antwort, nur ein Link, wie man das Limit überprüft. Stackoverflow.com/questions/1356675/…
orion
Meiner Meinung nach hängt es vom menschlichen Verständnis ab, an welchem ​​Tag Sie Debugging und Sicherheit benötigen, wie ein Mensch 150000 geöffnete Dateien verstehen und debuggen kann, wenn Sie die geöffneten Dateien beherrschen. Sie können leicht feststellen, ob jemand Ihren Server so verwendet, wie er nicht sein sollte Verwenden Sie
Kiwy
1
Verwandte Frage: unix.stackexchange.com/questions/36841/…
Benubird

Antworten:

3

Geöffnete Dateien werden von einer Struktur im Kernelspeicher verwaltet, die die Inode-Referenz im Speicher verarbeitet.
Sie verfolgen auch den Öffnungsmodus der Datei, den Speicherort in der Datei sowie einen Cache.

AFAIK In den meisten UNIX / Linux-Systemen kann diese Struktur nicht ausgetauscht werden. Da die Speichergröße normalerweise um ein oder zwei Größenordnungen größer ist als der Speicher, ist es praktisch unmöglich, eine signifikante Menge der im Speicher befindlichen Dateien am zu öffnen gleiche Zeit.
Darüber hinaus verfügen nicht alle Plattformen über ein aktives Synchronisierungs-Deamon, sodass geschriebene Informationen manchmal nur im Cache gespeichert werden, bis eine Synchronisierung oder ein Schließen durchgeführt wird.

Darüber hinaus werden viele Dateihandles verwendet, ohne dass Sie als Entwickler davon Kenntnis haben, z. B. dynamisch geladene Bibliotheken und die Binärdateien für Programmdateien / Interpreter.

Didi Kohen
quelle
2

Einiges davon ist nur deshalb so, weil es, wie Sie sagten, "nur eine Zahl" ist - und wenn Sie gelegentlich eine höhere Zahl verwenden möchten, als Sie in einen (sagen wir) Ganzzahl-Datentyp einpassen können, müssen Sie diese verwenden ein größerer Datentyp für alle Deskriptoren ... z. 2 Bytes pro Deskriptor-ID anstelle von nur 1 Byte - und die Verdoppelung der Größe aller Ihrer Deskriptoren führen bald zu Speicherausfällen, die besser für Anwendungen als nur für das Betriebssystem verwendet werden könnten.

Es gibt auch viele andere Informationen, die mit den Deskriptoren verknüpft sind, sowie die Notwendigkeit, Listen zu führen, von denen verwendet wird und die kostenlos sind - es gibt Grenzen, wie groß diese Datenstrukturen sein können, um effektiv zu bleiben.

Baard Kopperud
quelle
2

Gemäß diesem Lernprogramm können Sie die maximale Anzahl geöffneter Dateihandles von einem Aufruf an abrufen cat /proc/sys/fs/file-max. Auf meinem System erhalte ich einen Wert von 797736, was ziemlich groß ist. Eine kurze Meldung ps -e|wc -lsagt mir, dass ungefähr 200 Prozesse ausgeführt werden, was bedeutet, dass jedes Programm ungefähr 4000 Dateihandles öffnen kann.

Dies ist jedoch ein globaler Wert - Sie können mithilfe von ulimit spezifischer werden. ulimit -aberichtet, dass ich maximal 1024 Dateihandles öffnen kann, was immer noch eine ziemlich große Zahl ist, obwohl nichts im Vergleich zum absoluten Maximum. Dies kann jedoch erhöht werden, wenn Sie es benötigen, und ist daher keine wirklich harte Grenze.

Also meine Schlussfolgerung? Dateihandles sind keine knappe Ressource. In den Tutorials möchten Sie nur sicherstellen, dass Sie Dateien nur öffnen, während Sie sie benötigen. Wenn Sie die Dateihandles offen lassen, kann dies andere Prozesse stören, die möglicherweise auch versuchen, mit den Dateien zu arbeiten, insbesondere wenn Sie sie beim Öffnen sperren .

Benubird
quelle