Added a workaround when the current CPU time < the previous CPU time

This commit is contained in:
Anton Beloglazov 2012-11-13 11:54:30 +11:00
parent 39bc271c38
commit 1466dccd5a
2 changed files with 29 additions and 17 deletions

View File

@ -169,6 +169,7 @@ def init_state(config):
return {'previous_time': 0.,
'previous_cpu_time': dict(),
'previous_cpu_mhz': dict(),
'previous_host_cpu_time_total': 0.,
'previous_host_cpu_time_busy': 0.,
'previous_overload': -1,
@ -256,6 +257,7 @@ def execute(config, state):
cleanup_local_vm_data(vm_path, vms_removed)
for vm in vms_removed:
del state['previous_cpu_time'][vm]
del state['previous_cpu_mhz'][vm]
log.info('Started VM data collection')
current_time = time.time()
@ -265,6 +267,7 @@ def execute(config, state):
state['previous_time'],
current_time,
vms_current.keys(),
state['previous_cpu_mhz'],
added_vm_data)
log.info('Completed VM data collection')
@ -302,6 +305,7 @@ def execute(config, state):
state['previous_time'] = current_time
state['previous_cpu_time'] = cpu_time
state['previous_cpu_mhz'] = cpu_mhz
state['previous_host_cpu_time_total'] = host_cpu_time_total
state['previous_host_cpu_time_busy'] = host_cpu_time_busy
@ -543,7 +547,8 @@ def append_host_data_remotely(db, hostname, host_cpu_mhz):
@contract
def get_cpu_mhz(vir_connection, physical_core_mhz, previous_cpu_time,
previous_time, current_time, current_vms, added_vm_data):
previous_time, current_time, current_vms,
previous_cpu_mhz, added_vm_data):
""" Get the average CPU utilization in MHz for a set of VMs.
:param vir_connection: A libvirt connection object.
@ -564,6 +569,9 @@ def get_cpu_mhz(vir_connection, physical_core_mhz, previous_cpu_time,
:param current_vms: A list of VM UUIDs.
:type current_vms: list(str)
:param previous_cpu_mhz: A dict of VM UUIDs and previous CPU MHz.
:type previous_cpu_mhz: dict(str : int)
:param added_vm_data: A dict of VM UUIDs and the corresponding data.
:type added_vm_data: dict(str : list(int))
@ -580,22 +588,26 @@ def get_cpu_mhz(vir_connection, physical_core_mhz, previous_cpu_time,
for uuid, cpu_time in previous_cpu_time.items():
current_cpu_time = get_cpu_time(vir_connection, uuid)
if current_cpu_time == 0:
if current_cpu_time < cpu_time:
if log.isEnabledFor(logging.DEBUG):
log.debug('VM %s: received a 0 current CPU time, ' +
'resetting to the previous value: %.15f',
uuid, cpu_time)
current_cpu_time = cpu_time
if log.isEnabledFor(logging.DEBUG):
log.debug('VM %s: previous CPU time %d, ' +
'current CPU time %d, ' +
'previous time %.10f, ' +
'current time %.10f',
uuid, cpu_time, current_cpu_time,
previous_time, current_time)
cpu_mhz[uuid] = calculate_cpu_mhz(physical_core_mhz, previous_time,
current_time, cpu_time,
current_cpu_time)
log.debug('VM %s: current_cpu_time < cpu_time: ' +
'previous CPU time %d, ' +
'current CPU time %d, ' +
uuid, cpu_time, current_cpu_time)
log.debug('VM %s: using previous CPU MHz %d, ' +
uuid, previous_cpu_mhz[uuid])
cpu_mhz[uuid] = previous_cpu_mhz[uuid]
else:
if log.isEnabledFor(logging.DEBUG):
log.debug('VM %s: previous CPU time %d, ' +
'current CPU time %d, ' +
'previous time %.10f, ' +
'current time %.10f',
uuid, cpu_time, current_cpu_time,
previous_time, current_time)
cpu_mhz[uuid] = calculate_cpu_mhz(physical_core_mhz, previous_time,
current_time, cpu_time,
current_cpu_time)
previous_cpu_time[uuid] = current_cpu_time
if log.isEnabledFor(logging.DEBUG):
log.debug('VM %s: CPU MHz %d', uuid, cpu_mhz[uuid])

View File

@ -464,7 +464,7 @@ class Collector(TestCase):
result = collector.get_cpu_mhz(
connection, cpus, previous_cpu_time,
previous_time, current_time, vms,
added_vm_data)
{}, added_vm_data)
assert result[0] == current_cpu_time
assert result[1] == cpu_mhz