Verursacht stat / lstat in einer nicht vorhandenen Datei eine Laufwerkssuche?

1242
Mika Vatanen

Bei der Suche nach einer Bibliotheksdatei aus einem rechten Ordner führt meine Anwendung derzeit einige lstat-Werte für die möglichen Speicherorte aus. Jetzt frage ich mich, ob diese lstat's (Anwendung ist ein Web-Service, dadurch können hunderte von lstat's pro Sekunde sein können), dass immer eine zusätzliche Festplatte gesucht wird, oder werden diese zwischengespeichert?

System ist Linux (2.6. Kernel) mit ext4-basiertem Dateisystem.

Teil der PHP-CGI-Reihe:

PHP-CGI-Reihe:

lstat("/home/www/mydomain.com/inc/myLibrary/php/classes/myClass.php", 0x7fffa805a710) = -1 ENOENT (No such file or directory) lstat("/usr/share/php/inc/myLibrary/php/classes/myClass.php", 0x7fffa805a710) = -1 ENOENT (No such file or directory) getcwd("/home/www/mydomain.com/misc", 4096) = 32 lstat("/home/www/mydomain.com/misc/./inc/myLibrary/php/classes/myClass.php", 0x7fffa805a710) = -1 ENOENT (No such file or directory) lstat("/home/www/mydomain.com/inc/inc/myLibrary/php/classes/myClass.php", 0x7fffa805a710) = -1 ENOENT (No such file or directory) lstat("/home/www/mydomain.com/inc/myLibrary/php/classes/myClass.php", 0x7fffa805a660) = -1 ENOENT (No such file or directory) lstat("/usr/share/php/inc/myLibrary/php/classes/myClass.php", 0x7fffa805a660) = -1 ENOENT (No such file or directory) getcwd("/home/www/mydomain.com/misc", 4096) = 32 lstat("/home/www/mydomain.com/misc/./inc/myLibrary/php/classes/myClass.php", 0x7fffa805a660) = -1 ENOENT (No such file or directory) lstat("/home/www/mydomain.com/inc/inc/myLibrary/php/classes/myClass.php", 0x7fffa805a660) = -1 ENOENT (No such file or directory) getcwd("/home/www/mydomain.com/misc", 4096) = 32 lstat("/home/www/mydomain.com/misc/inc/myLibrary/php/classes/myClass.php", 0x7fffa805c7c0) = -1 ENOENT (No such file or directory) lstat("/home/www/mydomain.com/misc/inc/myLibrary/php/classes", 0x7fffa805c600) = -1 ENOENT (No such file or directory) lstat("/home/www/mydomain.com/misc/inc/myLibrary/php", 0x7fffa805c450) = -1 ENOENT (No such file or directory) lstat("/home/www/mydomain.com/misc/inc/myLibrary", 0x7fffa805c2a0) = -1 ENOENT (No such file or directory) lstat("/home/www/mydomain.com/misc/inc", 0x7fffa805c0f0) = -1 ENOENT (No such file or directory) open("/home/www/mydomain.com/misc/inc/myLibrary/php/classes/myClass.php", O_RDONLY) = -1 ENOENT (No such file or directory)   /* FILE FOUND */  open("/home/www/mydomain.com/inc/classes/myClass.php", O_RDONLY) = 7 fstat(7, ) = 0 fstat(7, ) = 0 fstat(7, ) = 0 fstat(7, ) = 0 mmap(NULL, 7734, PROT_READ, MAP_SHARED, 7, 0) = 0x7f2225786000 stat("/home/www/mydomain.com/inc/classes/myClass.php", ) = 0 
1

1 Antwort auf die Frage

0
ktf

Irgendwie benötigt das Betriebssystem die Informationen, ob die Datei vorhanden ist oder nicht. Offensichtlich muss es in der Ordnerliste aller übergeordneten Ordner lesen, in denen Sie nach der Datei suchen.

Aber mach dir keine Sorgen. Nach dem Einlesen bleiben diese Informationen in den Caches, so dass sie nicht jedes Mal auf der Festplatte gesucht werden müssen - nur, wenn die zwischengespeicherten Informationen verworfen wurden (möglicherweise benötigte das Betriebssystem diesen Speicherplatz für neuere Daten). Das Betriebssystem muss erneut auf die Festplatte schauen.

Wenn Sie sich dies beweisen wollen, probieren Sie es aus. Starten Sie das System neu, damit der Cache gelöscht wird. Führen Sie dann einen Befehl "Suchen" aus. Beobachten Sie, wie Ihre Festplatte sucht. Sobald der Befehl beendet ist, führen Sie den Befehl erneut aus. Ihre Festplattenaktivität ist deutlich geringer. Anthony Giorgio vor 13 Jahren 1