On 10/15/08 6:56 PM, "Graham Leggett" <[EMAIL PROTECTED]> wrote:

> Obviously, if the loop comes round more than once, then the client comes
> into play. This definitely needs to be fixed, it is a big performance issue.

Could a more general purpose optimization be done?  I was thinking of a
generic "store and forward" filter.  Basically, just dump the entire brigade
into some storage (memory, file) in a loop (like deflate sorta does) without
sending to client at all until the response is finished.  This would work
for proxy, php, some strange handler, etc.

A small test I did was a module had a filter that just dumped all the
brigade contents into a temp file. When it saw EOS, it would then send the
complete file to the client (via sendfile, mmap, etc..) and remove the
tempfile. Almost like an in process "X-Sendfile."   This very rudimentary
module increased overall throughput of some large SSI files by about 20% and
completely shielded origin servers from clients in some proxy tests.  It
also did not consume very much memory (although I was writing the temp files
into /dev/shm on Linux).

Basic logic - I ignored flush and meta buckets in my tests:

  while (!APR_BRIGADE_EMPTY(bb)) {
    
        e = APR_BRIGADE_FIRST(bb);
    
        if (APR_BUCKET_IS_EOS(e)) {
            create a file bucket with the tempfile and send it along
            tempfile was opened with APR_DELONCLOSE
        } else {
                apr_bucket_read(e,
            write content to temp file
    }
        apr_bucket_delete(e);
 }
   apr_brigade_cleanup(bb);
    return APR_SUCCESS;



-- 
Brian Akins
Chief Operations Engineer
Turner Digital Media Technologies

Reply via email to