On 09.04.2012 18:44, Sven Van Caekenberghe wrote:

On 09 Apr 2012, at 11:48, Philippe Marschall wrote:

Hi

This is a small update on the work I've been doing on the AJP adapter for 
Seaside. I've optimized the content rendering and reduced the amount of copying 
it does for content rendering (header rendering still does more copying than 
strictly necessary).

The most dramatic change is with a 16k response (WAFastRequestHandler) where 
throughput is up from 75 Mbytes/s to 100 Mbytes/s [1]. This is now close to 
saturating a gigabit link. With an 8k response (WADwBenchHandler) we're now at 
about 7500 req/s [2] up from a about 6500 req/s. That's close to where the 2 
byte response performance was back in February. Speaking of which a 2 byte 
response (WASmallRequestHandler) is now at 8700 req/s [3] up from about 8100 
req/s.

Apache 2.2.22 mpm_worker mod_proxy_ajp
CPU Intel(R) Core(TM)2 Duo CPU     E7500  @ 2.93GHz
Cog r2540

You can get the code in the Seaside-Benchmark package in the addons repository 
[4].

[1] https://gist.github.com/2339951
[2] https://gist.github.com/2339947
[3] https://gist.github.com/2339940
[4] http://www.squeaksource.com/Seaside31Addons

Cheers
Philippe

That is great news, Philippe.
I like the WADwBenchHandler because it does dynamically create a 25x25 table on 
each request.

No, I modified it so that it just returns a "static" byte array. I didn't want to benchmark any other code.

Proves that you can get far by optimizing really hard.
Another datapoint for those asking performance related questions.

Are the rendering optimizations that you did something that will be/become part 
of Seaside proper ?

Yes and no. The parts where Seaside code was involved are in the latest 3.1 code. The rest is a custom subclass of WARequest that only works for AJP. Moving this to Seaside would make no sense. The trick here is to use a custom stream-like object that gets reused for every request and to which I don't have to send #contents (because that makes a copy). It's tricky because AJP uses 8k packets and I have to insert a header and trailer at the packet boundaries. It would be simpler to do for HTTP because you don't need to deal with packet boundaries. But tight integration with the server is required.

Cheers
Philippe


Reply via email to