Выделяет ли VirtualBox огромные страницы, специально предназначенные для ОС?

Я страдаю от серьезных проблем с производительностью при использовании VirtualBox и ВМ с большим объемом оперативной памяти. во время тяжелых задач процессора после нескольких дней выполнения">это и тот уже другой вопрос. Из того, что я тестировал до сих пор, существует прямая связь с объемом памяти, назначенной виртуальной машине: проблема возникает с 48 ГБ ОЗУ и не возникает ни с 6 ГБ, ни с включением параметра largepages виртуальной машины.

Это интересно, потому что этот параметр не включен по умолчанию на Linux, документы говорить только об улучшении ~5%, а не о том, что оно вообще необходимо для приличной производительности при каком-то размере ОЗУ, и, кроме того, есть обстоятельства, при которых largepages полностью игнорируется VirtualBox.

00:00:42.866663 PGMR3PhysAllocateLargePage: выделение больших страниц занимает слишком много времени (последняя попытка 103 мс; количество тайм-аутов 11); ЗАПРЕЩАТЬ

https://www.virtualbox.org/attachment/ticket/16518/VBox_16518_5112.log#L1154

Поэтому я попытался разобраться, что эта функция на самом деле изменяет в управлении памятью VirtualBox, и пришел к выводу, что она, похоже, сама по себе реализует механизм, сравнимый с «огромными страницами» ОС. Это означает, что, по моему мнению, он не выделяет «огромные страницы» любого типа, ни transparent, ни hugetlb*, а получает от ОС только страницы размером 4 КБ, объединяет их в блок размером 2 МБ и использует это как одна логическая страница внутри.

Что касается моих проблем с производительностью, это будет означать, что любая разница в производительности (управление памятью) может исходить только из самого VirtualBox, а не из-за какой-либо оптимизации в хост-ОС. OTOH, если бы VirtualBox реализовал подход, аналогичный «огромным страницам», это могло бы объяснить, почему в моем случае вообще можно увидеть преимущества производительности, например, с другим программным обеспечением, использующим «огромные страницы» из ОС, например. через madvise или что-то еще. Если --largepages действительно имеет такое огромное значение, как кажется в моем случае, можно даже утверждать, что это ошибка в VirtualBox, не требующая этой настройки для некоторого объема оперативной памяти в виртуальных машинах.

Итак, верно ли мое предположение, что VirtualBox использует только простые страницы размером 4 КБ из ОС вместо специальных огромных?

VBox/VMM/VMMR0/PGMR0.cpp:

248     int rc = GMMR0AllocateLargePage(pGVM, pVM, idCpu, _2M,
249                                     &pVM->pgm.s.aLargeHandyPage[0].idPage,
250                                     &pVM->pgm.s.aLargeHandyPage[0].HCPhysGCPhys);

VBox/VMM/VMMR0/GMMR0.cpp:

3081            RTR0MEMOBJ hMemObj;
3082            rc = RTR0MemObjAllocPhysEx(&hMemObj, GMM_CHUNK_SIZE, NIL_RTHCPHYS, GMM_CHUNK_SIZE);
3083            if (RT_SUCCESS(rc))

VBox/Runtime/r0drv/linux/memobj-r0drv-linux.c:

323 # ifdef VBOX_USE_INSERT_PAGE
324         paPages = alloc_pages(fFlagsLnx | __GFP_COMP | __GFP_NOWARN, rtR0MemObjLinuxOrder(cPages));
325 # else
326         paPages = alloc_pages(fFlagsLnx | __GFP_NOWARN, rtR0MemObjLinuxOrder(cPages));
327 # endif

person Thorsten Schöning    schedule 31.05.2018    source источник


Ответы (1)


Просматривая исходники VirtualBox по состоянию на ноябрь 2019 года, я прихожу к выводу, что VirtualBox не поддерживает большие страницы ни в одной хост-ОС, кроме Solaris: memobj-r0drv-solaris.c — единственный такой пример.

person poige    schedule 09.11.2019