[PATCH] Stop collecting background stats

Kimchi was taking up CPU cycles when no one was using it. In order to reduce CPU overhead, only collect information when someone has called the get_list function. Signed-off-by: Christy Perez <christy@linux.vnet.ibm.com> --- src/kimchi/model/vms.py | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/src/kimchi/model/vms.py b/src/kimchi/model/vms.py index b5fdb12..0117fb0 100644 --- a/src/kimchi/model/vms.py +++ b/src/kimchi/model/vms.py @@ -81,16 +81,12 @@ def __init__(self, **kargs): self.conn = kargs['conn'] self.objstore = kargs['objstore'] self.caps = CapabilitiesModel(**kargs) - self.guests_stats_thread = BackgroundTask(GUESTS_STATS_INTERVAL, - self._update_guests_stats) - self.guests_stats_thread.start() - - def _update_guests_stats(self): - vm_list = self.get_list() - - for name in vm_list: + + @staticmethod + def _update_guests_stats(names, conn): + for name in names: try: - dom = VMModel.get_vm(name, self.conn) + dom = VMModel.get_vm(name, conn) vm_uuid = dom.UUIDString() info = dom.info() @@ -108,16 +104,17 @@ def _update_guests_stats(self): seconds = timestamp - prevStats.get('timestamp', 0) stats[vm_uuid].update({'timestamp': timestamp}) - self._get_percentage_cpu_usage(vm_uuid, info, seconds) - self._get_network_io_rate(vm_uuid, dom, seconds) - self._get_disk_io_rate(vm_uuid, dom, seconds) + VMsModel._get_percentage_cpu_usage(vm_uuid, info, seconds) + VMsModel._get_network_io_rate(vm_uuid, dom, seconds) + VMsModel._get_disk_io_rate(vm_uuid, dom, seconds) except Exception as e: # VM might be deleted just after we get the list. # This is OK, just skip. kimchi_log.debug('Error processing VM stats: %s', e.message) continue - def _get_percentage_cpu_usage(self, vm_uuid, info, seconds): + @staticmethod + def _get_percentage_cpu_usage(vm_uuid, info, seconds): prevCpuTime = stats[vm_uuid].get('cputime', 0) cpus = info[3] @@ -128,7 +125,8 @@ def _get_percentage_cpu_usage(self, vm_uuid, info, seconds): stats[vm_uuid].update({'cputime': info[4], 'cpu': percentage}) - def _get_network_io_rate(self, vm_uuid, dom, seconds): + @staticmethod + def _get_network_io_rate(vm_uuid, dom, seconds): prevNetRxKB = stats[vm_uuid].get('netRxKB', 0) prevNetTxKB = stats[vm_uuid].get('netTxKB', 0) currentMaxNetRate = stats[vm_uuid].get('max_net_io', 100) @@ -155,7 +153,8 @@ def _get_network_io_rate(self, vm_uuid, dom, seconds): stats[vm_uuid].update({'net_io': rate, 'max_net_io': max_net_io, 'netRxKB': netRxKB, 'netTxKB': netTxKB}) - def _get_disk_io_rate(self, vm_uuid, dom, seconds): + @staticmethod + def _get_disk_io_rate(vm_uuid, dom, seconds): prevDiskRdKB = stats[vm_uuid].get('diskRdKB', 0) prevDiskWrKB = stats[vm_uuid].get('diskWrKB', 0) currentMaxDiskRate = stats[vm_uuid].get('max_disk_io', 100) @@ -249,13 +248,15 @@ def create(self, params): return name def get_list(self): - return self.get_vms(self.conn) + return VMsModel.get_vms(self.conn) @staticmethod def get_vms(conn): - conn = conn.get() - names = [dom.name().decode('utf-8') for dom in conn.listAllDomains(0)] - return sorted(names, key=unicode.lower) + conn_ = conn.get() + names = [dom.name().decode('utf-8') for dom in conn_.listAllDomains(0)] + names = sorted(names, key=unicode.lower) + VMsModel._update_guests_stats(names, conn) + return names class VMModel(object): -- 2.1.0
participants (2)
-
Aline Manera
-
Christy Perez