I'm convinced, thank you very much for taking the time to
test and analyze this. 

We should switch the setting in the main branch - not sure if 
Remy has a branch for 4.1/4.0, and if he has I think he 
should decide if he wants this backported. 
If anything happens we can roll back.

I hope we'll hear more from Han Ming in future :-)

Costin

Han Ming Ong wrote:

> [+1]
> 
> Theoretical backup:
> 
> Analyzing the protocol at
> http://jakarta.apache.org/tomcat/tomcat-4.1-doc/jk2/common/AJPv13.html
> and the tcp dump confirms that ajp13 first sends Headers (small load)
> back to Apache, followed by Body Chunk (big load) and then an End
> Response (small load).
> 
> I can't draw nice ASCII art but here's the summary for a typical
> request-response loop currently (there is a variation with TC getting
> body chunk from Apache but not considered here).
> 
>    1. Apache ------->         request headers --------> TC
> 
>    2. Apache <-------         response headers        <-------- TC
> 
>    There are 2 scenarios that can happen after this.
> 
>    3a. Apache <-------        response body   <-------- TC
> This happens immediately if size of the response chunk is greater than
> MSS or MTU (say 1500 bytes), regardless of whether TCP_NODELAY is on or
> off.
> 
>          Apache <-------      end response headers    <-------- TC
> 
> 
>    3b. Apache ------->        DELAYED_ACK     --------> TC
>         Apache <-------       response body + end response headers <--------
> TC
> 
> If TCP_NODELAY is off, TC waits for ACK from Apache. However, on Mac
> OS X and RedHat, DELAYED_ACK is turned on by default in the OS. On the
> Mac OS X, it's 200ms and I think it is 40ms with RH. Hence, if size of
> the response chunk is less than say 1500 bytes, there will be a delay
> of ~200ms on Mac OS X before Apache sees the body[1].
> 
> The good thing about this is that the end response headers is usually
> coalesced with the response body due to TCP_NODELAY off (Nagle).
> 
> 
> Now imagine that TCP_NODELAY Is turned on by default, then we would see
> the scenario of 3a happening all the time, regardless of size of body.
> This will result in faster response. The downside that I see is that
> "end response headers" will be sent in a separate packet.
> 
> Some lab results:
> 
> I patched up TC's ajp13 java class and gave the patch to our QA person.
> After 4 hours of testing, she reported that
> 
> 1. performance for small body chunks (typical size < 1500) is now on
> par with ajp12
> 2. performance for bigger body chunks does not degrade.
> 
> [1] We did almost all our tests on Mac OS X but I ran the test a few
> times on RedHat. The degradation doesn't seem to be as bad on Redhat. I
> only saw a 50% drop in performance, comparing ajp13 to ajp12. I have
> read that Linux kernel is smarter on the DELAYED_ACK algorithm.
> 
> [2] I'm sorry that we didn't do tests on the rest  of the platforms
> supported by Apache and Tomcat but hopefully, you will be convinced by
> the theoretical underpinnings.
> 
> Thank you for your kind attention. Comments and counter-points welcome.
> 
> Han Ming
> 
> On Tuesday, October 8, 2002, at 04:26  AM, Henri Gomez wrote:
> 
>> What about setting tcpnodelay to true by default
>> for Ajp13 connectors java implemtations ?
>>
>> It should fix MacOS X latency problems and should be
>> the default for any persistant connections...
>>
>> Comments welcome...
>>

-- 
Costin



--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to