On Tue, 2004-06-08 at 10:23 -0400, Greg Ames wrote:
> Here is the patch - http://apache.org/~gregames/event.patch . It is currently
> based on the worker MPM from 2.1 HEAD to make it easier to review. It is
> working well for me under load on Linux and serves pages on Solaris. When I run
> specweb99 I've seen around 170 connections served by 5 to 20 worker threads.
> This is totally dependent on the time the workload spends in keepalive/user
> think time vs. time spent doing anything else, so YMMV.
Very Neat :D
> This approach could very well hit scalability bottlenecks with various poll()
> implementations as described on Kegel's web site listed above. There are many
> alternatives emerging. I've gotten a few inquiries about using sys_epoll on
> Linux, which sounds like a great fit. I wanted to get something working with
> plain ol' generic (portable) poll() first before trying out any OS dependent
> variations. The current apr_pollset_remove will eventually become a bottleneck
> too -
>
> #ifdef HAVE_POLL
> for (i = 0; i < pollset->nelts; i++) {
> etc
I don't think everyone on this list is aware of this, but I have an
outstanding patch[1] for apr_pollset to add both KQueue and sys_epoll
backends. Hopefully this will get committed soon.
> Other issues are described at http://apache.org/~gregames/event.laundry_list .
> However I think the patch is robust enough now to post. I'm very interested in
> feedback and having people try it out before going further.
Mentioned on that laundry list is adding to the pollset from another
thread. I believe this is supported by both KQueue and sys_epoll. I
guess it could be easily supported with some #ifdefs.
> From: http://apache.org/~gregames/event.laundry_list
> Should new connections be passed to the event_thread to test for
> readability? It's good if there are long delays before the first data
> packet is processed; if there is no delay, it's extra complexity and
> wasted cycles. The thread switches could be minimized if the event
> thread and listener were merged.
I like the general idea, but as a note, FreeBSD has accept filters
which already do some of this. See:
http://www.freebsd.org/cgi/man.cgi?query=accf_http
(It is enabled in the Apache code, but is not commonly enabled in the
FreeBSD kernel. I don't believe Linux has any equivalent)
I think having the Event Thread also handle the Accept() would be the
best method in the long run.
-Paul Querna
[1] - http://marc.theaimsgroup.com/?t=108650227500001&r=1&w=2