У меня есть виртуальная машина, работающая на vSphere 6.5. С 24 виртуальными ЦП. Сервер имеет два физических процессора (xeon e5-2699 v4), которые имеют 22 ядра, и включена гиперпоточность.
Как именно виртуальный процессор работает с физическим процессором? Было бы лучше уменьшить число виртуальных ЦП до 22, чтобы он мог работать на одном физическом ЦП, или vSphere даже использовала бы в этом случае несколько физических ЦП?
У одной виртуальной машины никогда не должно быть больше виртуальных процессоров, чем доступно логических физических ядер.
При включенной Hyperthreading у вас 44 логических физических ядра, так что этого должно быть хорошо. Однако это сильно зависит от того, сколько еще виртуальных машин работает на этом хосте. Вы должны помнить о том, как работает планировщик ЦП сервера ESXi. Для каждого цикла ЦП он всегда ожидает, пока не появится физическое ядро для каждого виртуального ЦП на виртуальной машине. Таким образом, в вашем случае он всегда будет ждать, пока не станут доступны 22 физических ядра, прежде чем цикл ЦП сможет быть обработан. Если у вас на этом хосте намного больше виртуальных машин, это может привести к высокому времени готовности ЦП и очень медленной виртуальной машине.
Лично я всегда стараюсь поддерживать количество виртуальных ЦП на уровне 8 или меньше. По возможности лучше масштабируйте виртуальные машины, чем увеличивайте их.
Еще одно соображение: с текущим состоянием защиты от атак Spectre и Meltdown обычно рекомендуется отключить Hyperthreading, поскольку это снижает возможные векторы атак. Если вы решите отключить Hyperthreading, ваша конфигурация, скорее всего, больше не будет использоваться.
Согласно VMware Maximums (https://configmax.vmware.com/) у вас может быть 32 виртуальных ЦП на каждое физическое ядро, но, согласно передовой практике, вам не следует назначать больше ядер, чем у вас есть на самом деле.
Однако помните, что вы можете ограничивать, резервировать и расставлять приоритеты в соответствии с вашими рабочими нагрузками и потребностями.
Вы можете прочитать другой ответ на ту же тему Вот.
Я не могу представить себе ситуацию, когда вы хотите, чтобы для одной виртуальной машины было выделено больше виртуальных ЦП, чем физических ядер на сервере.
Сравните свою рабочую нагрузку с текущей конфигурацией виртуальной машины, а затем посмотрите, что произойдет, если вы постепенно уменьшите количество виртуальных ЦП. Обратите внимание как на скорость выполнения вашей рабочей нагрузки, так и на фактическое использование ЦП на хосте / виртуальной машине с точки зрения гипервизора, а не гостевой ОС.
Обычно при настройке виртуальных машин полезно начинать с довольно небольшого количества виртуальных ЦП, а затем постепенно увеличивать производительность, пока не стабилизируется производительность. Для многих рабочих нагрузок необязательно придерживаться четного числа виртуальных ЦП, хотя из этого принципа есть исключения. Опять же, хороший тестовый запуск должен показать, как ваше приложение работает со своей средой.
1) Ядра с гиперпоточностью не являются настоящими ядрами и не должны считаться таковыми. Оценки различаются, но я видел цифры, согласно которым включение HyperThreading дает лишь 10–30% дополнительной производительности в vSphere.
2) Назначение большего количества виртуальных ЦП для виртуальной машины всегда следует тщательно продумывать, особенно при больших количествах. Причина (радикально упрощенная) заключается в том, что планировщик ресурсов должен найти временной интервал, в котором достаточно ядер для одновременного выполнения всех ядер. Таким образом, на упрощенном, гипер-нереалистичном примере хоста с, скажем, 10 ядрами и 10 виртуальными машинами с 2 виртуальными ЦП у вас будет 5 виртуальных машин, ожидающих (то есть остановленных) половину времени, а 5 виртуальных машин будут выполняться, чередуя каждое состояние. Это нормально, поскольку все виртуальные машины получают процессорное время, и все в порядке. Теперь мы представляем 11-ю виртуальную машину с 10 виртуальными ЦП. Внезапно у вас есть 10 виртуальных машин, ожидающих, пока большая виртуальная машина выполнит свою работу, а затем выполняются 5 из них, а затем 5 других. Итак, теперь ваши виртуальные машины работают 33% времени вместо 50%. В сложной среде выделение относительно большого количества виртуальных ЦП может снизить производительность, особенно если на виртуальной машине нет ничего, что могло бы фактически использовать все виртуальные ЦП.
3) Моя личная передовая практика - никогда не выделять виртуальной машине больше половины логических ядер на одном процессоре, в любом случае это обычно также вполне разумное число для процессоров Xeon. Это позволяет избежать проблем с "слишком большой зависимостью" от "ядер" HT, а также позволяет вашим виртуальным машинам работать на одном процессоре, что упрощает работу планировщика.
Также необходимо учитывать концепцию узлов NUMA: если вы начнете предоставлять виртуальной машине больше виртуальных ЦП, чем может предоставить один процессор на узле, вы в основном вынуждаете vSphere разделить виртуальную машину между двумя узлами NUMA, что замедлит доступ к памяти, поскольку не вся память будет локальной для любого процессора.
За тем, как vSphere планирует ресурсы виртуальных машин, скрывается гораздо больше волшебства, и то, что я написал выше, значительно упрощено, но эти рекомендации служат мне хорошо на протяжении почти десятилетия.