Выделяет ли VirtualBox специальные "огромные страницы" для ОС? - PullRequest
0 голосов
/ 31 мая 2018

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