Angenommen, Sie beginnen mit einer leeren Tabelle, dh Sie haben überhaupt nicht auf das Dateisystem zugegriffen. Angenommen, Sie führen stat aus ("/ some / dir / file"). Zuerst muss der Kernel die Datei finden, die in technischer Hinsicht als Inode bezeichnet wird. Zunächst wird im Superblock des Dateisystems gesucht, in dem der Inode des Stammverzeichnisses gespeichert ist. Dann öffnet es das Stammverzeichnis, findet "some", öffnet das, findet "dir" usw. und findet schließlich den Inode für die Datei.
Dann müssen Sie die Inode-Daten tatsächlich lesen. Nach dem ersten Lesen wird dies auch im RAM zwischengespeichert. Ein Lesevorgang muss also nur einmal erfolgen.
Stellen Sie sich die HD wie einen alten Plattenspieler vor. Wenn Sie sich mit der Nadel an der richtigen Stelle befinden, können Sie die Daten während der Rotation schnell lesen. Wenn Sie jedoch an einen anderen Ort, der als "Suchen" bezeichnet wird, umziehen müssen, tun Sie etwas ganz anderes. Sie müssen den Arm physisch bewegen und warten, bis sich der Plattenteller dreht, bis sich die richtige Stelle unter der Nadel befindet. Diese Art der physischen Bewegung ist von Natur aus langsam, so dass die Suchzeiten für Festplatten ziemlich lang sind.
Also, wann suchen wir? Das hängt natürlich vom Dateisystem-Layout ab. Dateisysteme versuchen, Dateien nacheinander zu speichern, um die Leseleistung zu erhöhen, und sie versuchen im Allgemeinen auch, Inodes für ein einzelnes Verzeichnis nebeneinander zu speichern, aber es hängt alles von Dingen wie dem Zeitpunkt des Schreibens der Dateien, der Fragmentierung des Dateisystems usw. ab In diesem Fall wird bei jedem Status einer Datei ein Suchvorgang ausgeführt, und bei jedem Öffnen der Datei wird ein zweiter Suchvorgang ausgeführt. Deshalb dauert es so lange, bis nichts zwischengespeichert ist.
Einige Dateisysteme sind besser als andere. Eine Defragmentierung kann hilfreich sein. Sie können einige Dinge in Apps tun. Zum Beispiel sortiert GIO die empfangenen Inodes von readdir (), bevor er angibt, dass die Inode-Nummer in irgendeiner Beziehung zur Festplattenreihenfolge steht (was im Allgemeinen der Fall ist), wodurch zufällige Suchvorgänge hin und her minimiert werden.
Eine wichtige Sache ist es, Ihren Datenspeicher und Ihre Apps so zu gestalten, dass die Suche minimiert wird. Dies ist zum Beispiel der Grund, warum das Lesen von / usr / bin in Nautilus langsam ist, da die darin enthaltenen Dateien im Allgemeinen keine Erweiterung haben, für die jeweils ein Magic Sniffing durchgeführt werden muss. Also müssen wir jede Datei öffnen => eine Suche pro Datei => slooooow. Ein weiteres Beispiel sind Apps, die Informationen in vielen kleinen Dateien speichern, wie es früher bei gconf der Fall war. Auch dies ist eine schlechte Idee. In der Praxis gibt es meines Erachtens sowieso nicht viel zu tun, außer zu versuchen, die Latenzen zu verbergen.