Below section of leastexpensive.py is not using the number of threads of the provider for the expected usage. This results in incorrect selection of providers.
Both the job duration and consumed cpu time are set to the same 'expected_usage', which is 60 seconds by default. This is only correct in case the provider is using a single thread. For higher number of threads, the consumed cpu time should be the same multiple of the job duration.
Either the job duration should be divider by the number of threads, or the consumed cpu time would need to be multiplied by the number of threads.
The first option will favor providers with higher number of threads, the second option will favor provider with lower number of threads.
In case both are undesirable, a third option is to adjust both using the square root of the number of threads, or some other in-between solution.
expected_usage = []
for resource in linear.usage_vector:
if linear.price_for[resource] > self._max_price_for[resource]:
self._logger.debug(
"Rejected offer %s: price for '%s' higher than price cap %f.",
offer.id,
resource,
self._max_price_for[resource],
)
return SCORE_REJECTED
if linear.price_for[resource] < 0:
self._logger.debug("Rejected offer %s: negative price for '%s'", offer.id, resource)
return SCORE_REJECTED
expected_usage.append(self._expected_time_secs)
Below section of leastexpensive.py is not using the number of threads of the provider for the expected usage. This results in incorrect selection of providers.
Both the job duration and consumed cpu time are set to the same 'expected_usage', which is 60 seconds by default. This is only correct in case the provider is using a single thread. For higher number of threads, the consumed cpu time should be the same multiple of the job duration.
Either the job duration should be divider by the number of threads, or the consumed cpu time would need to be multiplied by the number of threads.
The first option will favor providers with higher number of threads, the second option will favor provider with lower number of threads.
In case both are undesirable, a third option is to adjust both using the square root of the number of threads, or some other in-between solution.