При створенні віртуальних машин на різних Гіпервізор (VMWare, KVM, Hyper-V і т.д.) ви можете звернути увагу, що іноді віртуальна машина може не бачити все виділені їй віртуальні ядра (vCPU). У нашому випадку віртуальній машині на KVM були виділені 8 vCPU, на неї встановлена ​​Windows 10. Однак Windows визначала ці ядра як окремі процесори, з яких можна використовувати тільки 2 vCPU.

Віртуальна машина Windows 10 не бачить все ядра

Якщо відкрити диспетчер пристроїв Windows, можна переконається, що всі виділені ядра видно як 8 окремих віртуальних процесорів типу Віртуальний процесор QEMU версії 2,5.

Віртуальні процесори QEMU Virtual CPU version 2 в обладнанні віртуальної машини.

При цьому у властивостях Windows 10 (Computer -> Properties) і в Task Manage видно, що на комп’ютері доступні тільки 2 процесора QEMU Virtual CPU.

Windows не бачить все виділені віртуальні процесори

Тобто скільки б ви не додали віртуальних ядер, Windows 10 все одно зможе використовувати тільки два. При цьому сусідній віртуальний сервер з Window Server 2016 на цьому ж гіпервізора бачить все 16 виділених йому vCPU.

Кількість підтримуваних процесорів в Windows 10

Проблема полягає в тому, що в десктопних редакціях Windows (Windows 10 / 8.1 / 7) є обмеження на максимальну кількість фізичних процесорів (сокетов), Яке комп’ютер може використовувати:

  • Windows 10 Home – 1 процесор
  • Windows 10 Professional – 2 процесора
  • Робоча станція Windows 10 – до 4 процесора
  • Windows Server 2016 – до 64 процесора

Однак це обмеження не поширюється на ядра. Тобто для підвищення продуктивності ви можете використовувати процесор з великою кількістю ядер. Більшість гіпервізора вміють надавати vCPU у вигляді процесорів, процесорних ядер або навіть потоків. Тобто замість 8 віртуальних CPU ви можете надати vCPU у вигляді 2 сокетов по 4 ядра в кожному. Розглянемо, як в різних системах віртуалізації виділити віртуальні процесори у вигляді ядер і як це пов’язати з архітектурою NUMA, що використовується в сучасних процесорах.

Управління віртуальними ядрами і vCPU в KVM

У моїй віртуальній машині КВМ c Windows 10, Всі призначені віртуальні ядра вважаються окремими процесорами.

Щоб використовувати всі ресурси CPU, виділені віртуальній машині потрібно, щоб віртуальна машина бачила не 8 процесорів, а один 8-ядерний процесор, 2 процесора по 4 ядра або 1 процесор з 4 ядрами по 2 потоки. Спробуємо змінити спосіб призначення віртуальних ядер для ВМ на KVM.

Вимкніть віртуальну машину:

# virsh shutdown server.vpn.ru – де server.vpn.ru це ім’я віртуальної машини.

Особливості управління ВМ в KVM з консолі сервера за допомогою virsh.

Виведіть поточну XML конфігурацію віртуальної машини KVM:

# virsh dumpxml server.vpn.ru

Нам цікавий блок з описом процесорів:

<vcpu placement="static">8</vcpu>

<cputune>

<shares>1000</shares>

</cputune>

<resource>

<partition>/machine</partition>

</resource>

<os>

<type arch="x86_64" machine="pc-i440fx-rhel7.6.0">hvm</type>

<bootmenu enable="yes"/>

</os>

<features>

<acpi/>

<apic/>

<pae/>

</features>

Як бачимо, у нас вказано просто 8 vCPU. Змінимо конфігурацію:

# virsh edit server.vpn.ru

І після додамо:

<cpu mode="host-passthrough" check='none'>

<topology sockets="1" cores="4" threads="2"/>

</cpu>

