LINUX.ORG.RU
решено ФорумAdmin

KVM и многопроцессорные гостевые машины


0

2

Добрый вечер!

Давно играюсь с виртуализацией, в т.ч. и на боевых серверах. Сейчас обнаружил, что описанное ниже проявляется и в KVM тоже (до сих пор считал, что нет). А именно, если выполняются следующие условия: 1) количество виртуальных процессоров во всех гостевых системах больше, чем физических процессорных ядер; и 2) какая-либо из виртуальных машин сконфигурирована более чем с одним процессором/ядром — то в этой машине, да и в системе в целом, наблюдаются жуткие тормоза и неадекватная загрузка процессора (-ов). Впервые столкнулся с таким в WMWare Workstation, затем в VMWare Server, и считал это багом или особенностью VMWare, а сейчас увидел это и на KVM. Немного погуглив, нашёл следующее:

Virtualized CPUs are overcommitted best when each virtualized guest only has a single VCPU. The Linux scheduler is very efficient with this type of load. KVM should safely support guests with loads under 100% at a ratio of five VCPUs.

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

Assigning guests VCPUs up to the number of physical cores is appropriate and works as expected. For example, running virtualized guests with four VCPUs on a quad core host. Guests with less than 100% loads should function effectively in this setup.

А вот здесь не очень понятно. То, что не надо делать виртуалку с числом процессоров больше, чем их физически есть, это понятно. Но означает ли эта фраза, что физических процессоров/ядер должно хватать на _все_ запущенные виртуалки? Мне как-то казалось, что это было бы не очень логично, но на практике получается, что это так и есть. К примеру, одна двухпроцессорная виртуалка на двухъядерном процессоре работала нормально, пока не добавилась ещё одна двухпроцессорная виртуалка. После этого - перманентные тормоза и 100% загрузка процессора. Примерно то же наблюдалось, когда к куче нормально работающих однопроцессорных виртуалок (в количестве, намного превышающем количество физических ядер) добавилась одна двухпроцессорная.

Вопрос состоит в следующем: это дело принципиально можно как-то победить в линуксе? Если это принципиально непобедимо в KVM, может какой-то другой гипервизор справится? Как с этим обстоит в VirtualBox, к примеру?

Я знаю один гипервизор, который такую ситуацию пережёвывает хорошо. Это VMWare ESXi. Но это не совсем линукс, к сожалению. А хочется именно его.

Спасибо.

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

Также у меня работает несколько гипервизоров XEN (4.0 и 4.1), в них крутится приличное количество виртуалок, в том числе многоядерных.

Например, на шестиядерном сервере крутится около десятка машин, однопроцессорных нет, минимум два процессора, максимум четыре. И ничего, стабильно работают.

lukash
()
Ответ на: комментарий от lukash

А если кинуть нагрузку такую, чтобы количество загруженых процессоров по всем виртуалкам в сумме превысило лимит хоста? Типа чтобы 8 процов в виртуалке были заняты на 100%,

no-dashi ★★★★★
()

Читаю литературу на эту тему. Оказывается, там всё сложно. Самый простой и самый первый реализованный алгоритм для работы многопроцессорных виртуалок был такой: ждём, пока освободится нужное количество процессоров, и запускаем виртуалку одновременно на всех. Понятное дело, что с ростом нагрузки и числа виртуальных процессоров найти одновременно нужное количество становится всё труднее. Это было как раз в VMWare Server и ранних версиях ESX. Потом в VMWare изобрели «relaxed co-scheduling», суть которого заключается в том, что одновременно могут запускаться не все процессоры виртуалки, а только некоторые, как они вычисляют какие именно - не понял, понял только, что считают расхождения (skew). Именно поэтому IMHO VMWare ESXi перемалывает многопроцессорные гостевые системы. Как с этим обстоит дело в XEN и VirtualBox - внятной информации на глаза не попадалось, а специально не искал.

Что касается KVM, то тут, вроде бы всё просто - оно вообще планированием не занимается, а просто запускает по процессу на каждый виртуальный процессор гостевой системы, а уж ядро хост-системы само решает, что и когда запускать. Не нашёл информации, как именно обеспечивается синхронизация выполняемых процессов, эмулирующих процессоры виртуалки, ведь ядро линукса по собственной воле явно этого делать не будет. Ясно только, что эта синхронизация в описанных случаях лажает, и либо сама грузит процессор (встречал описание в том духе, что блокируется первый освободившийся процессор, и ожидается освобождения остальных, но это было про VMWare), либо синхронизирует из рук вон плохо, что приводит к неадекватному поведению уже внутри виртуалки. Например, виндовый объект синхронизации CriticalSection, которых там, в винде, что грязи — он явно себя очень плохо будет чувствовать, если в многопроцессорной системе один процессор «пропал» и долго не выполняет код.

Пока понятно, что смена ядра может помочь (а может и нет) - надо пробовать. Я пока крутил это всё на Centos 5. Можно попробовать 6-й, но там был неприятный баг в libvirt (не работали контроллеры virtio pvscsi в гостевых системах), надеюсь уже исправили.

shamus24
() автор топика

Может у тебя kvm старый?

PS скорее всего xen будет работать по-другому, но я не могу это гарантировать, нету его под рукой. И что у тебя в виртуалках крутится?

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

KVM, конечно, старый. Откуда ж в пятом центосе новому взяться? Но основная масса виртуалок пока крутится на VMWare, это я всё прикидываю, как бы с него слезть, и обнаружил вот такую ерунду с KVM.

В виртуалках - Windows 2003, Windows 2008, Centos, FreeBSD и XP (более чем по одной штуке каждого наименования).

shamus24
() автор топика

почему бы просто не сделать гостей однопроцессорными?

redixin ★★★★
()
Ответ на: комментарий от shamus24

Откуда ж в пятом центосе новому взяться?

Ой ё.. Мой совет - обнови. Для хоста выбор ОС не так важен, лишь бы kvm был свежий и обновления были. Ну или до шестого обнови (предварительно потестив на другом компе как это работает), подозреваю что проблема уйдёт.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Попробовал Centos 6.2. Понравилось. Сделал две виртуалки по 4 процессора и на обеих одновременно поставил Windows 2008 и MSSQL-Server 2008 (кто не в курсе - очень ресурсоёмкие операции). По крайней мере они друг другу не мешали и не сильно тормозили. Физически на машине 4 ядра (с учетом HT - 8). Правда, есть вероятность, что даже если бы оно томозило, я бы мог не заметить - проц сильно быстрый. Но эта вероятность небольшая.

И баг с virtio починенный уже. Вывод - надо ставить :-)

shamus24
() автор топика
Ответ на: комментарий от shamus24

(пока никто не видит) rhel4/5 были (тормозным) говном, не понимаю как его вообще на сервера можно было ставить.

true_admin ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.