Вызывает ли фрагментация отображения виртуальной памяти проблемы с производительностью? - PullRequest
0 голосов
/ 24 января 2019

У меня есть приложение, в котором я начинаю с создания большого анонимного отображения (порядка 4 МБ), каждое из которых использует системный вызов linux mmap.

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

Может ли это вызвать проблемы с производительностью из-за фрагментации таблицы трансляции виртуальной памяти или ядро ​​использует умную стратегию, чтобы избежать этого? Могу ли я не возражать против фрагментации отображения виртуальной памяти?

1 Ответ

0 голосов
/ 24 января 2019

Краткий ответ: На самом деле, если только вы случайно не выделяете тонны и тонны несмежных областей минимальной зернистости (т.е. 4096 байт).


Длинный ответ: Вид,

На современных архитектурах у вас есть несколько уровней карт виртуальной памяти (или таблиц страниц, какой бы термин вы ни выбрали), с 64-битными архитектурами обычно имеет 4 уровня карт памяти.для 48-разрядного адресного пространства (будущие расширения Intel добавят еще один уровень, который позволит фрагментировать страницу размером 4096 байт в страницы размером 256 байт).Каждый раз, когда вы выделяете страницу в области, где еще нет карты, ядру приходится выделять новый (обычно физически смежный; обратите внимание на акцент, это довольно дорогая операция в относительном выражении) кусок памятидержать карту перевода для этого региона для этого пространства памяти.Я буду избегать специфичных для арки терминов и просто назову их L0 -> L1 -> L2 -> L3, где L0 будет корневой картой, представляющей это пространство виртуальной памяти.Это будет зависеть от степени детализации размера страницы и от разных операционных систем или архитектур (например, в Linux есть суперстраницы).

Теперь, если ваше новое отображение находится на уровне L3 и имеет таблицу страниц L3, новое отображение будетпросто включите изменение записи в этом регионе, чтобы указать перевод.Если таблицы страниц L3 нет, то должна быть выделена новая таблица страниц L3 и внесена в таблицу страниц L2.И так далее, вплоть до таблицы страниц L0.

Несколько быстрых заметок:

  • Каждый раз, когда изменяется отображение, обычно существует TLB (Translation Lookaside Buffer; аппаратный кеш, используемыйMMU для VM-> Phys translations) штраф за недействительность (ручной или автоматический).
  • Некоторые страницы могут не нуждаться во всех 4 этапах перевода, уровень перевода имеет определенный размер, поэтому суперстраница обычно является страницейкоторый, например, использует запись таблицы страниц L2 для сопоставления всего куска этого пространства виртуальной машины с физическим пространством (это означает, что требуется только 3 уровня трансляции).
  • Различные архитектуры используют разные методы для уменьшения штрафа TLBуничтожение (т. е. PCID в x86_64; на самом деле, некоторые меры по снижению производительности, такие как KPTI, приводили к снижению производительности без него).
  • Говоря о падении, некоторые диапазоны памяти могут иметь отображения ядра или батута или векторы исключений.Те зарезервированы ОС.В 64-битных системах pre-Spectre / Meltdown ядро ​​обычно отображало себя в каждой таблице страниц.У многих процессоров ARM есть специальный механизм, называемый таблицами с разделенными страницами (TTBR0 / TTBR1; Базовый регистр таблиц перевода 0/1).
  • Одним из примеров выше является Linux VDSO (виртуальный динамический общий объект)это отображение, созданное ядром.Аналогом Darwin (OSX / iOS) является commpage (страница Common).Обычно это код, доступный только для чтения, который используется каждым отдельным процессом в системе, и текущее время (для уменьшения стоимости системного вызова gettimeofday может прочитать его из VDSO или использовать батут VDSO для чтения).
  • Конечно, все вышеперечисленное варьируется в зависимости от архитектуры и используемой вами ОС, а также от версии ОС, которую вы используете, поскольку менеджеры виртуальной памяти часто используют различные методы для предотвращения фрагментации. Однако, если вы запрашиваете много небольших фиксированных сопоставлений наугад, да, вы эффективно обойдете многие из них, что приведет к проблемам с производительностью.
...