On Mon, Mar 23, 2009 at 07:50:33PM -0300, Martín Ferrari wrote:
> $ perl test
> Reusing the SVN object
> USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
> martin 20600 0.0 0.6 21380 6592 pts/7 S+ 19:41 0:00 perl
> test
> USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
> martin 20600 42.0 5.2 73560 53528 pts/7 S+ 19:41 0:00 perl
> test
> NOT reusing the SVN object
> USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
> martin 20600 54.0 0.6 21524 6908 pts/7 S+ 19:41 0:00 perl
> test foo
> USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
> martin 20600 94.0 2.2 41856 22608 pts/7 S+ 19:41 0:01 perl
> test foo
>
> As you can see, while destroying the SVN object on each step alleviates
> the problem, there's still a very noticeable increment in memory usage,
> and a serious degradation in performance.
Interestingly, the results are reversed with current libsvn-perl.
Here's a run of the same tests, but with an additional scenario of
allocating a new default pool inside the loop, so it gets freed on
exiting the scope.
Added scenario:
} elsif ($arg && $arg == 2) {
warn "Using a new subpool for each loop\n";
open FOO, "> /dev/null";
my $ctx = new SVN::Client();
system("ps u $$");
foreach(1..500) {
my $pool = SVN::Pool->new_default;
#$ctx->ls('file:///tmp/foo', 'HEAD', 0);
$ctx->cat (\*FOO, $path, 'HEAD', $pool);
}
system("ps u $$");
Reusing the SVN object
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
jamessan 22209 0.0 0.2 145304 16532 pts/8 S+ 21:08 0:00 perl foo.pl
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
jamessan 22209 0.0 0.8 208760 65292 pts/8 S+ 21:08 0:00 perl foo.pl
NOT reusing the SVN object
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
jamessan 22209 0.0 0.2 145352 17452 pts/8 S+ 21:08 0:00 perl foo.pl 1
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
jamessan 22209 84.0 1.9 306856 161396 pts/8 S+ 21:08 0:00 perl foo.pl 1
Using a new subpool for each loop
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
jamessan 22209 90.0 0.2 145364 17288 pts/8 S+ 21:08 0:00 perl foo.pl 2
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
jamessan 22209 102 0.3 163460 24688 pts/8 S+ 21:08 0:01 perl foo.pl 2
Again with 500 → 1000.
Reusing the SVN object
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
jamessan 22319 0.0 0.2 145304 16488 pts/8 S+ 21:09 0:00 perl foo.pl
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
jamessan 22319 0.0 1.3 254424 106940 pts/8 S+ 21:09 0:00 perl foo.pl
NOT reusing the SVN object
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
jamessan 22319 0.0 0.2 145364 17396 pts/8 S+ 21:09 0:00 perl foo.pl 1
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
jamessan 22319 141 3.6 450660 298396 pts/8 S+ 21:09 0:01 perl foo.pl 1
Using a new subpool for each loop
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
jamessan 22319 74.0 0.2 145364 17176 pts/8 S+ 21:09 0:01 perl foo.pl 2
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
jamessan 22319 85.5 0.3 163460 24384 pts/8 S+ 21:09 0:01 perl foo.pl 2
Notice how the memory is fairly stable with the local pool?
Whether you use SVN::Pool->new_default_sub or SVN::Pool->new_default
depends on your use case, but it seems clear that proper pool use is the
right way to manage memory.
Cheers,
--
James
GPG Key: 4096R/331BA3DB 2011-12-05 James McCoy <[email protected]>