Вызывает ли stat / lstat несуществующий файл поиск диска?

1193
Mika Vatanen

При поиске файла библиотеки из нужной папки мое приложение в настоящее время делает несколько lstat для возможных местоположений местоположений. Теперь мне интересно, вызывают ли эти lstat (приложение является веб-службой, таким образом, может быть сотни lstat в секунду) всегда дополнительный поиск диска, или эти запросы кэшируются?

Система Linux (ядро 2.6.) С файловой системой на основе ext4.

Часть PHP-CGI strace:

PHP-CGI strace:

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 ответ на вопрос

0
ktf

Каким-то образом ОС нуждается в информации, есть ли файл там или нет. Очевидно, он должен прочитать в списке папок всех родительских папок, где вы ищете файл.

Но не волнуйся слишком сильно. После прочтения эта информация останется в кеше, поэтому ей не придется каждый раз искать на диске - только если по какой-то причине кешированная информация была отброшена (возможно, ОС нуждалась в этом месте в памяти для более свежих данных) ОС придется снова смотреть на диск.

Если вы хотите доказать это себе, попробуйте это. Перезагрузите систему, чтобы очистить кеш. Затем выполните команду «найти». Смотрите, как ваш диск ищет. Как только команда завершится, запустите команду снова. У них объем дисковой активности будет заметно ниже. Anthony Giorgio 13 лет назад 1

Похожие вопросы