Как я могу максимизировать производительность mmap? - PullRequest
0 голосов
/ 12 апреля 2020

Я использую mmap для чтения / записи файла, который я использую в базе данных. Файл намного больше доступной оперативной памяти. Мой вариант использования однопроцессный, многопоточный. Как я могу максимизировать производительность доступа к памяти mmap'd?

Я предполагаю, что я должен использовать MAP_PRIVATE вместо MAP_SHARED, чтобы воспользоваться преимуществами копирования при записи.

Есть ли какое-либо преимущество в производительности при использовании MAP_POPULATE и / или MAP_NONBLOCK?

Есть ли еще какие-то вопросы, связанные с производительностью, которые я должен учитывать при использовании mmap?

1 Ответ

0 голосов
/ 12 апреля 2020

mmap управляет виртуальным адресным пространством процесса и PTE в ЦП и ОЗУ, и это недешевая операция.

Линус Торвальдс несколько раз отвечал на недостатки mmap:

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

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

MAP_LOCKED гарантирует, что страница не будет выгружена.

Вы также можете поэкспериментировать с MAP_HUGETLB и одним из флагов MAP_HUGE_2MB, MAP_HUGE_1GB. Если это подходит для вашего приложения, большие страницы минимизируют количество пропусков TLB .

Попробуйте связать потоки с одним и тем же узлом NUMA с помощью numactl, чтобы убедиться, что потоки обращаются только к локальной памяти NUMA. Например, numactl --membind=0 --cpunodebind=0 <app>.

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

...