httpd-modules-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Sorin Manolache <sor...@gmail.com>
Subject Re: cpu 100%
Date Thu, 31 Mar 2011 13:01:48 GMT
On Thu, Mar 31, 2011 at 14:32, Niko Goutte <ngoutte@hotmail.com> wrote:
>
> Hello,
>
> I developped an apache module which send small data coming from file.
> A client request from file through a Get request and data are sent with block
> size equals to 100KB.
> One 100KB buffer is allocated in the pool, then each buffer are used to create
> one bucket that will be sent just after being inserted into the brigade.
> To sum up:
> ----------------------------------------------------------------------------------------------------------------------------
> apr_bucket_brigade *bb;
> apr_bucket* b;
>
> bb = apr_brigade_create(r->pool, r->connection->bucket_alloc);
> Buf = apr_palloc(r->pool,100KB);
>
> while(lastBufferToSend==false)
> {
>  Processing(Buf);
>
>  b = apr_bucket_pool_create(Buf ,size, r->pool, r->connection->bucket_alloc)
;
>
>  APR_BRIGADE_INSERT_TAIL(bb, b);
>  APR_BRIGADE_INSERT_TAIL(bb,apr_bucket_flush_create(bb->bucket_alloc));
>
>  if(lastBufferToSend)
>  {
>    APR_BRIGADE_INSERT_TAIL(bb,apr_bucket_eos_create(bb->bucket_alloc));
>  }
>
>  rv = ap_pass_brigade(r->output_filters, bb);
>  if (rv != APR_SUCCESS)
>  {
>    return  HTTP_INTERNAL_SERVER_ERROR;
>  }
>
>  apr_brigade_cleanup(bb);
> }
>
> apr_brigade_destroy(bb);
> ----------------------------------------------------------------------------------------------------------------------------
>
>
> I want to call ap_pass_brigade for each buffer because I want the module to
> send immediatly 100KB.
>
> Clients don't have to wait for the complete processing of the file more than
> 2GB. They receive small blocks until the end.
>
> --------------------------------------------------------------------------------------------------------------------------
>
>
> Apache Server is in prefork mode.
> <IfModule prefork.c>
> StartServers 8
> MinSpareServers 5
> MaxSpareServers 20
> ServerLimit 256
> MaxClients 256
> MaxRequestsPerChild 4000
> </IfModule>
>
> In worker mode, everything is excepted 10 bytes that are send in addition including value
> "\n256\r\n" : it is very strange because the sum of every chunk corrsesponds exactly
to the expected size.
> <IfModule worker.c>
> StartServers 2
> MinSpareThreads 25
> MaxSpareThreads 75
> ThreadPerChild 64
> MaxClients 1024
> MaxRequestsPerChild 0
> </IfModule>
>
> --------------------------------------------------------------------------------------------------------------------------
>
> MY PROBLEMS:
>
> In prefork mode, the first 8 client requests (which corresponds to the StartServers =
8) are well processed. My client received all data, everything is fine.
> But the 9th freezes the module in ap_pass_brigade function. httpd is freezed with 100%
cpu on this process.
>
> In worker mode, it is ok excepted the 10 bytes added. It seems that it is linked with
apr_brigade_destroy or apr_bucket_delete(b).


Are you sure that the value of lastBufferToSend changes in your while-loop?

Can you post your exact code to see how you add the 10 bytes?

Sorin

Mime
View raw message