This post will discuss caching support to Flask-Blogging
I deployed my blog (using Flask-Blogging extension) to a site I am building. I am currently hosting the test version on the free instance of Openshift. So these are not very powerful servers, and I wasn't expecting any great performance. Here is what I saw while using Version 0.3.2 of Flask-Blogging:
$> ab -kc 30 -t 10 https://ucarpool.org/blog/ Benchmarking ucarpool.org (be patient) Finished 267 requests Document Path: /blog/ Document Length: 4882 bytes Concurrency Level: 30 Time taken for tests: 10.061 seconds Complete requests: 267 Failed requests: 0 Keep-Alive requests: 267 Total transferred: 1428480 bytes HTML transferred: 1303494 bytes Requests per second: 26.54 [#/sec] (mean) Time per request: 1130.451 [ms] (mean) Time per request: 37.682 [ms] (mean, across all concurrent requests) Transfer rate: 138.65 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 34 95.5 0 353 Processing: 272 1040 374.4 936 2166 Waiting: 267 1037 374.5 933 2163 Total: 546 1074 349.5 968 2166 Percentage of the requests served within a certain time (ms) 50% 964 66% 1039 75% 1133 80% 1248 90% 1812 95% 1910 98% 2030 99% 2070 100% 2166 (longest request)
Thats a measely 26 requests/sec!
One of the features I have wanted to add to this extension is the ability to cache the pages. Blogs are typically heavy on reads, and light on writes. This makes an excellent case for caching.
In order to enable caching support, I am using Flask-Cache the caching extension for Flask. The version 0.4.0 of Flask-Blogging is released with caching support built in. Flask-Cache makes the caching backend configurable. It has support for various backends such as filesystem, redis, and memcache.
Here is resulting performance after using a filesystem based cache:
$> ab -kc 30 -t 10 https://ucarpool.org/blog/ This is ApacheBench, Version 2.3 <$Revision: 1528965 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking ucarpool.org (be patient) Finished 1815 requests Document Path: /blog/ Document Length: 4882 bytes Concurrency Level: 30 Time taken for tests: 10.004 seconds Complete requests: 1815 Failed requests: 0 Keep-Alive requests: 1815 Total transferred: 9710280 bytes HTML transferred: 8860830 bytes Requests per second: 181.43 [#/sec] (mean) Time per request: 165.351 [ms] (mean) Time per request: 5.512 [ms] (mean, across all concurrent requests) Transfer rate: 947.92 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 6 44.3 0 400 Processing: 80 158 46.1 150 411 Waiting: 79 156 46.1 147 410 Total: 83 164 58.9 152 518 Percentage of the requests served within a certain time (ms) 50% 152 66% 173 75% 183 80% 190 90% 217 95% 277 98% 357 99% 420 100% 518 (longest request)
Now we are able to serve 180 requests/second. A good 7X performance gain for using a filesystem cache. Using in memory like Redis, or SSD filesystem should be even better.
Flask-Blogging, the Flask extension to add Markdown based blog support to Flask sites, incorporates caching support which has greatly improved its performance.