> On Mon, 2 Jul 2001, Cliff Woolley wrote:
>
> > On Mon, 2 Jul 2001, dean gaudet wrote:
> >
> > > sendfile() is the best thing to use on linux (and probably everywhere else
> > > that has it).  it doesn't require any virt->phys mappings to be created,
> > > and supports zero-copy.
> >
> > I guess the easy answer is that AP_MIN_BYTES_TO_WRITE ought to be
> > decreased (possibly by a lot).  It's currently set to 8KB.  If it were,
> > say, 1KB, then any file bigger than 1KB would get sendfile'd, even in
> > keepalive requests.  We've been talking about changing it for a while now,
> > and just haven't gotten around to it because no one (that I know of) has
> > done any testing to figure out what a "good" value would be.  How many
> > bytes is "enough" to warrant dumping a packet onto the network?  I don't
> > know for sure, but it's clearly < 8KB.
>
> you don't need to dump a packet on the network... that's what TCP_CORK is
> all about.  see <http://www.kegel.com/c10k.html> and search for TCP_CORK
> to find out more info.
>
> the trick to using TCP_CORK is to understand how the haldduplex /
> safe_read stuff worked in 1.3 -- every time you're in need of blocking on
> read (to get more requests) you want to pop the cork.  you want to put a
> new cork on before you write anything

We have safe_read (sort of) in Apache 2.0. When we serve a static file, we open the 
file, create a
file_bucket (that contains the open file descriptor) and send the bucket down the 
filter chain.
sendfile() is used to send the file iff the connection is -not- a keepalive 
connection.  If the
connection is a keepalive connection, the file is mmaped (within min/max size 
criterion) and the
MMAP stored in case we want to pipeline responses back (ie, if the next request is 
pipelined).

I'm not sure I understand the reason for MMAPing the file, but I'm thinking it had to 
do with the
difficulty of figuring out what to do with multiple file handles should you actually 
need to serve
static respoonsese to pipelined requests.  For example, if you have three responses to 
serve
pipelined, each with three file handles, how do you make all the packets go out 
optimally filled?
If you MMAP the three files, you cand do a writev() with six vectors (3 sets of 
headers and 3
buffers if the files are small), the stack will do the right thing.

On Linux, can you TCP_CORK, call sendfile() x times then do an uncork and have all the 
packets flow
out optimally filled? If so, then that is quite cool and that is what we should be 
doing.  Am I
correct in assuming that you suggest we not use MMAP at all in a threaded server? That 
is, only use
sendfile() or read(file, buf)/write(socket,buf) when using threaded MPMs?

Bill

Reply via email to