Size: a a a

OpenNebula - русскоговорящее сообщество

2019 October 31

@

@i.am.not.root__ in OpenNebula - русскоговорящее сообщество
Нет, ну правда получается, если, например, взять 2 одинаковых сервера для гипервизора по 40 ядер каждый, создать два шаблона с параметром cpu 0.5 каждый и один с vcpu 4, второй с vcpu 8, разложить гостевые серверы с первым шаблоном на первый сервер, со вторым шаблоном на второй, в итоге, получится на первом хосте 80 ВМ и на втором 80, но виртуальных ядер на первом будет 320, на втором 640. Поскольку мы cpu указали одинаковым , то то у qemu на каждое виртуальное ядро будет вес одинаковый, и сгруппы будут процессорное время балансировать одинаково. И что получается... На первом сервере одно виртуальное ядро получит в два раза больше процессорного времени чем на втором?
источник

@

@i.am.not.root__ in OpenNebula - русскоговорящее сообщество
Интерес был в том что бы  использовать виртуализацию и иметь четкий максимальный overcommit CPU...
источник

ИИ

Игорь Исаенко in OpenNebula - русскоговорящее сообщество
Там все не так интуитивно
источник

@

@i.am.not.root__ in OpenNebula - русскоговорящее сообщество
А как?
источник

ИИ

Игорь Исаенко in OpenNebula - русскоговорящее сообщество
Я провел исследования, сделал выводы и хочу с вами поделиться.
У виртуалки в opennebula есть два параметра: CPU и VCPU.
И они значат не то, что вы думаете.

VCPU - это сколько ядер в виртуалке.
А ещё это - сколько ядер хоста может выжрать виртуалка.
Одно ядро виртуалки, если его нагрузить, выжирает одно ядро хоста.
Виртуалка с 4 VCPU, если их загрузить, нагрузит 4 ядра хоста.

CPU - бесполезный параметр.
opennebula позволяет выставлять приоритеты виртуалкам по части cpu.
Приоритеты выставляются через подсистему cgroups.
В cgroups есть параметр cpu.shares, который можно выставить процессу или группе процессов.
Два процесса с cpu.shares=100 поделят процессорное время ядра поровну.
Процессы с 100 и 200 поделят время, как 1/3 и 2/3 (каждый получит свой кусок от 100+200).
Так вот, CPU=1 у виртуалки просто выставляет ей cpu.shares=1024. И все.
CPU=0.5 - это cpu.shares=512.
CPU=0.01 - это cpu.shares=11.

Как это будет выглядеть на практике.
Допустим, есть хост с 1 ядром.
И мы запускаем 2 виртуалки с такими параметрами:

* v1: CPU=1 VCPU=1
* v2: CPU=1 VCPU=1

Если на v1 и v2 запустить нагрузку, они поделят одно реальное ядро пополам.
Если у v1 указать CPU=0.5, то он будет получать 33% одного реального ядра, а v2 - 66%.
Почему? Потому что их cpu.shares будут равны в сумме 1536. Доля v1 (512) в этом будет 33%, а доля v2 (1024) - 66%.
Так вот, если теперь у v2 указать CPU=0.5, то они снова будут делить ядро пополам.
Почему? 512+512 = 1024, и доля каждого (512) будет снова равна 50%.

CPU не отражает что-то сам по себе.
Он просто задает приоритет.
И он имеет смысл только в сравнении с CPU других виртуалок.
CPU=1 у всех виртуалок на хосте имеет такой же смысл, как CPU=0.01 или CPU=100.
Он имеет смысл только в одном случае: если у нас честный хостинг.
Т.е. если мы продаем виртуалки вообще без overselling'а.
Например, сервер на 24 ядра - это 24 виртуалки с одним виртуальным ядром.
Честно и не выгодно.
В этом случае параметр можно использовать.
opennebula честно считает отданные CPU и указывает их в "Allocated CPU".
источник

ИИ

