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
не передает ваши изменения в файл или в сопоставления других процессов этого файла.