httpd-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Bill Stoddard" <b...@wstoddard.com>
Subject Re: [PATCH] improve request multiplexing in AB
Date Wed, 24 Apr 2002 14:00:39 GMT
Does this change effectively negate the -c option?

Bill

----- Original Message ----- 
From: "Aaron Bannert" <aaron@clove.org>
To: <dev@httpd.apache.org>
Sent: Tuesday, April 23, 2002 8:04 PM
Subject: [PATCH] improve request multiplexing in AB


> This patch corrects some problems in the ability of AB to handle
> concurrent processing by:
> 
>  - enabling nonblocking connect()s.
>  - preventing APR from performing blocking reads, allowing AB to
>    multiplex over its own set of descriptors.
> 
> Pre-patch: worker MPM with 2 children, 10 threads each: 10-20 req/sec
> Post-patch: worker MPM with 2 children, 10 threads each: 750 req/sec
> Post-patch: worker MPM with 2 children, 50 threads each: 735 req/sec
> 
> According to server-status I am now able to consistently occupy *all*
> worker threads in the 10thr/child case, and almost all in the 50thr/child
> case (my test hardware probably can't keep up). Actually, most of the
> time they are all in the "closing connection" state.
> 
> ** If you saw poor concurrent performance with the worker MPM while
> testing with AB, please retest and submit your results.
> 
> -aaron
> 
> 
> Index: support/ab.c
> ===================================================================
> RCS file: /home/cvspublic/httpd-2.0/support/ab.c,v
> retrieving revision 1.95
> diff -u -r1.95 ab.c
> --- support/ab.c 14 Apr 2002 09:21:43 -0000 1.95
> +++ support/ab.c 23 Apr 2002 23:36:44 -0000
> @@ -853,6 +853,10 @@
>   SOCK_STREAM, c->ctx)) != APR_SUCCESS) {
>   apr_err("socket", rv);
>      }
> +    if ((rv = apr_setsocketopt(c->aprsock, APR_SO_NONBLOCK, 1))
> +         != APR_SUCCESS) {
> +        apr_err("socket nonblock", rv);
> +    }
>      c->start = apr_time_now();
>      if ((rv = apr_connect(c->aprsock, destsa)) != APR_SUCCESS) {
>   if (APR_STATUS_IS_EINPROGRESS(rv)) {
> @@ -941,16 +945,14 @@
>      char respcode[4]; /* 3 digits and null */
>  
>      r = sizeof(buffer);
> -    apr_setsocketopt(c->aprsock, APR_SO_TIMEOUT, aprtimeout);
>      status = apr_recv(c->aprsock, buffer, &r);
> -    if (r == 0 || (status != APR_SUCCESS && !APR_STATUS_IS_EAGAIN(status)))
{
> +    if (APR_STATUS_IS_EAGAIN(status))
> + return;
> +    if (r == 0 || status != APR_SUCCESS) {
>   good++;
>   close_connection(c);
>   return;
>      }
> -
> -    if (APR_STATUS_IS_EAGAIN(status))
> - return;
>  
>      totalread += r;
>      if (c->read == 0) {
> 


Mime
View raw message