NUMA і що про нього знає vSphere?

Я думаю, багато хто вже встиг зазирнути і прочитати цю статтю англійською в моєму блозі, але для тих кому все таки комфортніше читати рідною мовою, ніж іноземною (як сказали б на dirty.ru - анти-монгольською), я перекладу чергову свою статтю.


Ви вже напевно знаєте, що NUMA це нерівномірний доступ до пам'яті. Зараз ця технологія представлена в процесорах Intel Nehalem і AMD Opteron. Чесно кажучи, я, як практикуючий здебільшого мережевик, завжди був упевнений, що всі процесори рівномірно борються за доступ до пам'яті між собою, проте у випадку з NUMA процесорами моє уявлення сильно застаріло.

Приблизно так це виглядало до появи нового покоління процесерів.

У новій же архітектурі кожен процесорний сокет має прямий доступ тільки до певних слотів пам'яті і утворює NUMA вузол. Тобто при 4 процесорах і 64 Гбайт пам'яті у вас буде 4 NUMA вузла, кожен з 16 Гбайт пам'яті.

Наскільки я зрозумів, новий підхід до розподілу доступу до пам'яті був винайдений в силу того, що сучасні сервери настільки напхані процесорами і пам'яттю, що стає технологічно і економічно невигідно забезпечувати доступ до пам'яті через єдину загальну шину. Що в свою чергу може вести до суперництва за смугу пропускання між процесорами, ну і до більш низької масштабованості продуктивності самих серверів. Новий підхід привносить 2 нових поняття - Локальна пам'ять і Віддалена пам'ять. У той час як до локальної пам'яті процесор звертається безпосередньо, то до Віддаленої пам'яті йому доводиться звертатися старим дідівським методом, через загальну шину, що означає більш високу затримку. Це також означає, що для ефективного використання нової архітектури наша ОС розуміти, що вона працює на NUMA вузлі і правильно керувати своїми прокладеннями/процесами, інакше ОС просто ризикує опинитися в ситуації, коли додаток виконується на процесорі одного вузла, в той час як його (програми) адресний простір пам'яті розташовується на іншому вузлі. Швидкий пошук показав, що NUMA архітектура підтримується Майкрософт починаючи з Windows 2003 і Vmware - як мінімум з ESX Server 2.

Не впевнений, що в GUI якось можна побачити дані NUMA вузла, але безумовно це можна подивитися в esxtop.

Отже, тут ми можемо спостерігати, що в нашому сервері 2 NUMA вузла, і що в кожному з них 48 Гбайт пам'яті. Ось цей документ говорить, що перше значення означає кількість локальної пам'яті в NUMA вузлі, а друге, в дужках - кількість вільної пам'яті. Однак, пару разів на своїх продакшн серверах я спостерігав друге значення вище, ніж перше, і ніякого пояснення цьому знайти не зміг.

Отже, як тільки ESX сервер виявляє, що він працює на сервері з NUMA архітектурою, він негайно включає NUMA планувальник, який у свою чергу піклується про віртуальні машини і про те, щоб всі vCPU кожної машини перебували в межах одного NUMA вузла. У попередніх версіях ESX (до 4.1) для ефективної роботи на NUMA системах максимальна кількість vCPU віртуальної машини завжди обмежувалася кількістю ядер на одному процесорі. Інакше NUMA планувальник просто ігнорував цю ВМ і vCPU рівномірно розподілялися поверх всіх доступних ядер. Однак в ESX 4.1 була представлена нова технологія, звана Wide VM. Вона дозволяє нам призначати у ВМ більшу кількість vCPU, ніж ядер на процесорі. Згідно Vmware документу планувальник розбиває нашу «широку віртуальну машину» на кілька NUMA клієнтів і потім вже кожен NUMA клієнт обробляється за стандартною схемою, в межах одного NUMA вузла. Однак, пам'ять все таки буде розрізненою між обраними NUMA вузлами цієї Wide VM, на яких працюють vCPU віртуальної машини. Це відбувається тому, що передбачити до якої ділянки пам'яті звернеться той чи інший vCPU NUMA клієнт практично неможливо. Незважаючи на це, Wide VM все одно надають істотно поліпшений механізм доступу до пам'яті порівняно зі стандартним «розмазуванням» віртуальної машини поверх всіх NUMA вузлів.

Ще одна чудова особливість NUMA планувальника це те, що він не тільки вирішує де розташувати віртуальну машину при її запуску, але і постійно стежить за її співвідношенням локальної і віддаленої пам'яті. І якщо це значення йде нижче порога (за непідтвердженою інфо - 80%), то планувальник починає мігрувати ВМ в інший NUMA вузол. Більш того ESX буде контролювати швидкість міграції щоб уникнути зайвої завантаженості загальної шини, через яку спілкуються всі NUMA вузли.

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

Ну і наостанок, трохи корисної інформації, яку ви можете підкреслити з esxtop.

Короткий опис значень:

NHN Номер NUMA вузла

Кількість міграцій віртуальної машини між NUMA вузлами

Кількість віддаленої пам'яті NMREM

Кількість локальної пам'яті NLMEM

N&L Процентне співвідношення між локальною і віддаленою пам "яттю

GST_ND (X) Кількість вибраної пам "яті для вузла X

OVD_ND (X) Кількість пам'яті витраченої на накладні витрати на вузлі X

Хотілося б відзначити, що як зазвичай вся ця стаття всього лише компіляція того, що мені здалося цікавим з прочитаного за останній час в блогах таких товаришів як Frank Denneman і Duncan Epping, а також офіційних документів Vmware.