Решение на проблеми с производителността на VirtualBox за многоядрени процесори
Тази статия обяснява подробно как можете значително да подобрите производителността на VirtualBox на последно поколение многоядрени процесори, като настроите VirtualBox и системните настройки, за да осигурите правилна работа и преодоляване на проблеми със съвместимостта.
Стартиране на среда за разработка в VirtualBox Debian, за обслужване на Magento с NGiNX разкри изключително ниска производителност, когато VirtualBox беше конфигуриран да използва повече от едно ядро, тъй като всеки ентусиаст с многоядрен CPU от последно поколение би възнамерявал да го настрои.
Конфигурация на машина за тестов стендТестовата машина беше оборудвана с процесор i7-4500U, който има 2 физически ядра, всяко с 2 нишки (псевдо ядра), общо 4 нишки за изпълнение.
Хост ОС – Windows 7
ОС за гости – Debian 7/NGiNX/Magento/+
Резултати от тестовия стендЗаявката на проста страница phpinfo() отговаря и се зарежда почти мигновено, но заявката на бекенд страница на Magento отнема поне 5 секунди и понякога достига до надвишаване на максималното време за изпълнение от 30 секунди. Производителността и последователността бяха толкова лоши, че не можеха да се използват.
Както се казва в подзаглавието, сърцевината на проблема всъщност е разпределението на ядрата на физическия процесор към VirtualBox. Псевдоядрата/нишките, разрешени от Intel HyperThreading, не се рекламират като несъщински процесорни ядра и това обърква VirtualBox при разпределянето на процесорни ядра.
Intel Core i7-4500U например има 2 физически ядра и общо 4 нишки, което означава, че всяко физическо ядро може да изпълнява 2 нишки с помощта на технологията HyperThreading. Проблемът е, че една нишка е като допълнителна част от ядрото, но няма същия физически ресурс като истинското ядро.
Още по-лошо, VirtualBox оставя първите две ядра за хост ОС, които в Windows 7/8 са истинските процесорни ядра, и разпределя следващите ядра към виртуалната машина, които, познайте какво, са виртуалните нишки.
Виртуалните нишки, предлагани от HyperThreading, са много леки за внедряване, не дублират реални ресурси на процесора (кеш, ALU и т.н.), така че причината за влошаване на производителността не е чудна.
Тествайте сами този сценарий. Стартирайте VirtualBox под Windows 7/8, на процесор „2 ядра / 4 нишки“ и разпределете 2 ядра на виртуалната машина в Настройки/Система/Процесор. Стартирайте виртуалната машина за гост OS с някаква непрекъснато изпълнявана задача, за предпочитане нещо взискателно, за да видите въздействието на по-добрите настройки по-късно. Отидете на Windows Task Manager/Processes в хост OS, потърсете процеса VirtualBox.exe, който изглежда е виртуалната машина (ще намерите два от тях, един за диспечера и един за машината), щракнете с десния бутон и изберете Задаване на афинитет.. Деактивирайте ядра 3-то и 4-то и ще видите, че машината за гости се заключва. Деактивирайте ядрата едно по едно и проверете как е повлияна функционалността/производителността СЕГА Изключете машината за гости и отидете на Настройки /System/Processor и задайте само едно ядро на виртуалната машина Проверете за значително подобрена производителност Повторете стъпки 3-6 и проверете производителносттаVirtualBox CPU Core Performance Tuning
Други настройки за фина настройка на VirtualBox за машината, които работиха за мен:
Система/Дънна платка/Чипсет: ICH9Система/Процесор/Капачка за изпълнение: 100% Система/Ускорение: Активиране на VT-x/AMD-v, Активиране на вложено съхранение на пейджинг/Контролер: SATA/Solid State Drive отметнатоНе забравяйте да увеличите максимално производителността на вашата хардуерна машина, ако е преносим компютър:
Изберете профил за висока производителност в опциите за захранване. Персонализирайте профил за висока производителност в опциите за захранване, като зададете минимално състояние на процесора на 100% Резултати от тестовия стенд след адресиране на споменатите проблеми с производителността на VirtualBoxПроизводителността е последователна и предсказуема, със зареждания на страници от некеширан бекенд на Magento около 4-5 секунди.
vCPU са свързани директно с физически ядра, но не конкретно с 1 ядро. Ако създадете VM с 1 vCPU, тогава вие разпределяте 1 физическо ядро на тази VM, когато трябва да обработи нещо. Ако се придържаме към нашия пример, това означава, че на теория можете да създадете 8 единични vCPU VM и никога да няма спорове за ресурси между VM. След като започнете да преминавате към мулти-vCPU VM, това е мястото, където започвате да се натъквате на проблеми. VM с множество vCPU изискват всички разпределени ядра да са свободни, преди да започне обработката. Това означава, че ако имате машина с 2 vCPU, трябва да са налични 2 физически ядра, а 4 vCPU изисква 4 физически ядра и т.н.
добавянето на повече ядра би имало потенциала да направи VM по-бавна. Причината е, че CPU планировчикът на virtualbox трябва да планира достъп до ядро за VM и трябва да разпредели всички ядра, присвоени на vm едновременно.
Така че например нека използваме 4-те ядра (без да навлизаме в проблема с физическото спрямо логическото ядро). Да приемем, че имате 4 ядра. Първо, вие използвате Ubuntu и Virtualbox, които разбира се използват различни процеси. Ако между Linux OS и virtualbox да речем, че 2 ядра винаги се използват, а трето се използва от време на време. Сега имате VM (winxp win7 няма значение) и има 2 присвоени ядра. VM трябва да изчака, докато 2 ядра са налични, преди да може да обработи нещо и имам предвид ВСИЧКО. Стартиране на програма, реагиране на въвеждане от клавиатура/мишка, всичко. Така че при тази настройка по всяко време, когато действителната ви система (Ubuntu и VirtualBox) използва над 2 ядра, вашата виртуална машина трябва да чака, и да чака, и да чака. Това време на изчакване се нарича време за готовност на процесора. Много информация онлайн за времето за готовност на процесора.
... най-добрата практика е да направите виртуалната машина възможно най-икономична. Започнете от 1 процесор/ядро и увеличете само ако е необходимо. Ако времето за зареждане на вашата виртуална машина е по-бързо с 1 ядро, тогава вашата система няма наличните ресурси, за да планира повече навреме, тъй като всички присвоени ядра трябва да са налични по едно и също време. Понякога можете да се измъкнете с прекомерно осигуряване на други ресурси към vm, като RAM, и да не претърпите такъв удар в производителността, но не и vCPU.
Източници:
CPU Ready е:
Времето, което виртуална машина чака в опашката в състояние на готовност за изпълнение, преди да може да бъде планирана на процесора.
Това означава, че VM е готова да обработи нещо, но трябва да изчака, тъй като ресурсите на процесора, които изисква, не са налични на физическия хост.
Източник: http://virtualblocks.wordpress.com/2010/06/22/cpu-ready-over-built-vm-or-over-utilized-host/
За да определя дали проблемите са причинени от времето за готовност на процесора, направих следния нов тест на нова машина:
Резултатите от теста показват времето за зареждане на Magento страница:
Първо опресняванеВторо опресняванеТрето опресняване, докато многократно отваряте и затваряте стартовото меню на хост (Windows) OSМоже лесно да се види, че поддържането на хост операционната система да изпълнява допълнителна задача, също толкова просто, колкото отварянето и затварянето на стартовото меню много пъти, докато операционната система за гости обслужваше страницата, предизвика допълнително време за изчакване от повече от 1 секунда. Това потвърждава, че проблемът е свързан с времето за готовност на процесора.
Едно ядро, разпределено за VM, показва значително подобрена производителност при зареждане на страницата, стабилна между опресняванията, не се влияе от лекото натоварване на процесора на хоста (като отваряне на стартовото меню).
Също така няма влияние върху производителността между I/O APIC и настройките на чипсета.
От документацията на VirtualBox:
Активирайте I/O APIC
Усъвършенстваните програмируеми контролери за прекъсване (APIC) са по-нова x86 хардуерна функция, която замени старите програмируеми контролери за прекъсване (PIC) през последните години. С I/O APIC операционните системи могат да използват повече от 16 заявки за прекъсване (IRQ) и следователно да избягват споделянето на IRQ за подобрена надеждност.
Забележка: Активирането на I/O APIC е необходимо за 64-битови гост операционни системи, особено Windows Vista; също е необходимо, ако искате да използвате повече от един виртуален процесор във виртуална машина.
Софтуерната поддръжка за I/O APIC обаче е ненадеждна с някои операционни системи, различни от Windows. Също така, използването на I/O APIC леко увеличава разходите за виртуализация и следователно малко забавя операционната система за гости.
Предупреждение: Всички операционни системи Windows, започващи с Windows 2000, инсталират различни ядра в зависимост от това дали е наличен I/O APIC. Както при ACPI, входно/изходният APIC следователно не трябва да се изключва след инсталиране на операционна система за гости на Windows. Включването му след инсталирането обаче няма да има ефект.
В допълнение можете да изключите интерфейса за разширено конфигуриране и захранване (ACPI), който VirtualBox представя на операционната система за гост по подразбиране. ACPI е текущият индустриален стандарт, който позволява на операционните системи да разпознават хардуера, да конфигурират дънни платки и други устройства и да управляват захранването. Тъй като всички съвременни компютри съдържат тази функция и Windows и Linux я поддържат от години, тя също е активирана по подразбиране във VirtualBox. Може да се изключи от командния ред; Вижте раздела, наречен „VBoxManage modifyvm“.
PREV: Как да поправите сървър с посоченото име на хост не може да ...
NEXT: Какво представлява планът за поддръжка на сървъра и защо е важен...