Вопрос про кеш файловой системы - PullRequest
1 голос
/ 04 апреля 2009

Когда я читаю большой файл в файловой системе, может ли кеш повысить скорость операция?

Я думаю, что есть два разных ответа:

1.Да. Поскольку кэш может выполнять предварительную выборку, улучшается производительность.

2.No. Потому что скорость чтения из кэша выше, чем скорость чтения из диск, в конце мы можем обнаружить, что кеш не помогает, поэтому скорость чтения также скорость чтения с диска.

Какой из них правильный? Как я могу засвидетельствовать ответ?

[править]

И еще один вопрос:

Что я не уверен, так это что при включении кеша полоса пропускания используется для

1.prefetch

2. Предварительная выборка и чтение

Какой из них правильный?

Хотя, если вы выключите кеш, полоса диска просто используется для чтения.

Если я отключаю кэш и получаю произвольный доступ к диску, сопоставимо ли время, необходимое для последовательного чтения с включенным кэшем?

Ответы [ 6 ]

4 голосов
/ 04 апреля 2009

1 определенно правильно. Операционная система может извлекать данные с диска в кэш, пока ваш код обрабатывает уже полученные данные. Да, диск все еще может быть узким местом - но вам не придется читать, обрабатывать, читать, обрабатывать, читать, обрабатывать, но читать + обрабатывать, читать + обрабатывать, читать + обрабатывать. Например, предположим, что у нас есть обработка, которая занимает половину времени чтения. Представляя время перехода вниз по странице, мы могли бы выполнять такие действия без предварительной выборки:

Read
Read
Process
Read
Read
Process
Read
Read
Process

Принимая во внимание, что с предварительной загрузкой, это оптимизировано для:

Read
Read
Read     Process
Read
Read     Process
Read
         Process

По сути, общее время будет «время чтения всего файла + время обработки последнего фрагмента данных» вместо «время чтения всего файла + время обработки всего файла».

Тестировать это сложно - вам понадобится операционная система, в которой вы можете настроить или отключить кэш. Другой альтернативой является изменение способа открытия файла - например, в .NET, если вы открываете файл с помощью FileOptions.SequentialScan , кеш с большей вероятностью будет делать правильные вещи. Попробуйте с и без этой опции.

Это в основном говорит о предварительной загрузке - общее кэширование (сохранение данных даже после их доставки в приложение) - это другой вопрос, и, очевидно, это большой выигрыш, если вы хотите использовать одни и те же данные более одного раза. Есть также «что-то среднее», когда приложение запросило только небольшой объем данных, но диск прочитал целый блок - ОС не выполняет активную предварительную выборку блоков, которые не были запрошены, но может кэшировать весь блок, так что если приложение затем запрашивает больше данных из того же блока, оно может вернуть эти данные из кэша.

3 голосов
/ 04 апреля 2009

В общем случае с кешем будет быстрее. Некоторые моменты для рассмотрения:

  • Данные на диске организованы в виде поверхностей (так называемых головок), дорожек и блоков. Диску требуется некоторое время, чтобы установить считывающие головки, чтобы вы могли начать чтение дорожки. Теперь вам нужно пять блоков от этой дорожки. К сожалению, вы запрашиваете тогда в другом порядке, чем они появляются на физическом носителе. Кэш очень поможет, читая всю дорожку в память (гораздо больше блоков, чем вам нужно), а затем переиндексируйте их (когда голова начнет читать, вероятно, она будет в любом месте на дорожке, а не на начало первого блока). Без этого вам придется подождать, пока первый блок дорожки не будет вращаться под головкой, и начать читать -> время чтения дорожки будет эффективно удвоено. Таким образом, с кешем вы можете читать блоки дорожки в любом порядке, и вы начинаете читать, как только голова достигает дорожки.

  • Если файловая система довольно заполнена, ОС начнет сжимать ваши данные в различные пустые места. Представьте, что блок 1 находится на дорожке 5, блок 2 - на дорожке 7, блок 3 - снова на дорожке 5. Без кеша вы потеряете много времени для позиционирования головы. С кешем дорожка 5 считывается, сохраняется в оперативной памяти, когда голова переходит на дорожку 7, и когда вы запрашиваете блок 3, вы сразу получаете его.

  • Для больших файлов требуется много метаданных, а именно, где находятся блоки данных для файла. В этом случае кеш будет поддерживать эти данные в процессе чтения файла, что избавит вас от лишних усилий.

  • Кэш позволит другим программам эффективно получать доступ к своим данным при загрузке диска. Так что общая производительность будет лучше. Это очень важно, когда вторая программа начинает писать во время чтения. В этом случае кэш будет собирать некоторые записи до того, как прервет ваши чтения. Кроме того, большинство программ считывают данные, обрабатывают их и затем записывают обратно. Без кеша программа либо пошла бы по-своему, либо ей пришлось бы реализовать собственную схему кеширования, чтобы избежать перегрузки головы.

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

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

3 голосов
/ 04 апреля 2009

Первый ответ правильный.

Диск имеет фиксированную базовую производительность, но эта фиксированная базовая производительность отличается в разных обстоятельствах. Вы получаете лучшую реальную производительность с диска, когда вы читаете длинные участки данных - например, когда ты кешируешь впереди. Таким образом, кэширование позволяет приводу добиться подлинного улучшения своей реальной производительности.

1 голос
/ 04 апреля 2009

Jon Skeet имеет очень интересный тест с .NET по этой теме. Основной результат состоял в том, что предварительная выборка помогает, тем больше обработки на единицу чтения вы должны сделать.

0 голосов
/ 04 апреля 2009

Еще один момент: есть вероятность, что часто используемые файлы будут в кеше, прежде чем кто-либо даже начнет читать один из них.

0 голосов
/ 04 апреля 2009

Если файлы больше вашей памяти, то это определенно не поможет.

...