Redis in Asyncio Land Part 2

Posted on Sat 15 April 2017 in Performance

Intro

In part 1 of this series, I have looked at a dead-simple "benchmark": set a key, get a key, twenty thousand times. I have used a local Redis server on a couple of systems, both on bare metal and on a virtual machine. Both synchronous and asynchronous frameworks/modules were used. The results were quite interesting: Python's asyncio with uvloop with one hundred coroutines was the fastest option by a good margin.

Repeating the same tests (for a description of the tests, their code and the test setup, please refer to part 1) using a remote Redis server proved to be quite interesting. I am using a remote Redis in the local network: ping times are of the order of 0.2-0.3 ms. Here are the results

Test Client Server Worst Best Stdev
test_sync Debian VM Mac Pro 1173.38 1259.33 32.24 (3%)
test_sync_pipe Debian VM Mac Pro 2129.48 2219.08 32.59 (2%)
async_runner Debian VM Mac Pro 8228.97 12072.66 1634.06 (13%)
async_runner_uvloop Debian VM Mac Pro 17467.09 18314.50 374.80 (2%)
test_sync Mac Pro Debian VM 1565.76 1586.45 7.65 (<1%)
test_sync_pipe Mac Pro Debian VM 2259.72 2416.88 66.23 (3%)
async_runner Mac Pro Debian VM 5002.71 5080.10 31.20 (<1%)
async_runner_uvloop Mac Pro Debian VM 8223.74 8536.67 133.42 (2%)

The table above shows that, with the test code used, asyncio-based tests are significantly faster than the synchronous ones. The reason might be the greater role that latency plays in the communication with a remote server.

Interesting things to notice: all the test show some variability, as it should be expected. The observed variability (as measured by the stdev of the five repetitions) is of the order of a few percent. There are some outliers with a large variation in run times. As mentioned in part 1, we should not read too much in the standard deviation figures: lots of processes are normally active on a modern computer and they can all interfere with the tests, however.

In any case, it is interesting to see how one could easily reach one thousand set+get operations per second on a remote Redis without breaking much of a sweat. Using asyncio, even trivially, can make our code five to ten time faster! Not bad at all.