Я страдаю от серьезных проблем с производительностью при использовании 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