This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: Memory leak in sub-interpreters
Type: resource usage Stage:
Components: Interpreter Core Versions: Python 2.6
process
Status: closed Resolution:
Dependencies: Superseder:
Assigned To: Nosy List: amaury.forgeotdarc, christian.heimes, ezio.melotti, grahamd, jcea, loewis, ncoghlan, pitrou, python-dev, swapnil, terry.reedy, vstinner
Priority: normal Keywords:

Created on 2011-04-08 07:06 by swapnil, last changed 2022-04-11 14:57 by admin. This issue is now closed.

Files
File name Uploaded Description Edit
test_subinterpreter.c swapnil, 2011-04-08 07:06 test program to demonstrate subinterpreter memory leak
large_import.py swapnil, 2011-04-08 07:10 script to import bunch of standard modules
test_subinter_with_gc.c swapnil, 2011-04-11 14:48
Messages (13)
msg133292 - (view) Author: Swapnil Talekar (swapnil) Date: 2011-04-08 07:06
In the attached program, the total memory consumption of the process, goes up each time a new subinterpreter imports a bunch of modules. When the subinterpreter is shutdown with Py_EndInterpreter, the memory consumed with import of modules is not returned back. Hence the amount of memory consumed keeps increasing with each loop. It goes up from about 8MB to about 11MB after few loops. Strangely it doesn't rise any further.

I have tested this only for Python 2.6.5
msg133293 - (view) Author: Ezio Melotti (ezio.melotti) * (Python committer) Date: 2011-04-08 07:08
Is this the same as #222684?
msg133294 - (view) Author: Swapnil Talekar (swapnil) Date: 2011-04-08 07:09
No. This is not the same as #222684?
msg133295 - (view) Author: Ezio Melotti (ezio.melotti) * (Python committer) Date: 2011-04-08 07:11
Indeed, the code looks similar, but #222684 seems to be fixed, and doesn't use PyImport_ImportModule, so maybe the leak is there.
msg133307 - (view) Author: Nick Coghlan (ncoghlan) * (Python committer) Date: 2011-04-08 11:54
As a first guess, I would suspect that this is just badly fragmenting the heap and we aren't freeing up any arenas to pass back to the OS.
msg133308 - (view) Author: Jesús Cea Avión (jcea) * (Python committer) Date: 2011-04-08 12:12
The fact that the "leak" doesn't grow seems to confirm Nick supposition.

Close as invalid?
msg133309 - (view) Author: Amaury Forgeot d'Arc (amaury.forgeotdarc) * (Python committer) Date: 2011-04-08 12:17
Most builtin modules keep static references to common objects: exceptions, types, &co.  These references are currently never freed, but are reused by all sub-interpreters.
It the memory usage stays stable, even after many calls to Py_NewInterpreter()/Py_EndInterpreter(), this is not a bug!
msg133311 - (view) Author: Benjamin Peterson (benjamin.peterson) * (Python committer) Date: 2011-04-08 13:07
Please don't add everyone in existence to the nosy list.
msg133315 - (view) Author: Jesús Cea Avión (jcea) * (Python committer) Date: 2011-04-08 15:18
I think this is a non-issue. Closing.

If you have a testcase proving real leaks in a current release, reopen.
msg133525 - (view) Author: Swapnil Talekar (swapnil) Date: 2011-04-11 14:48
Sorry about the previous report. I should have tested it thoroughly. Yes, it does not seem to rise but eventually it does. This time, I'v added garbage collection right after the subinterpreter is shutdown. The memory consumption does not seem to rise above 8MB when you start the test. But if you leave it running for couple of hours I have seen it grown upto 24MB. I haven't tested more that that but it seems that if you run it for couple of days, memory consumption will grow upto few 100 MB.
This is strange because mod_python doesn't seem to be doing anything special to handle this, then how does it work with mod_python?
msg133529 - (view) Author: Jesús Cea Avión (jcea) * (Python committer) Date: 2011-04-11 15:16
a) Python 2.6 is open only for security fixes. Could you possibly try in 2.7, 3.1 and 3.2?

