DRS
DRS (система распределения ресурсов) настраивается на кластер и выполняет роль "выравнивателя" выбранного ресурса по всем его узлам.
Описание работы
В начале каждого цикла работы сервиса DRS через заданный интервал (Тайм-аут между проверками и попытками переезда виртуальных машин) происходит группировка узлов кластера в зависимости от Типа собираемых метрик.
Далее считается Cреднеквадратичное (стандартное) отклонение нагрузки узлов кластера в процентах. Если оно меньше или равно Пределу среднеквадратичного отклонения для начала работы DRS, то никаких действий не происходит до следующего цикла. Если отклонение больше заданного значения, то создается карта использования ресурсов кластера, суммированная по узлам, и выбирается наиболее нагруженный сервер.
После чего происходит выбор ВМ, миграция которой удовлетворит требования к нагрузке на все узлы кластера. Для этого для всех включенных ВМ наиболее нагруженного узла последовательно симулируется изменение нагрузки на серверы после миграции на все остальные узлы кластера с последующим расчетом возможного среднеквадратичного отклонения нагрузки кластера. В качестве целевой ВМ и целевого узла для "живой" миграции выбирается та комбинация, после выполнения которой среднеквадратичное отклонение нагрузки на серверы кластера будет минимальным.
Если ВМ для миграции или узел назначения не найдены, то ничего не происходит до следующего цикла.
После отработки механизма предсказания нагрузки система определяет ВМ для миграции, узел-источник и узел назначения.
Далее, если в Режиме создания виртуальных машин и воздействий задан SOFT, то появляется подсказка с предложением миграции ВМ, если же задан HARD, то происходит попытка выполнения миграции целевой ВМ на узел назначения.
Cреднеквадратичное отклонение (подсчёт)
Детальные текущие параметры можно получить для кластера и узла, выполнив GET запросы
http://{CONTROLLER_IP}/api/clusters/{CLUSTER_ID}/drs-stats/
и
http://{CONTROLLER_IP}/api/clusters/{NODE_ID}/drs-stats/
.
Центральный prometheus находится по адресу http://{CONTROLLER_IP}:9090
.
Подсчёт domains_mem_deviation_percent
float
cluster.domains_mem_deviation_percent = std(list(cluster.domains_by_node_mem_used_percent.values() or [0]))
dict
cluster.domains_by_node_mem_used_percent = {node.uuid: node.domains_mem_used_percent for node in cluster.active_nodes}
float
node.domains_mem_used_percent = prometheus_client.domains_mem_used(node) / node.memory_count * 100
float
prometheus_client.domains_mem_used(node) = prometheus_client.libvirt_domains_memory_usage_mb_sum(node)
float
prometheus_client.libvirt_domains_memory_usage_mb_sum(node) = scalar((sum(libvirt_mem_stats_actual_kibibytes{node}) - sum(libvirt_mem_stats_usable_kibibytes{node})) / 1024)
Подсчёт domains_cpu_deviation_percent
float
cluster.domains_cpu_deviation_percent = std(list(cluster.domains_by_node_cpu_used_percent.values() or [0]))
dict
cluster.domains_by_node_mem_used_percent = {node.uuid: node.domains_cpu_used_percent for node in cluster.active_nodes}
float
node.domains_cpu_used_percent = prometheus_client.domains_cpu_used_percent(node)
float
prometheus_client.domains_cpu_used_percent(node) = prometheus_client.libvirt_cpu_rate_sum(node) * 100
float
prometheus_client.libvirt_cpu_rate_sum(node) = scalar(avg by (node) (irate(node_cpu_guest_seconds_total{node}[3m])))