Не так давно у заказчика появилась необходимость собрать пул виртуальных машин, который должен был состоять из серверов HP ProLiant 6 и 5 поколений. Процессоры в этих серверах: Xeon E5502 и X3353. Начиная с версии 5.5 Xen поддерживает гетерогенный пул процессоров.
Описываются 4 типа гетерогенных пулов:
- Добавление более производительного хоста к менеее производительным;
- Добавление менее производительного хоста к более производительным;
- Комбинация различных и взаимоисключающих хостов в пул;
- Комбинация различных CPU c идентичными возможностями.
Тип 1 подразумевает применение к подключаемому CPU маски, чтобы добиться совместимости с существующим пулом, который остается незамаскированным, эта опция автоматически включается в XenServer. Тип 2 подразумевает применение маски к существующему пулу, незамаскированным остается добавляемый сервер. Тип 3 подразумевает применение общей маски к существующему пулу и подключаемому хосту, чтобы добиться их совместимости. Тип 2 и тип 3 поддерживаются через XenAPI и Xe CLI. Тип 4 подходит для моделей с различными маркетинговыми названиями, но одинаковыми наборами флагов и функций.
В одном из блогов я наткнулся на видео, где 2 сервера добавляются в пул без изменения масок вручную. К сожалению, в моем случае при любых комбинациях XenServer выдавал: «This server's hardware is incompatible with the master's». Оставалось только попробовать применить маску.
Применение маски к существующему пулу влияет на работающие виртуальные машины, поэтому необходимо выбрать время для перезагрузки хостов и применения маски.
Дополнительный нюанс в том, что новые и старые процессоры не всегда можно описать как более производительные и менее производительные. Новые модели процессоров часто не используют функций, которые присутствуют в старых процессорах, что может привести к несовместимости. Поэтому не будет гарантии, что при использовании маски хоста с новейшими процессорами достаточно присоединить его к пулу, содержащему старые модели процессоров.
Поддерживаемые комбинации процессоров можно найти в Hardware Compatibility List.
Приступаем к выбору варианта маскирования.
В Citrix Xen Server необходимо определиться какие процессоры используются на хостах.
В нашем случае это были X3353 (4 cores 2.66GHz) и E5502 (2 cores 1.86GHz).
Рассмотрим атрибуты процессоров с помощью команды xe host-cpu-info
в Citrix XenServer.
[host_a] # xe host-cpu-info
cpu_count : 4
vendor: GenuineIntel
speed: 1866.734
modelname: Intel(R) Xeon(R) CPU E5502 @ 1.87GHz
family: 6
model: 26
stepping: 5
flags: fpu de tsc msr pae mce cx8 apic sep mtrr mca cmov pat clflush acpi mmx fxsr sse sse2 ss ht nx constant_tsc pni vmx est ssse3 sse4_1 sse4_2 popcnt
features: 009ce3bd-bfebfbff-00000001-28100800
features_after_reboot: 009ce3bd-bfebfbff-00000001-28100800
physical_features: 009ce3bd-bfebfbff-00000001-28100800
maskable: full
[host_b] # xe host-cpu-info
cpu_count : 4
vendor: GenuineIntel
speed: 2666.668
modelname: Intel(R) Xeon(R) CPU X3353 @ 2.66GHz
family: 6
model: 23
stepping: 6
flags: fpu de tsc msr pae mce cx8 apic sep mtrr mca cmov pat clflush acpi mmx fxsr sse sse2 ss ht constant_tsc pni vmx est ssse3 sse4_1
features: 000ce3bd-bfebfbff-00000001-20000800
features_after_reboot: 000ce3bd-bfebfbff-00000001-20000800
physical_features: 000ce3bd-bfebfbff-00000001-20000800
maskable: base
Сохраняем результаты в E5502.txt и X3353.txt.
В XenServer 5.5 существует условие, что процессоры могут быть добавлены в пул только если у них одинаковый вендор, модель, семейство и значения флагов.
Начиная с версии 5.6 только значения флагов у пула серверов и подключаемого хоста должны быть идентичными для создания гетерогенного пула.
Проверить маски на совместимость можно с помощью Heterogeneous CPU Pool Self-Test Kit:
# ./compare-cpu E5502.txt X3353.txt -v
file1: E5502.txt
file2: X3353.txt
pool_mask: ffffff7f-ffffffff-ffffffff-ffffffff
CPU 1:
model name: Intel(R) Xeon(R) CPU E5502 @ 1.87GHz
features: 009ce3bd-bfebfbff-00000001-28100800
masking level: full
CPU 2:
model name: Intel(R) Xeon(R) CPU X3353 @ 2.66GHz
features: 000ce3bd-bfebfbff-00000001-20000800
masking level: base
Result: CPU 1 and CPU 2 are compatible for masking
Mask type: 1 CPU 1 has a superset of features to CPU 2
Mask: 000ce3bd-bfebfbff-00000001-20000800
И наоборот, если бы добавляли X3353 к пулу с процессорами E5502:
# ./compare-cpu X3353.txt E5502.txt -v
file1: X3353.txt
file2: E5502.txt
pool_mask: ffffff7f-ffffffff-ffffffff-ffffffff
CPU 1:
model name: Intel(R) Xeon(R) CPU X3353 @ 2.66GHz
features: 000ce3bd-bfebfbff-00000001-20000800
masking level: base
CPU 2:
model name: Intel(R) Xeon(R) CPU E5502 @ 1.87GHz
features: 009ce3bd-bfebfbff-00000001-28100800
masking level: full
Result: CPU 1 and CPU 2 are compatible for masking
Mask type: 2 CPU 1 has a subset of features to CPU 2
Mask: 000ce3bd-bfebfbff-00000001-20000800
Маска идентичная, но тип действия другой.
Какие же функции процессоров сравниваются? Есть 2 набора функций процессора: базовые функции и расширенные. Оба типа разделены на 2 половины, известные как ECX и EDX. Определение вариантов маскировки для данной пары процессоров требует сравнения значений функций в сочетании с уровнем маскировки данных процессоров. Для краткости XenServer хранит значения функций в шестнадцатеричном виде.
Рассмотрим функции процессоров E5502 и X3353:
|| CPU model || base_ecx || base_edx || ext_ecx || ext_edx || Masking level ||
| E5502 | 009ce3bd | bfebfbff | 00000001 | 28100800 | full |
| X3353 | 000ce3bd | bfebfbff | 00000001 | 20000800 | base |
Различия есть в Base_ecx и Ext_edx, преобразуем функции в двоичный код, чтобы увидеть конкретные различия в битах функций:
|| CPU model || base_ecx (bin) || ext_edx (bin) ||
| E5502 | 000100111001110001110111101 |101000000100000000100000000000 |
| X3353 | 000000011001110001110111101 |100000000000000000100000000000 |
| | x x | x x |
| | 24 21 0 | 28 21 0 |
В процессоре E5502 в base_ecx присутствуют биты 21 и 24, которые отсутствуют в процессоре X3353. В функциях ext_edx в процессоре E5502 присутствуют биты 21 и 28, которые отсутствуют в X3353. Т.к. процессор E5502 полностью поддерживает маскировку (masking level: full), а процессор X3353 поддерживает маскировку на базовом уровне (masking level: base), то объединяющая маска возможна. Маска может быть рассчитана путем вычисления побитового И, взаимоисключающие функции процессоров будут отключены.
|| CPU model || base_ecx (bin) || ext_edx (bin) ||
| E5502 | 000100111001110001110111101 |101000000100000000100000000000 |
| X3353 | 000000011001110001110111101 |100000000000000000100000000000 |
| | x x | x x |
| Joint | 000000011001110001110111101 | 100000000000000000100000000000 |
Переводим в шестнадцатеричный вид:
|| base_ecx || ext_edx ||
| 000ce3bd | 20000800|
Складываем эти значения с неизмененными ext_ecx и base_edx и получаем маску объединения:
000ce3bd-bfebfbff-00000001-20000800
Посмотрев в Hardware Compatibility List, убеждаемся, что маска была правильная.
Осталось применить маску к хосту с процессором E5502:
xe host-set-cpu-features features=000ce3bd-bfebfbff-00000001-20000800 uuid=<host_uuid>
После перезагрузки хоста, у процессора E5502 те же функции, что и у X3353:
# xe host-cpu-info
cpu_count : 4
vendor: GenuineIntel
speed: 1866.734
modelname: Intel(R) Xeon(R) CPU E5502 @ 1.87GHz
family: 6
model: 26
stepping: 5
flags: fpu de tsc msr pae mce cx8 apic sep mtrr mca cmov pat clflush acpi mmx fxsr sse sse2 ss ht nx constant_tsc pni vmx est ssse3 sse4_1 sse4_2 popcnt
features: 000ce3bd-bfebfbff-00000001-20000800
features_after_reboot: 000ce3bd-bfebfbff-00000001-20000800
physical_features: 009ce3bd-bfebfbff-00000001-28100800
maskable: full
Physical Features при этом не изменяются.
На данный момент в матрице совместимости матрице совместимости нет новых процессоров E5-2400 и E5-2600 и маскирование новых процессоров на поколении Gen8 будет поддерживаться после выхода очередного обновления BIOS для серверов HP ProLiant:
# xe host-cpu-info
cpu_count : 32
vendor: GenuineIntel
speed: 2700.068
modelname: Intel(R) Xeon(R) CPU E5-2680 0 @ 2.70GHz
family: 6
model: 45
stepping: 7
flags: fpu de tsc msr pae mce cx8 apic sep mtrr mca cmov pat clflush acpi mmx fxsr sse sse2 ss ht nx constant_tsc nonstop_tsc aperfmperf pni pclmulqdq vmx est ssse3 sse4_1 sse4_2 x2apic popcnt aes hypervisor ida arat tpr_shadow vnmi flexpriority ept vpid
features: 17bee3ff-bfebfbff-00000001-2c100800
features_after_reboot: 17bee3ff-bfebfbff-00000001-2c100800
physical_features: 17bee3ff-bfebfbff-00000001-2c100800
maskable: no
Можно видеть, что функции процессора E5-2680 отличаются от функций E5502 только в base_ecx и новые процессоры поддерживают Flex Migration feature (как и должно быть), маска будет иметь вид:
009ce3bd-bfebfbff-00000001-2c100800
, но только с обновленной версией BIOS. Согласно матрице CPUпроцессоры E5-2600 поддерживаются и могут использоваться в XenServer 6.0, но пока только в гомогенных пулах.
Автор: Effi3