Thread: Memory leak!!
Hi all, We've have a supply chain management system running under the following configuration. Redhat 7.1 Perl v5.6.0 Postgres 7.3.2 Perl/DBI 1.35 DBD-Pg 1.22 Please note that Postgres 7.3.2, DBI 1.35 and DBD-Pg 1.22 have been upgraded recently. I wrote a small script to check for any memory leak. This is what i've found. Initially, the memory occupied was about 5 MB and then, it started to grow at the range of 5-10k for every 1-2 minutes. After running the script for about 40 minutes in a while loop, the memory occupied was 7.4 MB. Here's the code snippet : while (1) { print "sql executed and returned :", $Dbh->prepare("select user_id from users limit 1")->execute, "\n"; } Pls. note that there were no "lost references" in my script and it's a very simple one. What could be the problem ? Please advice me. TIA. Regards, Guru Prasad. Systems Engineer bk Systems (P) Ltd.
"P.N.Guru Prasad" <pnguruji@yahoo.com> writes: > while (1) { > print "sql executed and returned :", $Dbh->prepare("select user_id from > users limit 1")->execute, "\n"; > } I'm not a DBI user, but I'd kinda expect that executing a query would result in an object holding the results from that query. Don't you need to do something to close/delete the result objects you're generating? regards, tom lane
On Wednesday 09 April 2003 06:58, Tom Lane wrote: > "P.N.Guru Prasad" <pnguruji@yahoo.com> writes: > > while (1) { > > print "sql executed and returned :", $Dbh->prepare("select user_id from > > users limit 1")->execute, "\n"; > > } > > I'm not a DBI user, but I'd kinda expect that executing a query would > result in an object holding the results from that query. Don't you need > to do something to close/delete the result objects you're generating? Does while (1) { my $sth = $Dbh->prepare("select user_id from users limit 1"); print "sql executed and returned :", $sth->execute,"\n"; $sth->finish(); } make any difference? If not try asking the dbi-users list, dbi-users@perl.org ( http://lists.perl.org/showlist.cgi?name=dbi-users ) Ian Barwick barwick@gmx.net
On Thursday 10 April 2003 16:39, guru prasad wrote: > Hi All, (...) > Also, i wanted to narrow down the problem, ie. whether > the problem is in DBI or DBD::Pg. Could anyone throw > some light on where should i start ? I can go by trial > & error method to find out but at the same time, i > feel there will be many guru's in this list who can > help me out. Unfortunately I'm still waiting for the Academy to send me my Guru Certificate, so I can't help you much more ;-). Seriously, I have no idea off spec and haven't got the time to go into it right now. As I said, do try the dbi-users list, it's fairly low traffic but has a higher concentration of Perl / DBI gurus and other very helpful people who may have much more insight, especially if it is more a DBI than an DBD::Pg problem. > > dbi-users@perl.org > > http://lists.perl.org/showlist.cgi?name=dbi-users Ian Barwick barwick@gmx.net
Hi All, > while (1) { > my $sth = $Dbh->prepare("select user_id from users > limit 1"); > print "sql executed and returned :", > $sth->execute, "\n"; > $sth->finish(); > } > > make any difference? I tried it. Here's the observation. Initially, the script didn't eat so much RAM and it just stayed at 6604 MB for some time (atleast for 4 hours). I wanted the script to run for more than a day. Next day, when i did a 'top' in my RH Linux box, the mem. occupied by the script was 8028 MB of RAM. Why the difference ? May be, my test script wasn't a perfect one to check for memory leaks in DBI or DBD::Pg. How can i create a more efficient test script to check for memory leaks ? Using the script, i should be able to find out any memory leak, in about say 1 or 2 hours. Any thoughts ? Also, i wanted to narrow down the problem, ie. whether the problem is in DBI or DBD::Pg. Could anyone throw some light on where should i start ? I can go by trial & error method to find out but at the same time, i feel there will be many guru's in this list who can help me out. Regards, Guru Prasad. --- Ian Barwick <barwick@gmx.net> wrote: > On Wednesday 09 April 2003 06:58, Tom Lane wrote: > > "P.N.Guru Prasad" <pnguruji@yahoo.com> writes: > > > while (1) { > > > print "sql executed and returned :", > $Dbh->prepare("select user_id from > > > users limit 1")->execute, "\n"; > > > } > > > > I'm not a DBI user, but I'd kinda expect that > executing a query would > > result in an object holding the results from that > query. Don't you need > > to do something to close/delete the result objects > you're generating? > > Does > > while (1) { > my $sth = $Dbh->prepare("select user_id from users > limit 1"); > print "sql executed and returned :", > $sth->execute, "\n"; > $sth->finish(); > } > > make any difference? > > If not try asking the dbi-users list, > dbi-users@perl.org > ( http://lists.perl.org/showlist.cgi?name=dbi-users > ) > > Ian Barwick > barwick@gmx.net > __________________________________________________ Do you Yahoo!? Yahoo! Tax Center - File online, calculators, forms, and more http://tax.yahoo.com
Tom Lane <tgl@sss.pgh.pa.us> writes: > "P.N.Guru Prasad" <pnguruji@yahoo.com> writes: > > while (1) { > > print "sql executed and returned :", $Dbh->prepare("select user_id from > > users limit 1")->execute, "\n"; > > } > > I'm not a DBI user, but I'd kinda expect that executing a query would > result in an object holding the results from that query. Don't you need > to do something to close/delete the result objects you're generating? Perl reference counts these objects so that shouldn't be a problem. You could be sure by using Devel::LeakTrace or Devel::Leak or something like that. But I suspect they won't find anything because I suspect the problem is in the DBD::pg driver or libpq at the C level. -- greg