[collectd] collectd) memory usage growing in python plugin.

James김민석 james.kim at nexr.com
Mon Apr 16 05:23:05 CEST 2012


Hello,

I'm james.

Thank you for releasing the collectd.

I developed a python plugin for collected.

and experiencing memory consumption growth.

as time goes, memory size of collected process keeps growing.


I've searched similar cases with my case(
http://www.mail-archive.com/collectd@verplant.org/msg01688.html)

but not good for me with patched version.


this is my environment.

os: linux centos 5.5 Linux  2.6.18-128.1.6.el5xen x86_64

collectd: collectd-5.0 branch. in git (
https://github.com/octo/collectd/tree/collectd-5.0)

python: 2.6.2, 2.7.3


my plugin is simple, just creates a collectd packet and dispatch to
collected server.(at the bottom of this mail)

and attached more complex plugin for zookeeper monitoring

my collectd collects every 5second.

and memory grows 4k~ 20kbytes every  5~ 60sec(random)  in both case( simple
and complex plugin.)



I've experimented several cases.

1. without python plugin, memory usage keeps steady ( 1.5M )

2. if python plugin is enabled, memory usage begins grow

    with my plugin, 5064KB(initial)-> 5456(after 3hour)

3. strange thing is that just putting empty python configuration,

   it still grows.


 LoadPlugin python

 <Plugin python]>

  ModulePath "/path/to/collectd_agent/share/python/"

  LogTraces true

  Interactive false

 </Plugin>


4.  it is not related to collected debug mode.(--enable-debug with
recompile)

     => no change.


5. the more python plugins are enabled, the more memory grows.

     with 4 python plugins( with more complex plugins attached), it will
grow 17Mbytes after 5hours.

6. if python plugin raises some exceptions, memory grows even faster.

     with 4 python plugins( with more complex plugins), it will grow
72Mbytes after 5hours.


I've tried guppy(http://pypi.python.org/pypi/guppy/) to track python memory
leak.

but there is no symptom in python plugin itself.


Finally. I've used a valgrind(
http://www.cprogramming.com/debugging/valgrind.html) to spot problems using
following command.

valgrind --tool=memcheck --suppressions=/python/path/valgrind-python.supp
--leak-check=full --error-limit=no  --log-file=valog ./sbin/collectd

if  python plugin is disabled in configuration, there is no lost memory in
report.

but if enabled python plugin ,it reports some following reports.

   ( to suppress warning, I've recompiled python ( --without-pymalloc) and
reinstalled collected )

I think that valgrind only reports  about initial step of collected and
unable to track the multi thread workers.




Do you have any idea, what cause this problem?

 thanks you for reading.



------------valgrind reports
-----------------------------------------------------------------

 370 bytes in 1 blocks are possibly lost in loss record 2,847 of 3,541

==30213==    at 0x4C2210C: malloc (vg_replace_malloc.c:195)

==30213==    by 0x7CED83C: PyString_FromString (stringobject.c:143)

==30213==    by 0x7D00A8F: PyType_Ready (typeobject.c:4059)

==30213==    by 0x7CE3277: _Py_ReadyTypes (object.c:2132)

==30213==    by 0x7D673C0: Py_InitializeEx (pythonrun.c:179)

==30213==    by 0x7A4CE70: cpy_config (python.c:989)

==30213==    by 0x4099C4: cf_read (configfile.c:361)

==30213==    by 0x4062C8: main (collectd.c:477)



==7443== 44 bytes in 1 blocks are possibly lost in loss record 833 of 3,469

==7443==    at 0x4C2276F: malloc (vg_replace_malloc.c:263)

==7443==    by 0x7CEEB3E: PyString_FromStringAndSize (stringobject.c:88)

==7443==    by 0x7D630CA: do_mkvalue (modsupport.c:427)

==7443==    by 0x7D6382C: do_mktuple (modsupport.c:268)

==7443==    by 0x7D6321B: do_mkvalue (modsupport.c:298)

==7443==    by 0x7D639EB: va_build_value (modsupport.c:537)

==7443==    by 0x7D63D6E: Py_BuildValue (modsupport.c:485)

==7443==    by 0x7D6F0B2: _PySys_Init (sysmodule.c:1405)

==7443==    by 0x7D6845F: Py_InitializeEx (pythonrun.c:215)

==7443==    by 0x7A4DEC0: cpy_config (python.c:996)

==7443==    by 0x4099C4: cf_read (configfile.c:361)

==7443==    by 0x4062C8: main (collectd.c:477)


==22090== 44 bytes in 1 blocks are possibly lost in loss record 843 of 3,581

==22090==    at 0x4C2276F: malloc (vg_replace_malloc.c:263)

==22090==    by 0x7CE57C8: PyObject_Malloc (obmalloc.c:943)

==22090==    by 0x7CED87E: PyString_FromStringAndSize (stringobject.c:88)

==22090==    by 0x7D620FA: do_mkvalue (modsupport.c:427)

==22090==    by 0x7D6285C: do_mktuple (modsupport.c:268)

==22090==    by 0x7D6224B: do_mkvalue (modsupport.c:298)

==22090==    by 0x7D62A1B: va_build_value (modsupport.c:537)

==22090==    by 0x7D62D9E: Py_BuildValue (modsupport.c:485)

==22090==    by 0x7D6E4D2: _PySys_Init (sysmodule.c:1408)

==22090==    by 0x7D6742F: Py_InitializeEx (pythonrun.c:222)

==22090==    by 0x7A4BEA0: cpy_config (python.c:999)

==22090==    by 0x409924: cf_read (configfile.c:361)



---------------- following is a simple python plugin ----------------------


# Simple Python module

"""

  Import python_plugin_test

  <Module python_plugin_test>



  </Module>


"""

import socket

import collectd

import gc



def configer(ObjConfiguration):

   collectd.debug('Configuring Stuff')




def initiator():

    collectd.debug('initing stuff')

    gc.set_debug(gc.DEBUG_LEAK)




def dispatcher(data=None):

    metric = collectd.Values();

    metric.plugin = 'python_plugin_test_counter'

    metric.type = 'mysql_threads'

    metric.values = [5,10,15,10]

    metric.dispatch()

    #gcresult=gc.collect()

    #collectd.info("python_plugin_test:gc:%s"%gcresult)







#== Hook Callbacks, Order is important! ==#

collectd.register_config(configer)

collectd.register_init(initiator)

collectd.register_read(dispatcher)


---------------------------
-- 
James.kim(김민석)
010 3266 8040
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.verplant.org/pipermail/collectd/attachments/20120416/59fd8a45/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: zookeeper_stat_plugin.py
Type: application/octet-stream
Size: 7064 bytes
Desc: not available
URL: <http://mailman.verplant.org/pipermail/collectd/attachments/20120416/59fd8a45/attachment.obj>


More information about the collectd mailing list