Диск читает / ищет на общем Unix-сервере список каталогов - PullRequest
1 голос
/ 23 июля 2010

Я хочу лучше понять, как работает чтение с диска для простой команды ls и для команды cat * в определенной папке.

Насколько я понимаю, чтение с диска является "самой медленной" операцией.для сервера / любой машины, и веб-приложение, которое я имею в виду, будет очень часто делать вызовы ls и cat * для определенной папки.

Что такое " ball park "оценки операций чтения с диска для" ls "и для" cat * "для следующего числа записей?

                Disk reads for ls                     Disk reads for cat *
200
2,000
20,000
200,000

Каждая запись в файле представляет собой всего одну строку текста

1 Ответ

1 голос
/ 23 июля 2010

Сложно ответить - возможно, поэтому он так долго не получал никакого ответа.

Частично ответ будет зависеть от файловой системы - разные файловые системы будут давать разные ответы. Однако выполнение «ls» требует чтения страниц, содержащих записи каталога, а также чтения страниц, содержащих inode, идентифицированные в каталоге. Сколько страниц - и, следовательно, сколько дисков читает - зависит от размера страницы и от размера каталога. Если вы думаете с точки зрения 6-8 байтов служебной информации на имя файла, вы не будете слишком далеко. Если имена имеют длину около 12 символов, у вас есть около 20 байт на файл, а если ваши страницы имеют размер 4096 байт (4 КБ), то у вас есть около 200 файлов на страницу каталога.

Если вы просто перечислили имена, а не другие атрибуты с помощью ls, все готово. Если вы перечислите атрибуты (размер и т. Д.), То и иноды должны быть прочитаны. Я не уверен, насколько велик современный инод. Однажды пару десятилетий назад в примитивной файловой системе он занимал по 64 байта; возможно, с тех пор оно выросло. На странице будет несколько инодов, но вы не можете быть уверены, что нужные иноды являются смежными (смежными друг с другом на диске). В худшем случае вам может понадобиться прочитать другую страницу для каждого отдельного файла, но на практике это маловероятно. К счастью, ядро ​​хорошо разбирается в кэшировании страниц диска, поэтому вряд ли придется перечитывать страницу. Мы не можем сделать правильное предположение о плотности соответствующих записей inode; это может быть, возможно, 4 inode на страницу, но любая оценка от 1 до 64 может быть правдоподобной. Следовательно, вам может потребоваться прочитать 50 страниц для каталога, содержащего 200 файлов.

Когда дело доходит до 'cat' для файлов, система должна найти индекс для каждого файла, так же как и с 'ls'; Затем он должен прочитать данные для файла. Если данные не хранятся в самом inode (я думаю, что это было возможно в некоторых файловых системах с крупноформатными inode и достаточно маленькими телами файлов), вам придется читать по одной странице на файл - если частичные страницы для маленьких файлов не сгруппированы вместе на одной странице (опять же, я помню, что слышал, что это может произойти в некоторых файловых системах).

Итак, для директории с 200 файлами:

  • Обычный ls: 1 страница
  • ls -l: 51 страница
  • cat *: 251 страница

Я не уверен, что буду доверять цифрам очень далеко - но вы можете увидеть данные, которые необходимы для улучшения оценок.

...