[Zope-dev] debugging memory leaks
Seb Bacon
seb at jamkit.com
Thu Nov 6 14:00:44 EST 2003
Seb Bacon wrote:
> So, say Foo is leaking because it is referenced from O which can't be
> collected. Given 100 things which refer to Foo, how do I identify which
> one is O? And of course, then O may be leaking because it is referenced
> from P...
>
> I sense this question is a bit like asking someone to explain how to
> solve a Rubik's Cube in 3 words.
Well, I have come to some kind of resolution, though I am still slightly
mystified. Here's the sequence of events, in case they are of any help
to others (doubtful...).
Although there probably is a memory leak in my application, the one I
thought I was hunting wasn't what was causing my server collapse.
At first, I noticed that memory usage was increasing linearly over time
until the server expired. I examined reference counts for all the
classes therein, mainly using Shane's LeakFinder product (I could have
used the refcounts listing on the control panel, but I found the
LeakFinder's reference count display tab nicer to use.) I noticed that
references to a particular Foo class were increasing in direct
proportion to the memory usage, apparently without bound. I also noted
that Foos are involved in reference cycles.
I guess from this that maybe Foos were leaking somehow - which was
incorrect. There is nothing wrong with reference cycles *per se* (see
earlier in this thread).
Then I looked at Bars, which were referencing Foos. Given the way that
Foos are implemented (with mutual references to each other) and the fact
that there may be several Foos stuck on a Bar, then a leak in a Bar
could have a big knock-on effect of creating a whole ton of Foos. The
number of references to Bars was also increasing without bound.
This went on for ages. Worth mentioning is Barry's cool reference
visualisation tool (see earlier in this thread).
I had already tried my application using Zope 2.6.2 (it was on 2.6.1
before) and noted reference counts also going up rapidly, so it wasn't
that, I decided.
To cut a long story to a medium length, it *was* that. When using
2.6.2, I noticed that if I forced garbage collection, the refcounts went
down. Going over to the database connection caches, I noted that in
Zope 2.6.1 the number of cache entries bore no relation to the target
cache size. In Zope 2.6.2, it did.
In other words, the way my application is implemented means that *lots*
of references can accumulate in the space of a single request, and
something about these references meant that they were never getting
cleared out of the cache by Zope 2.6.1. The cache was the culprit.
Moral: always keep on top of those Zope releases ;-)
What's puzzling me is that I can't see anything that changed between
2.6.1 and 2.6.2 which might have fixed this behaviour.
Seb
More information about the Zope-Dev
mailing list