> Ideally we would run this in an event loop

Anyone is welcome to take over maintenance of http::server::singlethreaded
and add apache/mp features to it, then there would be big monolithic
perl web-servers.  Blocking in the request handlers would remain a problem,
but not anything that couldn't be solved with Socket::PassAccessRights and
a pool of external worker processes that are responsible for setting up
a fd for the new request, passing the fd back to the main program, then
doing whatever is needed to service the request.

I have set something similar up at my job, but it is not releasable
and not directly applicable to rejiggering singlethreaded into a better
more scalable mod_perl.

So here's the "three tier asynchronous model" (3TAM):

     Main Select Loop
            handles all connections from remote clients, including
            relaying data from worker processes.  Very fast data
            can be served directly, anything that might block is
            passed to an available worker.

     Worker Process Pool
            these processes generate and pass file descriptors
            and then become handlers,  by forking, or by passing
            the other side of a socketpair to a handler

     Handler Processes
            these do blocking things, like groveling through twenty million
            nonindexed database records, and report their findings
            to their STDOUT, which happens to be a socketpair
            that is read by the MSL.

The middle layer is there to protect the main loop from ever having
to fork().

To make a 3TAM system work like mod_perl, never mind the hooks
into the various apache request service stages, every long-running
perl script could be interpreted into one of serveral mp_like interpreters
at the handler layer, or even every mp script could become its own
small pool of processes waiting for activation.  Some benchmarking
would need to be done WRT the optimum amount of code to have
in a long-lived perl interpreter instance.

mod_perl:
        each apache thread includes a perl interpreter which has loaded
        into it the entire mod_perl feature set of the web server, each in
        its own name space.  Pool size is managed by apache threads.

proposed 3TAM:
      each 3TAM_perl script would be wrapped into a long-lived program
      that lives in its own process pool of size greater than or equal to two,
      which is capable of forking when the script is used heavily and
      exiting when there are too many free ones.  Pool size is managed
      with a finer granularity: the individual script.


Crazy enough for you?

--
David L Nicol
This is the dawning of the age of asparagus

Reply via email to