Как память отображает файл имеет значительное повышение производительности За стандартные системные звонки ввода-вывода?

Думаю, проблема в root (hd0,0). Вы сказали, что это sdb, поэтому попробуйте отодвинуть корневой каталог ... и установите для него root (hd1,0)

7
12.10.2018, 00:55
2 ответа

Отображение памяти в файл напрямую позволяет избежать копирования буферов, которое происходит с вызовами read()и write(). Вызовы read()и write()включают указатель на буфер в адресном пространстве процесса, где хранятся данные. Ядро должно копировать данные в/из этих мест. Использование mmap()сопоставляет файл с адресным пространством процесса, поэтому процесс может обращаться к файлу напрямую, и никаких копий не требуется.

Также нет накладных расходов на системный вызов при доступе к файлу с отображением памяти после начального вызова, если файл загружается в память при начальном mmap(). Если страница отображаемого файла отсутствует в памяти, доступ вызовет ошибку и потребует от ядра загрузить страницу в память. Чтение большого блока с read()может быть быстрее, чем mmap()в таких случаях, если mmap()будет генерировать значительное количество ошибок при чтении файла. (Можно заранее сообщить ядру с помощью madvise(), чтобы ядро ​​могло загружать страницы заранее перед доступом ).

Дополнительные сведения можно найти в соответствующем вопросе о переполнении стека:mmap ()и чтении блоков

17
27.01.2020, 20:14

Во-первых, в большинстве операций ввода-вывода характеристики базового оборудования хранения доминируют над производительностью. Плохо -сконфигурированный массив RAID5 из двадцати -девяти S -L -O -W 5400 об/мин SATA-дисков на медленной системе с недостатком памяти -с использованием S/W RAID с несоответствующими размерами блоков и неправильно выровненные файловые системы будут давать вам низкую производительность по сравнению с правильно настроенным и выровненным SSD RAID 1+0 на высокопроизводительном контроллере -, несмотря на любую настройку программного обеспечения, которую вы можете попробовать.

Но единственный способ mmap()может быть значительно быстрее, если вы читаете одни и те же данные более одного раза и данные, которые вы читаете, не выгружаются между чтениями из-за нехватки памяти.

Шаги карты памяти:

  1. Системный вызов для создания виртуальных отображений -очень дорого
  2. Процесс обращается к памяти в первый раз, вызывая ошибку страницы -дорого (и может потребоваться повторение в случае выгрузки страницы)
  3. Процесс действительно читает память

Если процесс выполняет шаги 2 и 3 только один раз для каждого считанного бита данных или данные удаляются из памяти из-за нехватки памяти, mmap()будет медленнее.

read()шаги:

  1. Системный вызов копирует данные с диска в кэш страницы (может быть или не быть ошибка страницы, данные могут уже быть в кэше страницы, что приводит к пропуску этого)
  2. Данные, скопированные из страничного кэша в память процесса (, могут иметь или не иметь ошибку страницы)

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

Затем read()используется прямой ввод-вывод:

  1. Системный вызов для чтения с диска в память процесса. (может вызывать или не вызывать ошибку страницы)

Чтение прямого ввода-вывода почти невозможно превзойти по производительности -. Но вы должны действительно настроить шаблоны ввода-вывода под ваше оборудование, чтобы максимизировать производительность.

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

Стало быть, доступ к отображаемым файлам в памяти -быстрее? Может быть, может быть, это не так.

Это зависит от вашего шаблона доступа (s ). Вместе с вашим оборудованием и всем остальным на вашем пути ввода-вывода (s ).

Если вы передаете в потоковом режиме видеофайл размером 30 ГБ на машине с 4 ГБ ОЗУ и никогда не возвращаетесь и не перечитываете какие-либо данные, память -, отображающая файл, вероятно, худшая . ] способ прочитать это.

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

Огромное преимущество памяти -отображаемых файлов

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

14
27.01.2020, 20:14

Теги

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