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:
parent
a1e7ed3670
commit
154ab7b2f9
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user