b) Could you run the test a bit longer and confirm that the leak is slowly growing?

c) I assume your mod_python is running under Apache. Apache restarts processes after X requests are served, so any (slow growing) leak would be not aparent.

Thanks for your effort.
msg133548 - (view) Author: Graham Dumpleton (grahamd) Date: 2011-04-11 22:41
I wouldn't use mod_python as any guide for how to use sub interpreters as its usage of sub interpreters and threading in conjunction with them is technically broken, not following properly the Python C API requirements. It doesn't even shutdown the Python interpreters properly resulting in memory leaks on Apache restarts into the Apache parent process which is then inherited by all forked Apache child processes.

Also, mod_python does not destroy sub interpreters within the life of the process and then create replacements. It is a bit of a misconception that some have that mod_python creates a new sub interpreter for each request, it doesn't. Instead once a sub interpreter is created it persists for the life of the process. Thus it doesn't even trigger the scenario you talk about.

In early versions of mod_wsgi the recycling of sub interpreters within the lifetime of the process was tried but was found not to be practical and feature was removed. The big stumbling block was third party C extensions. Various C extensions do not cope well with being initialised within context of one sub interpreter, with the sub interpreter being destroyed, and the C extension then being used in context of another sub interpreter. This usage pattern caused memory leaks in some cases and in worst case the process would crash.

In short, use of sub interpreters for short periods of time and then destroying them is all but unusable except within very constrained situations where no use is made of complex C extensions.

For related information see:

http://blog.dscpl.com.au/2009/03/python-interpreter-is-not-created-for.html
http://blog.dscpl.com.au/2009/11/save-on-memory-with-modwsgi-30.html
msg133867 - (view) Author: Terry J. Reedy (terry.reedy) * (Python committer) Date: 2011-04-15 19:30
Swapnil, please pay attention to what people write.
PYTHON 2.6 IS NOT OPEN FOR BUGFIXES.
Please do not add 2.6 to this issue again or reopen until you find a problem with 2.7.1 or 3.2.0.
History
Date User Action Args
2022-04-11 14:57:15adminsetgithub: 56012
2011-04-15 19:30:39terry.reedysetstatus: open -> closed
nosy: + terry.reedy
messages: + msg133867

2011-04-11 22:41:57grahamdsetmessages: + msg133548
2011-04-11 15:16:51jceasetmessages: + msg133529
2011-04-11 14:50:08swapnilsetstatus: closed -> open
resolution: not a bug ->
versions: + Python 2.6
2011-04-11 14:48:15swapnilsetfiles: + test_subinter_with_gc.c

messages: + msg133525
2011-04-08 15:18:56jceasetstatus: open -> closed
resolution: not a bug
messages: + msg133315
2011-04-08 14:57:57eric.araujosetnosy: - eric.araujo

versions: - Python 2.6
2011-04-08 13:07:15benjamin.petersonsetnosy: - benjamin.peterson
2011-04-08 13:07:02benjamin.petersonsetnosy: loewis, jcea, amaury.forgeotdarc, ncoghlan, pitrou, vstinner, christian.heimes, benjamin.peterson, ezio.melotti, eric.araujo, grahamd, swapnil, python-dev
messages: + msg133311
2011-04-08 12:17:55amaury.forgeotdarcsetmessages: + msg133309
2011-04-08 12:12:47jceasetnosy: + jcea
messages: + msg133308
2011-04-08 11:54:44ncoghlansetmessages: + msg133307
2011-04-08 07:11:28ezio.melottisetmessages: + msg133295
2011-04-08 07:10:00swapnilsetfiles: + large_import.py
2011-04-08 07:09:39swapnilsetmessages: + msg133294
2011-04-08 07:08:13ezio.melottisetnosy: + ezio.melotti
messages: + msg133293
2011-04-08 07:06:48swapnilcreate