Оптимизация программного обеспечения для виртуальных машин - PullRequest
12 голосов
/ 05 марта 2009

Когда вы знаете, что ваше программное обеспечение (не драйвер, не часть операционной системы, а просто приложение) будет работать в основном в виртуализированной среде, существуют ли стратегии для оптимизации вашего кода и / или настроек компилятора? Или какие-нибудь руководства для того, что вы должны и не должны делать?

Это не увеличение производительности на 0.0x%, а, может быть, просто может быть, есть простые вещи, которые резко улучшат производительность, или вещи, которые кажутся простыми, но, как известно, являются катастрофическими в виртуальных средах. Например, включение CONFIG_PARAVIRT в сборке ядра легко и может значительно повысить производительность. Сейчас я ищу похожие вещи для приложений, если они есть.

В моем случае это будет C ++ Code и, вероятно, VMWare, но я хочу сохранить этот вопрос как можно более независимым от языка / продукта. Интересно, существуют ли такие стратегии или это будет пустой тратой времени - ведь концепция виртуализации заключается в том, что вам не нужно слишком беспокоиться об этом.

Ответы [ 4 ]

4 голосов
/ 05 марта 2009

Я обнаружил, что это все о вводе / выводе.

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

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

В большинстве реализаций существует большое количество конфликтов ввода-вывода между виртуальными машинами, я не видел ни одной, которая бы избегала этого или обрабатывала это разумно.

Так что используйте ramdisc для временных файлов, если можете, но не заставляйте его поменяться, потому что это было бы еще хуже.

3 голосов
/ 05 марта 2009

Единственный совет, который я могу вам дать, это осторожное использование mlock () / mlockall () .. при поиске драйверов с ошибками.

Например, если гость Xen загружен с 1 ГБ, а затем увеличен до 512 МБ, очень типично, что привилегированный домен НЕ смотрел на то, сколько памяти паравиртуализированное ядро ​​фактически обещало процессам (то есть Committed_AS). На самом деле, с Xen, если это значение не помещено в Xenbus, привилегированный хост не имеет представления о том, что будет делать такой воздушный шар. Я считаю, что это также совпадает с KVM, в зависимости от того, как настроено ядро ​​.. но ваш вопрос предполагает, что мы ничего не знаем о таких вещах:)

Итак, защитите вещи (будьте осторожны, но осторожны), которые просто не могут быть выгружены, всегда учитывайте сценарий «небо падает».

Аналогичным образом, использование posix_fadvise () / posix_madvise (), чтобы сообщить ядру PV, насколько вы делаете или не нуждаетесь в буферизации, всегда хорошая идея.

Кроме того, вы мало что можете сделать ... поскольку вы говорите только с паравиртуализированным ядром, которое разработано так, чтобы процессы вообще не обращали внимания на виртуализацию.

Я не очень много использую KVM (пока), хотя планирую изучить его в будущем. Тем не менее, 90% того, что я пишу в последнее время, специально разработано для работы с паравиртуализированными гостями Xen. Извините, что немного ориентируюсь на Xen / C, но это мой опыт и pv_ops в основной строке (скоро также xen-0 ops):)

Хороший вопрос, кстати:)

Edit:

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

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

Извините за двусмысленность. Лучшая фраза, которую я мог придумать, была «осторожная, но осторожная».

1 голос
/ 05 марта 2009

Вещи, которые медленны на реальном оборудовании, еще медленнее, когда система виртуализирована. От того, насколько медленнее они становятся, зависит от используемой технологии виртуализации.

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

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

1 голос
/ 05 марта 2009

Мой единственный совет - держите память и IO, если возможно, на низком уровне.

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

...