Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw
 
PerlMonks  

Re: Profiling forking code?

by BrowserUk (Patriarch)
on Jan 13, 2003 at 18:45 UTC ( [id://226553]=note: print w/replies, xml ) Need Help??


in reply to Profiling forking code?

The same question came up a few months ago at Profiling a forking program, but I just took a quick scan of that thread and it didn't seem to suggest any good resolution.

The biggest problem seems to be that DProf uses a hard-wired filename for the tracing file 'tmon.out', When I took a look at doing the same thing a little while ago, I thought that I might be able to modify the module so that it incorporated the process ID (or similar) into the output filename, but when I tried to track down the location of the filename, I found it embedded in a /lib/auto/DProf/Dprof.dll which stopped me persuing the idea further.

If you built your own version of perl, you might have more luck in modifying the C source of the .dll (or your binary equivalent. I did look at it, but it make heavy use of macros and was non-obvious (to me) where to start.

Maybe one of the other Profiling modules I seen mentioned recently but don't recall the name of right now is or could be made more process freindly.

Good luck.


Examine what is said, not who speaks.

The 7th Rule of perl club is -- pearl clubs are easily damaged. Use a diamond club instead.

Replies are listed 'Best First'.
Re: Re: Profiling forking code?
by Zaxo (Archbishop) on Jan 13, 2003 at 18:53 UTC
    $ENV{PERL_DPROF_OUT_FILE_NAME} = "foo${$}.out"; is how to change that. I've never tried profiling over a fork, though.

    It looks as if the child will have to be started with that environment variable localized.

    Update: I have tried it now, couldn't work it without going through the shell,
    file prof.pl:

    #!/usr/bin/perl -d:DProf { local $ENV{PERL_DPROF_OUT_FILE_NAME} = "foo.out"; my $cpid = open my $foo, '|-', '/usr/bin/perl -d:DProf profc.pl' o +r die $!; } print 'In Parent', $/ or die $!; sleep 10;
    file profc.pl:
    #!/usr/bin/perl print 'In Child',$/ or die $!; sleep 10;
    $ ./prof.pl
    In Child
    In Parent
    $ ls *.out
    foo.out tmon.out

    After Compline,
    Zaxo

      Yes, I discovered that to, but couldn't work out how you might cause fork to start a new copy of the debugger with that variable changed.

      I did think that as AS forks are implemented as threads of the same process, by modifying module so that it incorporated the threadID in the name of the output file at runtime, it might be possible to get a new output file for each process (thread), but as I said, when I loked at the C-source for the .DLL, I found myself going in circles trying to unwind the macros involved and gave up. Even ignoring the macros problem, it was not at all obvious to me whether the debugger could be coerced into using a different handle within each thread, nor whether it would be threadsafe. I was looking at the source for AS 5.6.1 at the time.

      In the end, I started playing with the idea of using Benchmark::Timer dynamically required by each child process after it was forked and outputting the results to files opened by the child processes after forking incorporating the psuedo-process ID, but I found my problem before persuing that idea any further. The biggest problem with that idea is that you end up having to modify the program under test in order to profile, which is less than desirable.


      Examine what is said, not who speaks.

      The 7th Rule of perl club is -- pearl clubs are easily damaged. Use a diamond club instead.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://226553]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others contemplating the Monastery: (4)
As of 2024-04-19 15:58 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found