I ran my baseline test with 500k requests, and got the following: (Note that all the figures will have an error of +/- 0.1)
baseline 500k requests 1.7% So it would seem that there is not a specific problem in readline, or my test case is messed up. FYI here are my 2 handlers: def baseline_handler(req): req.content_type = 'text/plain' req.write('ok baseline:') return apache.OK def readline_handler(req): # the body of the request consists of # '\n'.join([ 'a'*10 for i in xrange(0,10) ]) req.content_type = 'text/plain' count = 0 while(1): line = req.readline() if not line: break count += 1 req.write('ok readline: %d lines read' % count) return apache.OK Jim Jim Gallacher wrote: > I'll have some time to investigate this over the next couple of days. I > ran my leaktest script for FieldStorage and readline, and FieldStorage > certainly still leaks, but I'm not so sure about readline itself. > > baseline 1k requests 1.2% > readline 500k requests 1.6% > fieldstorage 498k requests 10.1% > > The memory consumption figures are for a machine with 512MB ram. > > I'm running my baseline test with 500k requests right now to see if the > 1.6% figure for readline represents a real leak in that function, or if > it is just mod_python itself. > > My memory leak test suite is probably at the point that other people > will find it useful. Once I've written a README explaining its use I'll > commit it to the repository so everybody to play. If you anyone wants to > give it a shot in the interim I can email it to you. Give me shout > offlist. > > I haven't had a chance to look at the code you highlight below, or at > least not closely. The whole req_readline function looks like it will > require a good strong cup of coffee to fully comprehend. ;) > > Jim > > Alexis Marrero wrote: >> Experimenting on this issue, I noticed that neither of the following set >> of "ifs" are ever met: >> >> >> 786 /* Free old rbuff as the old contents have been copied over and >> 787 we are about to allocate a new rbuff. Perhaps this could >> be reused >> 788 somehow? */ >> 789 if (self->rbuff_pos >= self->rbuff_len && self->rbuff != NULL) >> 790 { >> 791 free(self->rbuff); >> 792 self->rbuff = NULL; >> 793 } >> >> >> -------- >> >> 846 /* Free rbuff if we're done with it */ >> 847 if (self->rbuff_pos >= self->rbuff_len && self->rbuff != NULL) >> 848 { >> 849 free(self->rbuff); >> 850 self->rbuff = NULL; >> 851 } >> >> I noticed that by putting some statements to write to the output >> stream. They never execute. >> >> /amn >> >> On Aug 10, 2006, at 1:43 PM, Alexis Marrero wrote: >> >>> All, >>> >>> We are trying to nail down a memory leak that happens only when >>> documents are POSTed to the server. >>> >>> For testing we have a short script that does: >>> >>> while True: >>> dictionary_of_parameters = {'field1': 'a'*100000} >>> post('url...', dictionary_of_parameters) >>> >>> Then we run "top" on the server and watch the server memory grow >>> without bound. Why do we know that the problem is in >>> request.readline()? If I go to >>> mod_python.util.FieldStorage.read_to_boundary() and add the following >>> statement: >>> >>> def read_to_boundary(...): >>> return True >>> ... >>> >>> as the first executable line in the function the memory does not grow. >>> >>> I have read the req_readline a 1000 time and I can't figure out where >>> the problem is. >>> >>> >>> My config: >>> Python 2.4.1 >>> mod_python 3.2.10 >>> >>> Our request handler does nothing other than using >>> util.FieldStorage(req) and req.write('hello'). >>> >>> I have some suspicion that it has to do with: >>> .... >>> 19 * requestobject.c >>> 20 * >>> 21 * $Id: requestobject.c 420297 2006-07-09 13:53:06Z nlehuen $ >>> 22 * >>> 23 */ >>> .... >>> 846 /* Free rbuff if we're done with it */ >>> 847 if (self->rbuff_pos >= self->rbuff_len && self->rbuff != >>> NULL) >>> 848 { >>> 849 free(self->rbuff); >>> 850 self->rbuff = NULL; >>> 851 } >>> 852 >>> >>> Though, I can't confirm. >>> >>> >>> /amn >>> >> > >