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(a)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