Почему наше программное обеспечение работает намного медленнее при виртуализации?
Я пытаюсь выяснить, почему наше программное обеспечение работает намного медленнее, чем при виртуализации. Большинство статистических данных, которые я видел, говорят, что в худшем случае это всего лишь 10% снижения производительности, но на виртуальном сервере Windows снижение производительности может составлять 100-400%. Я пытался профилировать различия, но результаты профиля не имеют большого смысла для меня. Вот что я вижу, когда делаю профиль на своем 32-битном компьютере Vista без виртуализации:
И вот один запуск на 64-битном сервере Windows 2008 с виртуализацией:
Медленный тратит очень много времени в RtlInitializeExceptionChain
который показывает как 0,0 с на быстром. Есть идеи, что это делает? Кроме того, когда я присоединяю к процессу мою машину, существует только один поток, PulseEvent
Однако, когда я подключаюсь к серверу, есть два потока, GetDurationFormatEx
а также RtlInitializeExceptionChain
, Насколько я знаю, код, в котором мы написали, использует только один поток. Кроме того, что бы это ни стоило, это только консольное приложение, написанное на чистом C без пользовательского интерфейса вообще.
Кто-нибудь может пролить свет на все это для меня? Даже просто информация о том, что некоторые из них ntdll
а также kernel32
звонки делают? Я также не уверен, сколько различий связано с 64/32-битными и сколько виртуальных / не виртуальных. К сожалению, у меня нет легкого доступа к другим конфигурациям, чтобы определить разницу.
2 ответа
Я полагаю, мы могли бы разделить причины снижения производительности на виртуальной машине на два класса:
1. Конфигурация перекоса
Эта категория относится ко всем вещам, которые не имеют ничего общего с виртуализацией как таковой, но где настроенная виртуальная машина не так хороша, как реальная. Очень просто сделать так, чтобы у виртуальной машины было только одно ядро ЦП, а затем сравнить его с приложением, работающим на двухъядерном 8-ядерном 16-гиперпоточном процессоре Intel Core i7. В вашем случае, как минимум, вы не запускаете ту же ОС. Скорее всего, есть и другой перекос.
2. Плохая виртуализация
Такие вещи, как базы данных, которые выполняют много блокировок, плохо виртуализируются, поэтому типичные накладные расходы могут не применяться к тестовому случаю. Это не ваш случай, но мне сказали, что для MySQL штраф составляет 30-40%. Я заметил точку входа с именем ... семафор в вашем списке. Это признак того, что будет медленно виртуализироваться.
Основная проблема заключается в том, что конструкции, которые не могут быть выполнены изначально в пользовательском режиме, потребуют прерываний (медленных, сами по себе), а затем дополнительных затрат в коде эмуляции гипервизора.
Я предполагаю, что вы предоставляете достаточно ресурсов для своих виртуальных машин, преимущество виртуализации заключается в консолидации 5 машин, которые работают только с 10-15% ЦП / память, на одну машину, которая будет работать с 50-75% ЦП / память. и который все еще оставляет вам 25-50% накладных расходов в те "бурные" времена.
Личный анекдот: было виртуализировано 20 машин, но каждая использовала столько процессора, сколько могла. Это вызывало проблемы, когда одна машина пыталась использовать больше энергии, чем могло обеспечить одно ядро. Поэтому гипервизор виртуализировал одно ядро с несколькими ядрами, снижая производительность. Как только мы сократили использование ЦП каждой виртуальной машины до максимального уровня, доступного для любого отдельного ядра, производительность резко возросла.