Я страдаю от серьезных проблем с производительностью при использовании VirtualBox и VM с большим количеством оперативной памяти, более подробно объяснено в этом и этом другом вопросе.Из того, что я тестировал до сих пор, существует прямая связь с объемом памяти, выделенной для виртуальной машины: проблема возникает с 48 ГБ ОЗУ, а не с 6 ГБ или включением параметра largepages
ВМ.
Это интересно, потому что этот параметр, по-видимому, не включен по умолчанию в Linux , документы говорят только об улучшении на ~ 5%, а не о том, чтонеобходим для нормальной работы при некотором объеме ОЗУ, и, кроме того, существуют обстоятельства, при которых largepages
полностью игнорируется VirtualBox .
00: 00: 42.866663 PGMR3PhysAllocateLargePage: выделениебольшие страницы занимают слишком много времени (последняя попытка 103 мс; количество тайм-аутов 11);DISABLE
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