Add debug log for scheduler weight calculation

We have all the weighers enabled by default and each can have its own
multiplier making the final compute node order calculation pretty
complex. This patch adds some debug logging that helps understanding how
the final ordering was reached.

Change-Id: I7606d6eb3e08548c1df9dc245ab39cced7de1fb5
This commit is contained in:
Balazs Gibizer 2021-11-11 19:06:56 +01:00
parent a1e7ed3670
commit 154ab7b2f9

View File

@ -19,9 +19,14 @@ Pluggable Weighing support
import abc import abc
from oslo_log import log as logging
from nova import loadables from nova import loadables
LOG = logging.getLogger(__name__)
def normalize(weight_list, minval=None, maxval=None): def normalize(weight_list, minval=None, maxval=None):
"""Normalize the values in a list between 0 and 1.0. """Normalize the values in a list between 0 and 1.0.
@ -128,13 +133,40 @@ class BaseWeightHandler(loadables.BaseLoader):
for weigher in weighers: for weigher in weighers:
weights = weigher.weigh_objects(weighed_objs, weighing_properties) weights = weigher.weigh_objects(weighed_objs, weighing_properties)
LOG.debug(
"%s: raw weights %s",
weigher.__class__.__name__,
{(obj.obj.host, obj.obj.nodename): weight
for obj, weight in zip(weighed_objs, weights)}
)
# Normalize the weights # Normalize the weights
weights = normalize(weights, weights = list(
minval=weigher.minval, normalize(
maxval=weigher.maxval) weights, minval=weigher.minval, maxval=weigher.maxval))
LOG.debug(
"%s: normalized weights %s",
weigher.__class__.__name__,
{(obj.obj.host, obj.obj.nodename): weight
for obj, weight in zip(weighed_objs, weights)}
)
log_data = {}
for i, weight in enumerate(weights): for i, weight in enumerate(weights):
obj = weighed_objs[i] obj = weighed_objs[i]
obj.weight += weigher.weight_multiplier(obj.obj) * weight multiplier = weigher.weight_multiplier(obj.obj)
weigher_score = multiplier * weight
obj.weight += weigher_score
log_data[(obj.obj.host, obj.obj.nodename)] = (
f"{multiplier} * {weight}")
LOG.debug(
"%s: score (multiplier * weight) %s",
weigher.__class__.__name__,
{name: log for name, log in log_data.items()}
)
return sorted(weighed_objs, key=lambda x: x.weight, reverse=True) return sorted(weighed_objs, key=lambda x: x.weight, reverse=True)