Re: unfortunate behavior after upgrading POE
Rocco Caputo <[email protected]> Wed, 1 Sep 2010 23:50:55 -0400
| Newsgroups | gmane.comp.lang.perl.poe |
|---|---|
| Message-ID | <[email protected]> |
Have you tried with the latest POE release? 1.284 is seven releases behind current, and there have been at least two signals-related fixes since. If the problem persists with the latest release, I would appreciate a small, self-contained test case. This sounds like a nasty bug, and I'd like to fix it if I can. First, however, I need to see it breaking so I can track down the problem. The filehandle to JSON.pm is peculiar. POE doesn't mention JSON at all, so I wonder where the filehandle came from. 1) macbookpoe:~% cd projects/poe/poe 1) macbookpoe:~/projects/poe/poe% ack JSON 1) macbookpoe:~/projects/poe/poe% ack -ai JSON 1) macbookpoe:~/projects/poe/poe% -- Rocco Caputo - [email protected] On Sep 1, 2010, at 13:28, Ellery, Michael wrote: > Hello, > > We use POE to manage a group of child processes doing processing in > our system, using the POE::Wheel::Run plugin. > > We recently upgraded our version of POE from 0.9989 to 1.284 and > noticed a dramatic change in the performance of the system. With the > older version of POE, the child processes consumed most of the CPU - > which is expected since they do all the processing. With the newer > version of POE, however, we notice that the parent process (the POE > session manager) consumes all the CPU and starves the children. The > parent process is really just there to manage the children, so it > should consume very little resources. > > I did some investigation with strace and noticed that the parent > process was doing select/read in a very tight loop...and the > filehandle it is trying to read from is just some perl library file > on our system (I think it was JSON.pm, but that doesn't matter..). > What's more, the list of FDs being passed to select included 10 > sockets (presumably to the child processes) AND this one file handle > to the JSON.pm module that the perl process has open. Since this > file is always ready to read, select always returns true indicating > that this file is ready to read..thus the tight loop. > > I did a little investigating in the POE code and noticed that there > is a lot of new code to handle signals differently. As an > experiment, I tried setting USE_SIGNAL_PIPE to 0 in my script before > loading POE and the behavior goes back to normal (that is, the > parent process no longer consumes all the CPU). > > So, has anyone else observed this behavior when using Wheel::Run to > manage child processes? Is my workaround a reasonable one or should > I fix this problem some other way. Based on my observations, it > seems like the fundamental problem is that POE is calling select() > with one incorrect file descriptor in its list..thus causing select > to always return immediately and causing POE to try to read from > some disk file instead of from a socket to child processes. > > Thanks, > Mike Ellery > > > Protected by Websense Hosted Email Security -- www.websense.com