Существует ли ограничение на количество записей огромных страниц, которые можно хранить в TLB?

Я пытаюсь проанализировать прирост производительности сети, который получают виртуальные машины, когда они используют огромные страницы. Для этого я настроил гипервизор на несколько огромных страниц 1G (36), изменив командную строку grub и перезагрузившись, а при запуске виртуальных машин я убедился, что огромные страницы передаются виртуальным машинам. При запуске 8 виртуальных машин (каждая с 2 огромными страницами 1G) и проведении тестов пропускной способности сети между ними было обнаружено, что пропускная способность была значительно ниже, чем при работе без огромных страниц. Это заставило меня задуматься, не связано ли это с количеством огромных страниц, которые я использовал. Существует ли ограничение на количество огромных страниц размером 1 Гб, на которые можно ссылаться с помощью 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 сопоставления огромных страниц 1G в TLB в любое время?


person Sai Malleni    schedule 07.11.2018    source источник
comment
Добро пожаловать в Stackoverflow. Хотя ваш вопрос задан в сценарии виртуализации и с участием разных процессоров, на ваши вопросы по существу отвечает этот вопрос: stackoverflow.com/questions/40649655/. По сути, да, TLB процессора имеет выделенное пространство для различных типов записей с очень ограниченным пространством для огромных страниц.   -  person Brian    schedule 07.11.2018
comment
Да, вы нашли способ создать очень плохую локацию для огромных страниц. Большинство рабочих нагрузок, которые выполняют много обращений ядра к памяти, имеют больше обращений в пределах одной и той же огромной страницы 1G. (Память пользовательского пространства в Linux обычно использует огромные страницы размером 2 МБ, когда она вообще использует анонимные огромные страницы). В Haswell, например, записи TLB размером 2M и 4k могут попасть в кеш жертвы TLB 2-го уровня, но, по-видимому, записи 1G не могут, если 7-cpu.com/cpu/Haswell.html полностью соответствует действительности.   -  person Peter Cordes    schedule 08.11.2018


Ответы (1)


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

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

Для корпуса x86 это число меньше, чем вы, вероятно, ожидали: оно равно 4.
В вашем Ivy Bridge было 4, а в моем Kaby Lake — четыре поколения спустя.

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

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

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

person Margaret Bloom    schedule 08.11.2018
comment
Стоит отметить, что, по крайней мере, согласно 7-cpu.com/cpu/Haswell.html, кеш жертвы TLB 2-го уровня не содержит 1G записей TLB в Haswell, поэтому, если у вас есть промахи, они должны исходить от странички. Но у Skylake есть TLB 2-го уровня с 16 записями для страниц 1G для резервного копирования TLB 1-го уровня с 4 записями. 7-cpu.com/cpu/Skylake.html. - person Peter Cordes; 08.11.2018
comment
Спасибо @PeterCorder, приятно знать и иметь ответ. - person Margaret Bloom; 08.11.2018