Redis Benchmark

¿Cuán rápido puede Reddit Correr?

Redis es muy rápido, ¿pero cuánto? Realmente si no medimos la capacidad de nuestro nodo o cluster no podemos saber en qué cifras nos movemos y por tanto saber cuánto aguantará nuestra aplicación.

Pista: seguramente Redis no sea tu cuello de botella.

Velocidad de los comandos

En mi caso, desde un MacBook Pro (Retina, 15-inch, Mid 2015) con un 2,2 GHz Quad-Core Intel Core i7, y usando redis en Docker (redis:5) los resultados son los siguientes:

$ docker exec -it myredis redis-benchmark -q
PING_INLINE: 31847.13 requests per second
PING_BULK: 33411.29 requests per second
SET: 31377.47 requests per second
GET: 31816.74 requests per second
INCR: 31017.37 requests per second
LPUSH: 32520.32 requests per second
RPUSH: 30731.41 requests per second
LPOP: 32362.46 requests per second
RPOP: 33760.97 requests per second
SADD: 32499.19 requests per second
HSET: 32905.56 requests per second
SPOP: 32123.36 requests per second
LPUSH (needed to benchmark LRANGE): 31515.91 requests per second
LRANGE_100 (first 100 elements): 20942.41 requests per second
LRANGE_300 (first 300 elements): 12217.47 requests per second
LRANGE_500 (first 450 elements): 9434.85 requests per second
LRANGE_600 (first 600 elements): 7601.09 requests per second
MSET (10 keys): 29559.56 requests per second

En un servidor de DigitalOcean (Droplet 1GB) los resultados son:

[email protected]:~# redis-benchmark -q
PING_INLINE: 36900.37 requests per second
PING_BULK: 38358.27 requests per second
SET: 38580.25 requests per second
GET: 41050.90 requests per second
INCR: 37750.09 requests per second
LPUSH: 39401.10 requests per second
RPUSH: 38491.14 requests per second
LPOP: 37397.16 requests per second
RPOP: 36483.04 requests per second
SADD: 38639.88 requests per second
HSET: 38417.21 requests per second
SPOP: 39370.08 requests per second
LPUSH (needed to benchmark LRANGE): 40371.42 requests per second
LRANGE_100 (first 100 elements): 22416.50 requests per second
LRANGE_300 (first 300 elements): 9600.61 requests per second
LRANGE_500 (first 450 elements): 7243.23 requests per second
LRANGE_600 (first 600 elements): 5317.17 requests per second
MSET (10 keys): 35198.87 requests per second

A mi me parecen impresionantes.

Detalles por comando

Si queremos resultados más detallados siempre podemos ir a por un caso concreto, como por ejemplo con el comando set:

[email protected]:~# redis-benchmark -t set
====== SET ======
  100000 requests completed in 2.73 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

71.05% <= 1 milliseconds
99.75% <= 2 milliseconds
99.95% <= 3 milliseconds
100.00% <= 3 milliseconds
36643.46 requests per second

Mejorar lectura en Redis mediante Pipelining

Si nuestra web tiene que ejecutar 10 comandos para cargar la home, y podemos leer a 30K req/segundo, parecería que sólo podemos servir la home a 3K usuario por segundo.

Pero en los benchmarks, realmente estamos lanzando un comando esperando la respuesta para lanzar el siguiente. Redis soporta «piepelining» que básicamente es lanzar varios comandos a la vez y esperar la respuesta de todos ellos. Esto acelera dramáticamente la velocidad. En éste caso vamos a usar comandos de 10 en 10 (suponiendo que podemos hacer todas las peticiones a Redis para cargar la home en una sola petición) y vemos los siguientes resultados:

[email protected]:~# redis-benchmark -n 1000000 -t get -P 10 -q
GET: 289519.41 requests per second

289K req/segundo. Dan para bastante juego. Serían 28K usuarios cagando la home por segundo.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *