From 2dee485da7a6f2cdf96525fabc18a8c27c8be570 Mon Sep 17 00:00:00 2001 From: Chen Hanxiao Date: Sat, 14 Apr 2018 16:39:06 +0800 Subject: [PATCH] inspector: memory: use usable of memoryStats if available Since kernel v4.6, virtio balloon driver commit 5057dcd0f introduced metric VIRTIO_BALLOON_S_AVAIL, corresponding to 'Available' in /proc/meminfo. Libvirt exposed this metric as 'usable'. As 'Available' of meminfo is an estimate of how much memory is available for starting new applications, without swapping. It's a better metric for calculating memory_usage. Change-Id: I3b935f1fc2ed74ca45b26990c4f2bd5996e1dfea Signed-off-by: Chen Hanxiao --- ceilometer/compute/virt/libvirt/inspector.py | 5 ++++- .../compute/virt/libvirt/test_inspector.py | 21 +++++++++++++++++++ ...-metric-if-available-970ee58e8fdeece6.yaml | 3 +++ 3 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 releasenotes/notes/use-usable-metric-if-available-970ee58e8fdeece6.yaml diff --git a/ceilometer/compute/virt/libvirt/inspector.py b/ceilometer/compute/virt/libvirt/inspector.py index 4847e269e1..80fc29e15c 100755 --- a/ceilometer/compute/virt/libvirt/inspector.py +++ b/ceilometer/compute/virt/libvirt/inspector.py @@ -151,7 +151,10 @@ class LibvirtInspector(virt_inspector.Inspector): memory_swap_in = memory_swap_out = None memory_stats = domain.memoryStats() # Stat provided from libvirt is in KB, converting it to MB. - if 'available' in memory_stats and 'unused' in memory_stats: + if 'usable' in memory_stats and 'available' in memory_stats: + memory_used = (memory_stats['available'] - + memory_stats['usable']) / units.Ki + elif 'available' in memory_stats and 'unused' in memory_stats: memory_used = (memory_stats['available'] - memory_stats['unused']) / units.Ki if 'rss' in memory_stats: diff --git a/ceilometer/tests/unit/compute/virt/libvirt/test_inspector.py b/ceilometer/tests/unit/compute/virt/libvirt/test_inspector.py index 4b19ab8bb6..ed30732c28 100755 --- a/ceilometer/tests/unit/compute/virt/libvirt/test_inspector.py +++ b/ceilometer/tests/unit/compute/virt/libvirt/test_inspector.py @@ -474,6 +474,27 @@ class TestLibvirtInspection(base.BaseTestCase): self.assertIsNone(stats.memory_swap_in) self.assertIsNone(stats.memory_swap_out) + def test_inspect_memory_with_usable(self): + domain = mock.Mock() + domain.info.return_value = (0, 0, 0, 2, 999999) + domain.memoryStats.return_value = {'available': 76800, + 'rss': 30000, + 'swap_in': 5120, + 'swap_out': 8192, + 'unused': 25600, + 'usable': 51200} + conn = mock.Mock() + conn.domainListGetStats.return_value = [({}, {})] + conn.lookupByUUIDString.return_value = domain + + with mock.patch('ceilometer.compute.virt.libvirt.utils.' + 'refresh_libvirt_connection', return_value=conn): + stats = self.inspector.inspect_instance(self.instance, None) + self.assertEqual(25600 / units.Ki, stats.memory_usage) + self.assertEqual(30000 / units.Ki, stats.memory_resident) + self.assertEqual(5120 / units.Ki, stats.memory_swap_in) + self.assertEqual(8192 / units.Ki, stats.memory_swap_out) + def test_inspect_perf_events_libvirt_less_than_2_3_0(self): domain = mock.Mock() domain.info.return_value = (0, 0, 51200, 2, 999999) diff --git a/releasenotes/notes/use-usable-metric-if-available-970ee58e8fdeece6.yaml b/releasenotes/notes/use-usable-metric-if-available-970ee58e8fdeece6.yaml new file mode 100644 index 0000000000..28ef3d3db6 --- /dev/null +++ b/releasenotes/notes/use-usable-metric-if-available-970ee58e8fdeece6.yaml @@ -0,0 +1,3 @@ +--- +features: + - use memory usable metric from libvirt memoryStats if available.