де:

  • host-passthrough – режим емуляції при якому на віртуальній машині буде показаний фізичний процесор вузла кластера (ноди).
  • sockets="1" – вказуємо що процесор 1
  • cores="4" – вказуємо, що процесор має 4 ядра
  • threads="2" – вказуємо, що ядра у нас по 2 потоки

Збережіть конфігураційний файл і запустіть ВМ. Авторизуйтесь в гостьовій ВМ з Windows 10 і в Task Manager або Resource Monitor перевірте, що ОС бачить все виділені віртуальні ядра.

кілька віртуальних ядер в Windows 10

Також в якості системи тепер став відображатися фізичний процесор хоста IПроцесор ntel (R) Xeon (R) Silver 4114, А не віртуальний.

віртуальна машина KVM з гостьової Windows 10 бачить два фізичних процесор з декількома ядрами

Так нам вдалося вирішити проблему з навантаженням на ВМ, так як двох ядер не вистачало для повноцінної роботи додатків.

Налаштування віртуальних процесорів і кількості ядер в VMWare

Ви можете змінити спосіб презентації vCPU для віртуальної машини VMWare з інтерфейсу vSphere Client.

  1. Вимкніть ВМ і відкрийте її налаштування;
  2. розгорніть секцію ЦП;
  3. Змінимо конфігурацію ВМ так, щоб гостьова ОС бачила 2 процесора по 4 ядра. змініть значення Ядра на сокет на 4. Це означає, що гостьова ОС буде бачити два чотирьох -ядерних процесора (2 сокета по 4 ядра); vmware - количесвто ядер на процесор у віртуальній машині
  4. Збережіть зміни і запустіть ВМ.

Архітектура NUMA і віртуальні vCPU

Є ще кілька аспектів призначення vCPU і ядер віртуальним машинам, які потрібно розуміти.

При призначенні ядер на сокеті враховуйте наявність NUMA архітектури (Використовується в більшості сучасних CPU). Не рекомендується призначати вашої ВМ кількість ядер на сокет (і загальна кількість vCPU) більше, ніж доступно ядер на вашому фізичному сокеті / процесорі (ноді NUMA). При розміщенні на одній фізичній ноді NUMA, віртуальна машина зможе використовувати швидку локальну RAM, доступну на конкретній ноді NUMA. Інакше для виконання операції процесам доведеться чекати відповіді від іншої Ноди NUMA (що дещо довго).

Якщо ви призначаєте для ВМ два окремих віртуальних сокета, то гипервизор може їх запускати на різних нодах NUMA. Що не кращим чином позначиться на продуктивності ВМ.

Якщо кількість необхідних vCPU перевищує кількість ядер на 1 фізичному сокеті (ноді NUMA), потрібно створити кілька віртуальних сокетов (процесорів) з необхідним кількість ядер. Також не бажано використовувати непарна кількість процесорів (краще додати 1 vCPU)

Це дозволить зберегти продуктивність віртуальної машини.

vCPU і процесорна архітектура NUMA

Наприклад, для 2 процесорного хоста з 10 ядрами (сумарно доступно 40 vCPU з урахуванням ГіперРізьбонарізання), При налаштуванні vCPU для ВМ оптимально використовувати такі конфігурації:

Необхідна кількість vCPU Кількість віртуальних сокетов в налаштуваннях ВМ Кількість ядер на віртуальному процесорі в налаштуваннях ВМ
1 1 1
……
10 1 10
11 Чи не оптимально
12 2 6
……
20 2 10

Наприклад, ВМ з Microsoft SQL Server 2016 Enterprise Edition 16 vCPU в конфігурації 8 сокетів за 2 ядра буде працювати гірше, ніж в конфігурації 2 сокета по 8 ядер.

Також не забувайте, що деякі програми ліцензуються за фізичними сокетів (так було в старих версіях SQL Server). Іноді вам просто вигідніше ліцензувати один багатоядерний процесор, ніж кілька процесорів з меншою кількістю ядер.

Leave a Reply

Your email address will not be published. Required fields are marked *