Я знаю, что раньше этот вопрос задавался аналогичным образом, но мой вопрос более конкретный, а существующие старые. Так что все могло сильно измениться (например, думать о векторных инструкциях).
Проще говоря, у меня есть модуль python, который мне всегда нужно использовать, и мой код python работает намного медленнее (двойное время выполнения) на виртуальных машинах (тип 1 и 2). Сам модуль в основном представляет собой оболочку / API для библиотеки C, но не исключительно.
Я пытаюсь выяснить, затронут ли сам python или только модуль. Известно ли, что python сильно страдает при работе в виртуальной машине?
Из вашего вопроса невозможно узнать, сравниваете ли вы яблоки с яблоками.
В правильно настроенной и разумно загруженной среде виртуализации я ожидаю, что большинство нагрузок будут работать не более чем на несколько процентов медленнее, чем на «голом железе». Если ваш код сильно масштабируется и может использовать все доступные аппаратные ресурсы, я ожидаю, что он будет работать значительно хуже в виртуализированной среде, особенно если ресурсов не хватает. Если ваш код зависит от конкретного аппаратного ускорителя, влияние виртуализации зависит от реализации.
Вы ничего не доказали, у вас есть масса переменных, которые вы не изолировали. Версия Python, версия операционной системы, аппаратные ресурсы, квоты ресурсов виртуальных машин, модель ЦП и т. Д.
Определите, какие именно функции в вашем коде требуют времени. Визуализируйте это с графики пламени. Выборка стека на основе Python реализация была бы хорошей, но я не знаю, насколько хорошо она улавливает функции C. В этом случае вы можете попробовать профилировщики на основе операционной системы (eBPF, xperf), которые лучше видят библиотеку C и ОС.
Подробно изучите, какие функции медленные. Получите представление о том, что он делает, по возможности получите исходный код. Подсчитайте системные вызовы, чтобы определить, что он запрашивает от операционной системы.
Найдите ограничивающий ресурс: ЦП, память, диск, сеть. Измеряйте эти ресурсы на уровне хоста с помощью инструментов мониторинга производительности.
Сравните результаты в разных средах, на «голом железе», на разных типах виртуальных машин, на разном оборудовании. Не перегружайте ресурсы хостов виртуальных машин, а не ЦП и определенно не ОЗУ. Это несправедливо по сравнению с выделенным хостом без операционной системы.
На самом деле, это общее исследование производительности, направленное на определение ограничивающего фактора в вашей среде. Использование Python просто может изменить время выполнения кода на профилирование и оптимизацию.
Скорее всего, рассматриваемый код выполняет МНОГО переключения контекста (и / или гипервизор усугубляет переключение контекста, перемещая виртуальное ядро вокруг физических ядер). Переключение контекста в гипервизоре может быть примерно в 100 раз дороже, чем в «голом железе». Промахи кеша также могут быть большим фактором из-за того, что гипервизор распределяет виртуальные ядра вокруг разных физических ядер.
Чтобы уменьшить некоторые из этих накладных расходов, прикрепите виртуальные ядра к физическим ядрам, предоставьте виртуальную машину (сокеты / ядра / потоки) базовой топологии ЦП, держите виртуальную машину полностью в пределах одного узла NUMA и не предоставляйте гостю полную набор ядер / потоков ЦП, которые у вас есть на хосте, если ваш код чувствителен к задержке кеша / памяти.
Производительность под гипервизором для различных рабочих нагрузок может быть значительно хуже, чем на голом железе. Цифры получены много лет назад, но я достаточно регулярно проверяю эти вещи, и за последнее десятилетие многое не изменилось.