Игорь Исаенко in OpenNebula - русскоговорящее сообщество
vcpu для виртуалки - это количество ядер. А для хоста - это количество процессов qemu для этой виртуалки.
cpu - это просто приоритет. Он работает для разделения ресурсов, когда виртуалок много.
0.5 cpu не ограничит qemu жрать половину ядра.
Если на хосте одна виртуалка, она будет жрать полное ядро (или два ядра, при vcpu=2).
источник

ИИ

Игорь Исаенко in OpenNebula - русскоговорящее сообщество
Я писал об этом тут где-то пол года назад. Можешь поискать по "cgroups".
источник

@

@i.am.not.root__ in OpenNebula - русскоговорящее сообщество
да, об этом и говорю, я уже код поправил под свои хотелки
источник

ИИ

Игорь Исаенко in OpenNebula - русскоговорящее сообщество
Суть в том, что если вы возьмете два одинаковых сервера и на втором сделаете в 2 раза больше витуалок (или vcpu), чем на первом, то.... да, на втором сервере виртуалки будут получать в 2 раза меньше cpu :-)
источник

ИИ

Игорь Исаенко in OpenNebula - русскоговорящее сообщество
Ну, просто не надо так делать :-)
источник

ИИ

Игорь Исаенко in OpenNebula - русскоговорящее сообщество
Виртуалки все равно будут потреблять cpu на 100%
источник

@

@i.am.not.root__ in OpenNebula - русскоговорящее сообщество
Игорь Исаенко
Ну, просто не надо так делать :-)
не надо, но если есть такая возможность пусть даже синтетическая, то это не хорошо 😞надо исправить ну это мое имхо)))
источник

ИИ

Игорь Исаенко in OpenNebula - русскоговорящее сообщество
Просто нет механизма ограничить потребление cpu сверху. Ну или есть, но он нигде не используется.
источник

@

@i.am.not.root__ in OpenNebula - русскоговорящее сообщество
да, у меня в другом желание, мне надо гарантировать что на гипервизоре не привысится отношение CPU/vCPU = 1/4, например
источник

@

@i.am.not.root__ in OpenNebula - русскоговорящее сообщество
при этом вес для cgroup у vCPU одинаков
источник

ИИ

Игорь Исаенко in OpenNebula - русскоговорящее сообщество
А, для этого нужно просто при создании виртуалки использовать правило cpu = 1/4 vcpu
источник

ИИ

Игорь Исаенко in OpenNebula - русскоговорящее сообщество
Заводишь виртуалку с 1 vcpu, ставь ей 0.25 cpu.
Заводишь с 4 vcpu, ставь 1 cpu.
источник

ИИ

Игорь Исаенко in OpenNebula - русскоговорящее сообщество
Вес для cpgroup ставится исходя из cpu
источник

@

@i.am.not.root__ in OpenNebula - русскоговорящее сообщество
Игорь Исаенко
Вес для cpgroup ставится исходя из cpu
вот именно , он будет отличаться, у той ВМ в шаблоне которой CPU = 0.25, shares  будет  0.25 *1024 = 256. Вот кусок из кода
file << "\t\t<shares>"<< ceil(cpu * CGROUP_BASE_CPU_SHARES) << "</shares>\n";)
создав вторую виртуалку с CPU = 1 я получу 1*1024 = 1024, представим, что они оказываются на одном гипервизоре, и по стечению обстоятельств  vCPU одной ВМ, и vCPU второй  работают с одним физическим ядром. vCPU первой ВМ получают меньше процессорного времени чем vCPU второй, а я хочется что бы было одинаково. Виртуальные ядра  должны иметь одинаковое процессорное время при балансировке вне зависимости от их количества в ВМ.
источник

ИИ

Игорь Исаенко in OpenNebula - русскоговорящее сообщество
Ага. Я могу сказать решение, к которому я пришел. Просто всем виртуалкам ставить cpu = 0.01. Или cpu = 0.01 * vcpu. Везде. Тогда будет пофиг, на каком гипервизоре виртуалки.
источник