Python: Влияние виртуализации на производительность

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

Проще говоря, у меня есть модуль python, который мне всегда нужно использовать, и мой код python работает намного медленнее (двойное время выполнения) на виртуальных машинах (тип 1 и 2). Сам модуль в основном оболочка / API в библиотеке C, но не экскурсионно.

Я пытаюсь выяснить, затронут ли сам python или только модуль. Известно ли, что python сильно страдает при работе в виртуальной машине?

1
задан 23 January 2020 в 08:55
3 ответа

Из вашего вопроса нет никакого способа узнать, сравниваете ли вы яблоки с яблоками.

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

1
ответ дан 23 January 2020 в 19:27

Вы ничего не доказали, у вас есть множество переменных, которые вы не изолировали. Версия Python, версия операционной системы, аппаратные ресурсы, квоты ресурсов виртуальных машин, модель процессора и т. Д.


Определите, какие именно функции в вашем коде требуют времени. Визуализируйте это с помощью графиков пламени . Реализация выборки стека на основе Python была бы хороша, но я не знаю, насколько хорошо она захватывает функции C. В этом случае вы можете попробовать профилировщики на основе операционной системы (eBPF, xperf),которые имеют лучший обзор библиотеки C и ОС.

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

Найдите ограничивающий ресурс: ЦП, память, диск, сеть. Измеряйте эти ресурсы на уровне хоста с помощью инструментов мониторинга производительности.

Сравните результаты в разных средах, на «голом железе», на разных типах виртуальных машин, на разном оборудовании. Не перегружайте ресурсы хостов виртуальных машин, а не ЦП и определенно не ОЗУ. Это несправедливо по сравнению с выделенным хостом без операционной системы.


На самом деле, это общее исследование производительности, направленное на определение ограничивающего фактора в вашей среде. Использование Python просто может изменить время выполнения кода на профилирование и оптимизацию.

0
ответ дан 23 January 2020 в 19:27

Скорее всего, рассматриваемый код выполняет МНОГО переключения контекста (и / или гипервизор усугубляет переключение контекста, перемещая виртуальное ядро ​​вокруг физических ядер). Переключение контекста может быть примерно в 100 раз дороже при использовании гипервизора, чем при использовании «голого железа». Промахи кеша также могут быть большим фактором из-за того, что гипервизор распределяет виртуальные ядра по разным физическим ядрам.

Чтобы уменьшить некоторые из этих накладных расходов, прикрепите виртуальные ядра к физическим ядрам, предоставьте ВМ базовую топологию ЦП (сокеты / ядра / потоки), держите виртуальную машину полностью в пределах одного узла NUMA и не давайте guest - полный набор ядер / потоков ЦП, который у вас есть на хосте, если ваш код чувствителен к задержке кеширования / памяти.

Производительность гипервизора для различных рабочих нагрузок может быть значительно хуже, чем на «голом железе». Цифры получены много лет назад, но я достаточно регулярно проверяю эти вещи, и за последнее десятилетие многое не изменилось.

0
ответ дан 3 May 2020 в 15:43

Теги

Похожие вопросы