httpd-modules-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Niko Goutte <ngou...@hotmail.com>
Subject cpu 100%
Date Thu, 31 Mar 2011 12:32:39 GMT

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).

If someone can provide me answers to these problems, I'll be very happy.

Thank you.

Nicolas.

 		 	   		  
Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message