On Jun 18, 10:17 am, Tim Bunce <[email protected]> wrote:
> Thanks for sending me the profile Martin.
>
> On Thu, Jun 17, 2010 at 11:04:11AM -0700, Martin wrote:
> > Before I get further lost in this I wonder if anyone else believes or
> > has comments on the following extract of a Devel::NYTProf run. The
> > code uses LWP::UserAgent in  a POE server to retrieve ~ 30Mb file on
> > the local 1Gb network (and it takes over 400s).
>
> The overall numbers make sense though. The application run really does
> take the amount of time nytprof says, and the subroutine times and
> statement times are consistent. So I suspect perl not nytprof.

The application run really does take that time, I agree and I should
have stated that to avoid confusion - sorry.

>
>
> > I fail to see how line 158 below can take 320s.
> > Run outside of the POE Server the same POST takes around 5s with this
> > code: [...]
> > and this is the same code being run inside the POE Server.
> > Devel::NYTProf reports the top time in HTTP::Message::add_content like
> > this:
>
> > 149                                        sub add_content
> > ...
> > 151        7585    12.0ms                  my $self = shift;
> > 152        7585    22.4ms                  $self->_content unless exists 
> > $self->{_content};
> > 153        7585    14.5ms                  my $chunkref = \$_[0];
> > 154        7585    14.7ms                  $chunkref = $$chunkref if 
> > ref($$chunkref); # legacy
> > 155
> > 156        7585    66.2ms  7585    149ms   _utf8_downgrade($$chunkref);
> > 157
> > 158        7585    320s                    my $ref = ref($self->{_content});
> > 159        7585    53.9ms                  if (!$ref) {
> > 160        7585    365ms                   $self->{_content} .= $$chunkref;
> > 161                                        }
>
> Something very strange is going on.

Yes in deed.

> Looking at the stream of statement timings I can see that that that line
> in that file (fid 68) starts out only taking a small amount of time
>
>     Read 68:156  11 ticks
>     Read 68:158  35 ticks
>     Read 68:159  18 ticks
>     Read 68:160  67 ticks
>
> but the time taken grows steadily, so later it's:
>
>     Read 68:156  11 ticks
>     Read 68:158  22197 ticks
>     Read 68:159  33 ticks
>     Read 68:160  284 ticks
>
> and so it grows and grows until the final execution is:
>
>     Read 68:156  12 ticks
>     Read 68:158  888959 ticks
>     Read 68:159  64 ticks
>     Read 68:160  244 ticks

Very interesting.

The code in question is:

my $ref = ref($self->{_content});
if (!$ref) {
  $self->{_content} .= $$chunkref;
}

and I could see the concatenation perhaps taking longer and longer as
it is concatenating 4K chunks each time until it reaches 30Mb. I
didn't understand why the 320s was reported on the ref() though and
that is what confused me.

> Nick, does this ring any bells with you?
>
> Martin, please try with perl 5.10.1 as your 5.10.0 may be buggy.
>
> Tim.

It may take a bit longer to try 5.10.1 as we have a huge number of
modules in use but I'll have a go.

I'm now also getting negative times for some statements time in subs:

49      1       19µs    1       -90.1s  $out = $q->sendRequest(\%r);
# spent - 90.1s making 1 call to XXX::Queue::sendRequest

so very strange things are happening.

Thanks for looking at it.

I'm still looking at it so I'll come back with what I find.

Martin

-- 
You've received this message because you are subscribed to
the Devel::NYTProf Development User group.

Group hosted at:  http://groups.google.com/group/develnytprof-dev
Project hosted at:  http://perl-devel-nytprof.googlecode.com
CPAN distribution:  http://search.cpan.org/dist/Devel-NYTProf

To post, email:  [email protected]
To unsubscribe, email:  [email protected]

Reply via email to