Существует ли ограничение на количество записей огромных страниц, которые могут храниться в TLB? - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь проанализировать повышение производительности сети, которое получают виртуальные машины, когда они используют огромные страницы. Для этого я настроил гипервизор на наличие нескольких гигантских страниц 1G (36), изменив командную строку grub и перезагрузив компьютер, и при запуске виртуальных машин я убедился, что огромные страницы передаются виртуальным машинам. При запуске 8 виртуальных машин (каждая с 2 огромными страницами по 1 ГБ) и выполнении тестов пропускной способности сети между ними было обнаружено, что пропускная способность была значительно ниже, чем при работе без огромных страниц. Это заставило меня задуматься, не связано ли это с количеством огромных страниц, которые я использовал. Существует ли ограничение на число гигантских страниц 1G, на которое можно ссылаться с помощью TLB, и если да, то оно меньше, чем ограничение для страниц обычного размера? Откуда я знаю эту информацию. В этом сценарии я использовал систему Ivy Bridge и с помощью команды cpuid увидел что-то вроде

cache and TLB information (2):
  0x63: data TLB: 1G pages, 4-way, 4 entries
  0x03: data TLB: 4K pages, 4-way, 64 entries
  0x76: instruction TLB: 2M/4M pages, fully, 8 entries
  0xff: cache data is in CPUID 4
  0xb5: instruction TLB: 4K, 8-way, 64 entries
  0xf0: 64 byte prefetching
  0xc1: L2 TLB: 4K/2M pages, 8-way, 1024 entries

Означает ли это, что я могу иметь только 4 отображения гигантских страниц в TLB в любое время?

1 Ответ

0 голосов
/ 08 ноября 2018

Да, конечно. Наличие неограниченного верхнего предела числа записей TLB потребовало бы неограниченного количества физического пространства в кристалле ЦП.

Каждый TLB в каждой архитектуре имеет верхний предел количества записей, которые он может содержать.

Для случая x86 это число меньше, чем вы, вероятно, ожидали: оно равно 4.
Это было 4 на вашем Мосте Плюща и еще 4 на моем Каби-Лейк, четыре поколения спустя.

Стоит отметить, что 4 записи охватывают 4 ГБ ОЗУ (4x1 ГБ), этого вполне достаточно для работы в сети, если правильно используется .
Наконец, TLB - это ресурсы ядра , каждое ядро ​​имеет свой набор TLB.
Если вы отключите SMT (например, Intel Hyper Threading) или назначите оба потока на ядре одной и той же виртуальной машине, виртуальные машины не будут конкурировать за записи TLB.

Однако каждая виртуальная машина может кэшировать не более 4хC огромных записей страниц, где C - количество ядер, выделенных для этой виртуальной машины.
Способность виртуальной машины полностью использовать эти записи зависит от того, как хост-операционная система, гипервизор и гостевая ОС работают вместе, а также от структуры памяти гостевого приложения, представляющего интерес (страницы, совместно используемые ядрами, имеют дублированные записи TLB в каждом ядре ).
Трудно (почти невозможно?) Прозрачно использовать страницы объемом 1 ГБ, я не уверен, как гипервизор и виртуальная машина будут использовать эти страницы - я бы сказал, что вам нужна конкретная поддержка для этого, но я не уверен.

Как отметил Питер Кордес , страницы объемом 1 ГБ используют одноуровневый TLB (а в Skylake, по-видимому, также имеется TLB второго уровня с 16 записями для страниц объемом 1 ГБ). Пропуск в TLB 1 ГБ приведет к просмотру страницы, поэтому очень важно, чтобы все задействованное программное обеспечение использовало код, учитывающий страницы.

...