From d220cc5d524eb34e8b32a8143c849d08a72ef731 Mon Sep 17 00:00:00 2001 From: Cole Robinson Date: Tue, 11 Feb 2014 15:29:30 -0500 Subject: [PATCH] preferences: Allow disabling VM CPU poll With this, the only libvirt API call we hit on each tick is the connection nodeinfo. --- .../org.virt-manager.virt-manager.gschema.xml | 6 ++- ui/preferences.ui | 44 ++++++++++++++++--- virtManager/config.py | 6 +++ virtManager/details.py | 3 +- virtManager/domain.py | 21 +++++++-- virtManager/manager.py | 39 +++++++++------- virtManager/preferences.py | 7 +++ 7 files changed, 98 insertions(+), 28 deletions(-) diff --git a/data/org.virt-manager.virt-manager.gschema.xml b/data/org.virt-manager.virt-manager.gschema.xml index 493b5baf..f9a7934c 100644 --- a/data/org.virt-manager.virt-manager.gschema.xml +++ b/data/org.virt-manager.virt-manager.gschema.xml @@ -116,11 +116,15 @@ The statistics update interval in seconds + + true + Poll VM CPU stats + Whether or not the app will poll VM CPU statistics + false Poll disk i/o stats Whether or not the app will poll VM disk i/o statistics - false diff --git a/ui/preferences.ui b/ui/preferences.ui index f986e5de..c0e9e683 100644 --- a/ui/preferences.ui +++ b/ui/preferences.ui @@ -116,7 +116,7 @@ 0 - 1 + 2 1 1 @@ -132,7 +132,7 @@ 1 - 1 + 2 1 1 @@ -148,7 +148,7 @@ 0 - 2 + 3 1 1 @@ -164,7 +164,7 @@ 1 - 2 + 3 1 1 @@ -180,7 +180,7 @@ 0 - 3 + 4 1 1 @@ -196,7 +196,7 @@ 1 - 3 + 4 1 1 @@ -256,6 +256,38 @@ 1 + + + True + False + 0 + Poll C_PU usage + True + prefs-stats-enable-cpu + + + 0 + 1 + 1 + 1 + + + + + True + True + False + 0 + True + + + + 1 + 1 + 1 + 1 + + diff --git a/virtManager/config.py b/virtManager/config.py index c7cde225..dd624e9a 100644 --- a/virtManager/config.py +++ b/virtManager/config.py @@ -343,6 +343,8 @@ class vmmConfig(object): # Disable/Enable different stats polling + def get_stats_enable_cpu_poll(self): + return self.conf.get("/stats/enable-cpu-poll") def get_stats_enable_disk_poll(self): return self.conf.get("/stats/enable-disk-poll") def get_stats_enable_net_poll(self): @@ -350,6 +352,8 @@ class vmmConfig(object): def get_stats_enable_memory_poll(self): return self.conf.get("/stats/enable-memory-poll") + def set_stats_enable_cpu_poll(self, val): + self.conf.set("/stats/enable-cpu-poll", val) def set_stats_enable_disk_poll(self, val): self.conf.set("/stats/enable-disk-poll", val) def set_stats_enable_net_poll(self, val): @@ -357,6 +361,8 @@ class vmmConfig(object): def set_stats_enable_memory_poll(self, val): self.conf.set("/stats/enable-memory-poll", val) + def on_stats_enable_cpu_poll_changed(self, cb, row=None): + return self.conf.notify_add("/stats/enable-cpu-poll", cb, row) def on_stats_enable_disk_poll_changed(self, cb, row=None): return self.conf.notify_add("/stats/enable-disk-poll", cb, row) def on_stats_enable_net_poll_changed(self, cb, row=None): diff --git a/virtManager/details.py b/virtManager/details.py index 81ec953f..d8b0d1ed 100644 --- a/virtManager/details.py +++ b/virtManager/details.py @@ -2498,7 +2498,8 @@ class vmmDetails(vmmGObjectUI): dsk_txt = _("Disabled") net_txt = _("Disabled") - cpu_txt = "%d %%" % self.vm.guest_cpu_time_percentage() + if self.config.get_stats_enable_cpu_poll(): + cpu_txt = "%d %%" % self.vm.guest_cpu_time_percentage() if self.config.get_stats_enable_memory_poll(): cur_vm_memory = self.vm.stats_memory() diff --git a/virtManager/domain.py b/virtManager/domain.py index 93afe1fe..ae14109a 100644 --- a/virtManager/domain.py +++ b/virtManager/domain.py @@ -261,6 +261,7 @@ class vmmDomain(vmmLibvirtObject): self.mem_stats_supported = False self._enable_mem_stats = False + self._enable_cpu_stats = False self._enable_net_poll = False self._stats_net_supported = True @@ -303,19 +304,23 @@ class vmmDomain(vmmLibvirtObject): self.toggle_sample_network_traffic() self.toggle_sample_disk_io() self.toggle_sample_mem_stats() + self.toggle_sample_cpu_stats() self.force_update_status(from_event=True) # Hook up listeners that need to be cleaned up + self.add_gconf_handle( + self.config.on_stats_enable_cpu_poll_changed( + self.toggle_sample_cpu_stats)) self.add_gconf_handle( self.config.on_stats_enable_net_poll_changed( - self.toggle_sample_network_traffic)) + self.toggle_sample_network_traffic)) self.add_gconf_handle( self.config.on_stats_enable_disk_poll_changed( - self.toggle_sample_disk_io)) + self.toggle_sample_disk_io)) self.add_gconf_handle( self.config.on_stats_enable_memory_poll_changed( - self.toggle_sample_mem_stats)) + self.toggle_sample_mem_stats)) self.connect("status-changed", self._update_start_vcpus) self.connect("pre-startup", self._prestartup_nodedev_check) @@ -1422,6 +1427,9 @@ class vmmDomain(vmmLibvirtObject): ################# def _sample_cpu_stats(self, info, now): + if not self._enable_cpu_stats: + return 0, 0, 0, 0 + prevCpuTime = 0 prevTimestamp = 0 cpuTime = 0 @@ -1523,6 +1531,9 @@ class vmmDomain(vmmLibvirtObject): def toggle_sample_mem_stats(self, ignore=None): self._enable_mem_stats = self.config.get_stats_enable_memory_poll() + def toggle_sample_cpu_stats(self, ignore=None): + self._enable_cpu_stats = self.config.get_stats_enable_cpu_poll() + ################### # Stats accessors # @@ -1838,7 +1849,9 @@ class vmmDomain(vmmLibvirtObject): if not self._using_events(): self._invalidate_xml() - info = self._backend.info() + info = [] + if not self._using_events() or self._enable_cpu_stats: + info = self._backend.info() if stats_update: self._tick_stats(info) diff --git a/virtManager/manager.py b/virtManager/manager.py index 4b88d3e2..7aade137 100644 --- a/virtManager/manager.py +++ b/virtManager/manager.py @@ -189,6 +189,7 @@ class vmmManager(vmmGObjectUI): # Initialize stat polling columns based on global polling # preferences (we want signal handlers for this) + self.enable_polling(COL_GUEST_CPU) self.enable_polling(COL_DISK) self.enable_polling(COL_NETWORK) self.enable_polling(COL_MEM) @@ -277,15 +278,17 @@ class vmmManager(vmmGObjectUI): # Register callbacks with the global stats enable/disable values # that disable the associated vmlist widgets if reporting is disabled self.add_gconf_handle( - self.config.on_stats_enable_disk_poll_changed(self.enable_polling, - COL_DISK)) + self.config.on_stats_enable_cpu_poll_changed( + self.enable_polling, COL_GUEST_CPU)) self.add_gconf_handle( - self.config.on_stats_enable_net_poll_changed(self.enable_polling, - COL_NETWORK)) + self.config.on_stats_enable_disk_poll_changed( + self.enable_polling, COL_DISK)) + self.add_gconf_handle( + self.config.on_stats_enable_net_poll_changed( + self.enable_polling, COL_NETWORK)) self.add_gconf_handle( self.config.on_stats_enable_memory_poll_changed( - self.enable_polling, - COL_MEM)) + self.enable_polling, COL_MEM)) self.toggle_guest_cpu_usage_visible_widget() self.toggle_host_cpu_usage_visible_widget() @@ -982,6 +985,9 @@ class vmmManager(vmmGObjectUI): return cmp(obj1.network_traffic_rate(), obj2.network_traffic_rate()) def enable_polling(self, column): + if column == COL_GUEST_CPU: + widgn = ["menu_view_stats_guest_cpu", "menu_view_stats_host_cpu"] + do_enable = self.config.get_stats_enable_cpu_poll() if column == COL_DISK: widgn = "menu_view_stats_disk" do_enable = self.config.get_stats_enable_disk_poll() @@ -991,18 +997,19 @@ class vmmManager(vmmGObjectUI): elif column == COL_MEM: widgn = "menu_view_stats_memory" do_enable = self.config.get_stats_enable_memory_poll() - widget = self.widget(widgn) - tool_text = "" + for w in util.listify(widgn): + widget = self.widget(w) + tool_text = "" - if do_enable: - widget.set_sensitive(True) - else: - if widget.get_active(): - widget.set_active(False) - widget.set_sensitive(False) - tool_text = _("Disabled in preferences dialog.") - widget.set_tooltip_text(tool_text) + if do_enable: + widget.set_sensitive(True) + else: + if widget.get_active(): + widget.set_active(False) + widget.set_sensitive(False) + tool_text = _("Disabled in preferences dialog.") + widget.set_tooltip_text(tool_text) def _toggle_graph_helper(self, do_show, col, datafunc, menu): img = -1 diff --git a/virtManager/preferences.py b/virtManager/preferences.py index 71cac2c7..8f546bb3 100644 --- a/virtManager/preferences.py +++ b/virtManager/preferences.py @@ -45,6 +45,7 @@ class vmmPreferences(vmmGObjectUI): self.refresh_add_spice_usbredir() self.refresh_storage_format() self.refresh_cpu_default() + self.refresh_cpu_poll() self.refresh_disk_poll() self.refresh_net_poll() self.refresh_memory_poll() @@ -71,6 +72,7 @@ class vmmPreferences(vmmGObjectUI): "on_prefs_add_spice_usbredir_changed": self.change_add_spice_usbredir, "on_prefs_storage_format_changed": self.change_storage_format, "on_prefs_cpu_default_changed": self.change_cpu_default, + "on_prefs_stats_enable_cpu_toggled": self.change_cpu_poll, "on_prefs_stats_enable_disk_toggled": self.change_disk_poll, "on_prefs_stats_enable_net_toggled": self.change_net_poll, "on_prefs_stats_enable_memory_toggled": self.change_memory_poll, @@ -214,6 +216,9 @@ class vmmPreferences(vmmGObjectUI): val = self.config.get_default_cpu_setting(raw=True) uiutil.set_row_selection(combo, val) + def refresh_cpu_poll(self): + self.widget("prefs-stats-enable-cpu").set_active( + self.config.get_stats_enable_cpu_poll()) def refresh_disk_poll(self): self.widget("prefs-stats-enable-disk").set_active( self.config.get_stats_enable_disk_poll()) @@ -355,6 +360,8 @@ class vmmPreferences(vmmGObjectUI): typ = uiutil.get_list_selection(src, 0) or "default" self.config.set_default_cpu_setting(typ.lower()) + def change_cpu_poll(self, src): + self.config.set_stats_enable_cpu_poll(src.get_active()) def change_disk_poll(self, src): self.config.set_stats_enable_disk_poll(src.get_active()) def change_net_poll(self, src):