[Zope-dev] Very severe memory leak

Shane Hathaway shane at zope.com
Sat Aug 23 22:18:25 EDT 2003


On 08/22/2003 05:38 PM, Leonardo Rochael Almeida wrote:
> In time, DateTime refcounts eventually dwarves the second place by an
> order of magnitude. I think this is related to the fact that DateTime
> instances are stored as metadata, even though the date indexes have been
> converted to DateTime indexes. The question is, why aren't those
> instances being released? What is holding on to them?

When you flush the cache, those DateTimes should disappear.  If they 
don't, the leak is keeping them.

> I tried installing the LeakFinder product but discovered it didn't work
> before stumbling in a message in the archives that told me exactly that
> :-) The RefCounts view in the LeakFinder object fails with the following
> traceback:

LeakFinder is an early attempt to share some of the techniques I use for 
finding leaks.  Unfortunately, those techniques aren't very useful until 
you've already searched for weeks, which means LeakFinder isn't very 
good for emergencies.

Here are the things you should look at first:

1) The ZODB cache size.  The meaning of this number changed dramatically 
in 2.6.  Before 2.6 it was a very vague number.  In 2.6 it's a target 
number of objects that Zope actually tries to maintain.  Before 2.6 it 
might have made sense to set the ZODB cache size to some arbitrarily 
high number like 100,000; in 2.6 you want to start at about 2000 and 
adjust from there.  There are tools in 2.6 for helping you adjust the 
number.

2) The number of ImplicitAcquisitionWrappers present in the system.  I 
have found it to be a reliable indicator of whether you have a leak or 
not.  Expect this number to stay under 400 or so.  If it grows 
gradually, there's a leak.  Watch the refcounts screen.

3) Is Python compiled with cyclic garbage collection enabled?  2.4 and 
above absolutely require cyclic garbage collection.

4) Don't use 2.6.1.  Use 2.6.2, which has fixes for known leaks.  It is 
actually already tagged in CVS as "Zope-2_6_2", and it's what zope.org 
is now running.  Various unrelated things prevented a formal release 
this week.

If all else fails, grep all Python modules for "sys._getframe()" and 
"sys.exc_info()".  These are the primary causes of memory leaks in 
Python 2.1 and below.  If you're brave, you can just run Zope under 
Python 2.2, which fixes those particular leaks AFAIK.

Finally, there's always hope. :-)  The latest thing I've been doing is 
running Zope in a debug build of Python.  A debug build makes a magical 
"sys._getobjects()" available, allowing you to inspect all live objects 
through a remote console.  Since debug builds aren't much slower than 
standard builds, you can even run a debug build in production for short 
periods of time.  I've been building a small library of functions for 
working in this mode, and if you need them, I'll pass them along.  I'd 
have to warn you that they are anything but intuitive in their purpose 
and use, though.

Shane




More information about the Zope-Dev mailing list