Warum wird die Größe des ext4-Cache-Verzeichnisses nicht erreicht?


2

Wieder räume ich meinen Desktop auf, weil mir der Festplattenspeicher ausgeht und jedes du -sh ~Mal, wenn ich anrufe , dauert es sehr lange, die aktuelle Größe des Verzeichnisses zu berechnen.

Aus meiner Sicht kann ich keinen Grund erkennen, warum das ext4-Dateisystem die Informationen über die Verzeichnisgröße nicht zwischenspeichert und aktualisiert, wenn eine Datei erstellt / gelöscht wird. Die Informationen würden dann dem System und schließlich dem Benutzer zugänglich gemacht. Natürlich müsste es die Daten der Verzeichnisgröße über den Verzeichnisbaum verbreiten, aber ich kann mir keine Situation vorstellen, in der es auf einem normalen Linux-Desktop zu Problemen kommen würde.

Wo habe ich das falsch verstanden?


Der Kernel speichert einige Daten in seinem Dateisubsystem zwischen. Einzelne Dateisysteme (wie Ext4) könnten mehr tun. Aber die Metadaten auf Ihrer Festplatte passen wahrscheinlich nicht in den verfügbaren Arbeitsspeicher ....
Basile Starynkevitch

Es kann auch auf der Festplatte zwischengespeichert werden.

Nein, der Cache auf der Festplatte wird mit der Firmware auf der Festplatte und einigen SATA-Befehlen wie behandelt TRIM. Der Kernel kann nur SATA-Befehle an die Festplatte senden.
Basile Starynkevitch

Und Sie können Ext4 (das ist freie Software) jederzeit nach Ihren Wünschen verbessern oder sogar ein neues Dateisystem implementieren. Nutzen Sie den Vorteil, dass GNU / Linux freie Software ist.
Basile Starynkevitch

1
Ich meinte eigentlich Cache als echte Daten auf Festplatte. Genau wie der Name des Verzeichnisses dort gespeichert ist, verstehe ich nicht, warum es nicht so groß ist. @BasileStarynkevitch, der Grund, warum ich es nicht getan habe, ist, dass ich absolut keine Ahnung von der FS-Entwicklung habe. Ich versuche nur zu verstehen.

Antworten:


4

Ein einfacher Cache würde nicht funktionieren. In einem Cache wird überprüft, ob Sie bereits die Antwort haben, und nur erneut verarbeitet, wenn Sie dies nicht tun. In diesem Fall würde jedoch ein einzelner fehlender Eintrag andere unbrauchbar machen. Daher müssten alle Verzeichnisgrößen ständig aktualisiert werden.

Unterschätzen Sie auch nicht die möglichen Auswirkungen Ihres Vorschlags. Als das Journaling von Dateisystemen neu war, gab es viel Widerstand, weil die Aktualisierung des Journals zu teuer war. Auch die meisten Dateisysteme erlauben Optionen wie noatime, nodiratimeund relatimedass diese Art von medatata Aktualisierung reduzieren. Beachten Sie, dass alle diese (Journale und Zeitaktualisierungen) zeitlich gebunden sind. Sie alle benötigen eine bestimmte Anzahl von Blockzugriffen (und werden normalerweise durch die erweiterte E / A-Planung „ausgeblendet“). Die Aktualisierung der Größe jedes Verzeichnisses im Pfad bedeutet jedoch, dass ein unbekannter Wert vorliegt Anzahl der Zugriffe.

Schließlich gibt es in POSIX-Dateisystemen kein echtes "enthaltendes Verzeichnis". Ein Dateieintrag in einem Verzeichnis verweist auf eine Inode (die Plattenstruktur, auf der die Dateiinformationen gespeichert sind), es gibt jedoch keinen Verweis von der Inode zurück auf das Verzeichnis. Dies ermöglicht die Funktion "Feste Verbindung", bei der mehr als ein Eintrag (normalerweise in verschiedenen Verzeichnissen) auf den gleichen Inode verweist. Selbst wenn Sie eine Liste von Verzeichnissen geführt haben, die auf den Inode verweisen, multiplizieren Sie die (bereits große) Anzahl von Aktualisierungen. Schlimmer noch, jetzt müssen Sie den Überblick behalten, wenn Sie bereits jedes Verzeichnis aktualisiert haben, da Sie irgendwann in der Kette einen gemeinsamen Vorfahren erhalten, der nicht das Doppelte der aktualisierten zählen sollte. Oder sollte es? Vielleicht müssen Sie zwei Größen in jedem Verzeichnis behalten , eine, die alle "echten" Dateien zählt.

Es scheint doch nicht so nützlich zu sein.


Sie haben dort ein sehr interessantes Thema angesprochen - die gemeinsamen Vorfahren, die ich als Symlinks verstehe. Daran habe ich nie gedacht.

5
Die geteilten Vorfahren sind keinesymlink(2)link(2)
symbolischen

0

Es gibt noch einen anderen Grund. duDies wird nicht berücksichtigt, wenn sich ein Teil des Subsystems auf einem anderen Volume befindet, das in dem von Ihnen gemessenen Verzeichnis angehängt ist.

Selbst wenn die Nutzung pro Volume ausgewertet duwürde , würde es daher nicht eingesetzt. Auf der anderen Seite dfnutzt solche Informationen ....

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.