After a few months away from
mongrel-esi, I decided it was time to finish some long standing improvements. Here's the list:
- Correctly handle max-age attribute
- Ragel 6.x compatibility
- Pipeline ESI fragment requests.
Correctly handling max-age attribute
It used to be hard coded to 600 milliseconds. Now setting
max-age attribute on <esi:include tag will set the cache ttl for that fragment correctly. This means it's easy to load test without caching or with caching.
Ragel 6.x compatibility
There was a change in how ragel handles
EOF. The fix was minor and doesn't break compatibility with ragel 5.x.
Pipeline ESI Fragment Reqeusts
The pipeline work, that I started
here - has increased the servers response time stability, but slightly reduced it's average response time under load. I'm still tweaking to figure out if I can increase the concurrency further to get an even faster average - under load. I should be making another gem release in the next week, with those improvements. For now, have a look at the numbers below - the standard deviation graph and the raw response time graph show the improved response stability.
Average Request time

Standard Deviation

The Raw Data

One explanation for the increased average is that more users are a getting partial bits of the page faster, but because more requests are getting equal response time the whole is slower. Where as the serial server favored a single request at a time - the pipelined favors all requests equally giving everyone some bits immediately, but taking longer to server them all out. I need to do some more thorough analysis to verify this idea. I could for example measure the amount of time it takes to get the first chunk from each server....
Next I plan on bringing the average request time down even further - the goal being to bring the pipelined average below the serial version. For now stay tuned, more to come...