Назад | Перейти на главную страницу

Может ли виртуальная машина работать лучше, если ей представлены только два ядра вместо четырех?

У нас была виртуальная машина VMWare с двумя выделенными для нее ядрами, которая выполняла довольно отвратительный процесс в IIS. Под нагрузкой процесс достиг максимальной загрузки ЦП на обоих ядрах, поэтому мы попросили наших системных инженеров предоставить виртуальной машине два других ядра физического процессора. Инженер сразу сказал, что это вообще не улучшит производительность, но ухудшит работу виртуальной машины. Он отклонил причину своего заявления, которая имела какое-либо отношение к мощности сервера ESX или нехватке ресурсов.

Это утверждение не имело для меня особого смысла, и мне интересно, как то, что сказал инженер, могло быть правдой. Существуют ли на самом деле случаи, когда четыре ядра, представленные виртуальной машине, вызывают худшую производительность, чем два ядра на том же физическом оборудовании? Предположим, что это идеальная ситуация, когда на главном сервере есть только одна виртуальная машина, поэтому другие экземпляры ОС ничем не передаются.

Я считаю, что на физическом сервере был один четырехъядерный процессор и, скорее всего, на нем размещалось несколько виртуальных машин. Я действительно не знаю, какая версия ESX работала на хосте, и я не знаю с уверенностью, какова была конфигурация физического процессора, но внутри виртуальной машины, к которой у меня был доступ, я увидел два процессора AMD с тактовой частотой 3,33 ГГц.

В конце концов, мне так и не удалось проверить утверждение инженера, потому что (пока мы пытались обновить виртуальную машину) мы смогли оптимизировать процесс и снизить его потребление ЦП, и 2) мы закончили миграцию на другую виртуальную машину на еще один сервер ESX, которому были представлены четыре ядра.

Я вмешаюсь и скажу, что, вероятно, ваш инженер имел в виду тот факт, что виртуальная машина с несколькими виртуальными ЦП имеет явный недостаток при планировании циклов ЦП. Виртуальная машина с 1 виртуальным ЦП может выполнять инструкции, как только доступно одно ядро. Если виртуальная машина имеет 4 виртуальных ЦП, то она буквально не может выполнять никаких инструкций, пока не станут доступны 4 ядра.

Если на вашем компьютере есть приличное количество виртуальных машин, это определенно может замедлить вас, потому что вашей виртуальной машине придется ждать в очереди, чтобы освободить 4 ядра. Это также может замедлить работу другой виртуальной машины, поскольку к ней будут подключены все 4 ядра одновременно.

Я не хочу вдаваться в подробности Hyper-Threading и тому подобное, но выше приводится простое объяснение того, о чем, как мне кажется, мог иметь в виду ваш парень. Хотя, возможно, он не лучшим образом объяснил это.

Лучшая практика для vSphere на VMWare заключается в использовании как можно меньшего количества виртуальных процессоров. Если приложения не созданы для приложений SMP, это может оказать негативное влияние, если вы назначите несколько виртуальных ЦП гостю.

Даже если некоторые виртуальные ЦП не используются, настройка виртуальных машин с ними по-прежнему накладывает некоторые небольшие требования к ресурсам для ESX: * Неиспользуемые виртуальные ЦП по-прежнему используют прерывания таймера. * Поддержание согласованного представления памяти между несколькими виртуальными ЦП потребляет ресурсы. * Некоторые старые гостевые операционные системы выполняют циклы ожидания на неиспользуемых виртуальных ЦП, тем самым потребляя ресурсы, которые в противном случае могли бы быть доступны для других целей (другие виртуальные машины, VMkernel, консоль и т. Д.). * Гостевой планировщик может переносить однопоточную рабочую нагрузку между несколькими виртуальными ЦП, тем самым теряя локальность кэша.

Возможно, что если хост полностью исчерпал все циклы физического процессора, это могло вызвать другие проблемы с производительностью, поскольку хост начинает зависать, что, в свою очередь, приводит к тому, что все гости начинают зависать.

edit: Ваш инженер должен был хотя бы захотеть протестировать.

при повторном прочтении вашего сообщения вы сказали, что у него только 1 четырехъядерный процессор ... в этом случае я бы, вероятно, пошел с вашим инженером и сказал, что назначение всех 4 физических процессоров одному гостю - это плохой идея. Накладные расходы хоста на управление всеми 4 виртуальными ЦП при наличии только 4 физических ядер снизят общую производительность.

Проблема в том, что добавление 4 виртуальных ЦП при порыве ветра, когда у хоста всего 4 ядра, означает, что вы назначаете все свои физические ресурсы ЦП одной машине. Накладные расходы, связанные с тем, что гипервизор управляет всеми 4 виртуальными ЦП, в конечном итоге отнимут ресурсы, и ваши реальные выгоды, скорее всего, будут минимальными

Эмпирическое правило, которое я усвоил до сих пор, - всегда иметь меньше виртуальных ЦП, назначенных одной виртуальной машине, чем физически присутствует в хосте.

Одна из причин этого (до esxi) - постоянная работа консоли vm. для планирования повторных действий вы будете получать циклы ЦП на виртуальную машину только тогда, когда некоторое количество виртуальных ЦП одновременно простаивает. в противном случае ваше "время ожидания процессора" увеличится

Таким образом, с четырехъядерным процессором в хосте я бы назначил только макс. 2 процессора на виртуальную машину.

Это зависит от того, что еще использует эти другие ядра. Если ядра простаивают, то да, добавление этих ядер к вашей виртуальной машине повысит производительность (я предполагаю, что приложение, работающее на вашей виртуальной машине, является многопоточным и способно использовать все 4 ядра). Если ядра заняты, это, вероятно, не поможет, или, по крайней мере, не так сильно, как можно было бы подумать.