Arhn - архитектура программирования

Почему операции чтения выполняются намного быстрее после записи файлов с использованием ОС и дисковых буферов?

Я записываю около сотни файлов размером 50 МБ каждый последовательно в каталог на моем диске, используя CreateFile() и WriteFile(). На втором этапе содержимое этих файлов считывается с использованием CreateFile() и ReadFile().

Я заметил несколько странных вещей:
Если я пропущу FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH при записи файлов, чтение займет заметно много времени (обычно сотни миллисекунд). Однако, когда я не передаю эти флаги (а использую вместо них FlushFileBuffers()), запись происходит примерно с той же скоростью, но чтение этих файлов после их записи происходит невероятно быстро (менее 20 миллисекунд на файл!).

Как это возможно? Как флаги, переданные при записи 5000 МБ данных, влияют на чтение позже? Кэширует ли диск все 5 ГБ в своей кэш-памяти?


Ответы:


1

Когда вы передаете FILE_FLAG_NO_BUFFERING, вы говорите системе не помещать данные в свой дисковый кеш. Затем, когда вы читаете данные, система должна получить данные с диска.

Если вы опустите FILE_FLAG_NO_BUFFERING, система может поместить данные в свой дисковый кеш. И поэтому, когда вы впоследствии читаете данные, они могут быть прочитаны непосредственно из памяти, что быстрее, чем с диска.

Из https://support.microsoft.com/en-us/kb/99794:

Флаг FILE_FLAG_WRITE_THROUGH для CreateFile () заставляет любые записи, сделанные в этот дескриптор, записываться непосредственно в файл без буферизации. Данные кешируются (хранятся в кеш-памяти диска); однако он по-прежнему записывается непосредственно в файл. Этот метод позволяет выполнять операцию чтения этих данных для удовлетворения запроса на чтение из кэшированных данных (если они все еще существуют), вместо того, чтобы выполнять чтение файла для получения данных. Вызов записи не возвращается, пока данные не будут записаны в файл. Это относится и к удаленной записи - сетевой перенаправитель передает серверу флаг FILE_FLAG_WRITE_THROUGH, чтобы сервер знал, что не следует удовлетворять запрос на запись, пока данные не будут записаны в файл.

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

Вы можете найти эту статью Раймонда Чена, представляющую интерес: В настоящее время мы используя FILE_FLAG_NO_BUFFERING и FILE_FLAG_WRITE_THROUGH, но мы бы хотели, чтобы наш WriteFile работал еще быстрее. Отрывок:

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

Во-первых, перестаньте передавать эти два флага!

Комбинация этих двух флагов в основном означает: «Дайте мне максимально медленную производительность ввода-вывода!» потому что они заставляют все операции ввода-вывода сразу же проходить на физический носитель.

25.01.2016
  • Не будет ли это означать увеличение нагрузки на оперативную память, поскольку в ОЗУ необходимо кэшировать 5 ГБ? Я не вижу заметных изменений в ОЗУ во время выполнения моей программы. 25.01.2016
  • Как вы измеряете, сколько оперативной памяти используется дисковым кешем? 25.01.2016
  • Я использовал стандартные инструменты мониторинга производительности Windows для измерения ОЗУ. Я ожидал увидеть некоторую разницу, если кэшируется 5 ГБ. Я только что отредактировал свой вопрос, чтобы добавить, что я использую FlushFileBuffers() после каждой записи, и мне интересно, будут ли в Windows эти файлы в кеше даже после использования FlushFileBuffers(). 25.01.2016
  • Думаю, мой ответ точный. Если вы позволите системе кэшировать данные, она сможет доставить их быстрее. Вот для чего нужен кеш. Я не уверен, чего вы пытаетесь достичь с помощью этих флагов. 25.01.2016
  • Я согласен, и я приму ваш ответ, но он все еще не объясняет повышение после использования FlushFileBuffers(). Согласно Microsoft: данные файла в системном файловом кэше записываются на диск с интервалами, определяемыми операционной системой, и память, ранее использовавшаяся этими файловыми данными, освобождается - это называется очисткой кеша. [...] Процесс также может принудительно очистить открытый им файл, вызвав функцию FlushFileBuffers. Я что-то неправильно понял? Где я не прав? 25.01.2016
  • Я не вижу в вашем вопросе сравнения perf с FlushFileBuffers и без него при опускании FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH. Очистка буферов не приведет к удалению данных из кеша. 25.01.2016
  • Аааааааааааааааааааааааааааааааааак в, значит, буфер операционной системы все еще не такой, как дисковый кеш? Это многое объясняет! Спасибо! 25.01.2016
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..