Re: Memory usage growing after each DBus method call



Hi Remi,

I don't have any insight into this particular problem. The test case seems to be passing for me when run against the PyGObject git head. If you are not using PyGObject 3.8 or later, please give it a try as there have been many memory and reference leak fixes. If you can still reproduce the problem, please log a bug including all your findings (along with OS and arch and version info) and attach the test as a patch file:
https://bugzilla.gnome.org/enter_bug.cgi?product=pygobject

Thanks,
-Simon



On Thu, Jul 11, 2013 at 3:03 AM, Rémi Rérolle <remi rerolle gmail com> wrote:
Hi all,

I noticed my application's memory usage is constantly growing after each DBus call, reaching huge amounts of memory, such as more than 2GB.

I tried looking at the test_gdbus test cases, and it turns out a simple call to test_python_calls_sync() will increase the memory usage, without any possibility to reclaim that memory.

Here's a simple test case add-on to test_gdbus.py regarding this:

diff --git a/tests/test_gdbus.py b/tests/test_gdbus.py
index 805633a..c81ff7d 100644
--- a/tests/test_gdbus.py
+++ b/tests/test_gdbus.py
@@ -208,3 +208,27 @@ class TestGDBusClient(unittest.TestCase):

         self.assertTrue(isinstance(data['error'], Exception))
         self.assertTrue('InvalidArgs' in str(data['error']), str(data['error']))
+
+    def old_dbus(self):
+        import dbus
+        dbus.Interface(dbus.SessionBus().get_object('org.freedesktop.DBus',
+                       '/org/freedesktop/DBus'), 'org.freedesktop.DBus',).ListNames()
+
+    def test_python_calls_leak(self):
+        import psutil
+        proc = psutil.Process(psutil.os.getpid())
+        iteration, stable_count = 0, 0
+        usage = proc.get_memory_info()[0]
+        while True:
+#            self.old_dbus()
+            self.test_python_calls_sync()
+            new_usage = proc.get_memory_info()[0]
+            if new_usage == usage:
+                stable_count += 1
+            else:
+                stable_count = 0
+                usage = new_usage
+            if stable_count > 10 or iteration == 100:
+                break
+            iteration += 1
+        self.assertLess(iteration, 100)


It calls test_python_calls_sync() successively and inspects the memory usage, waiting for it to stabilize. It will consider it has stabilized after getting no memory change through 10 iterations.

This test case fails, but succeeds if using the old dbus bindings.

I'm not sure how to interpret this, I tried calling gc.collect after each iteration, but it doesn't seem to collect anything. Also, I tried to unref/del the GLib.Variant object returned by the call, without any success. Valgrind didn't help much either, as I'm not very acquainted with it.

I'd be glad to get any insight on this matter, as for the moment it prevents me from using python-gi for my dbus needs, though i would very much like to do so, especially to benefit from its thread-safe nature.

_______________________________________________
python-hackers-list mailing list
python-hackers-list gnome org
https://mail.gnome.org/mailman/listinfo/python-hackers-list




[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]