Redis Violento

Cuando te equivocás, por ignorante, en la configuración de un servidor y todo se rompe, eso me pasó con Redis.

Anteriormente expliqué cómo hacer para usar Redis como "caché" y acelerar así sitios en Wordpress. Algo más que necesario cuando tenés sitios gigantes y/o con alto tráfico. Lo que yo no sabía en ese entonces era de una limitación que se podía dar.

Aquí les cuento el problema y la solución...

Hace unos días dejé la configuración de 5 sitios (con Wordpress) lista, todos usando Redis con su propia config para que tuvieran cacheadas las consultas repetidas al MySQL. La mejora de velocidad fue notable y el uso y carga del servidor bajaron al mínimo.

Pasé de tener números ridículos de carga (load por encima de 20) a algo normal (por debajo de 2) y todo parecía fantástico. Hasta que algo se rompió.

De pronto recibo el aviso de mi VPS que estaba andando mal, entro y casi ni podía usar la consola, el uso de memoria RAM estaba al 100% y la carga por encima de 60! No tenía sentido, ni siquiera había tanto tráfico. Miro el consumo de memoria y Redis se estaba cargando el servidor entero.

Redis tiene un techo

Lo que yo no sabía es que por default redis no le pone límite al consumo de RAM y usa todo lo que se le canta. Uno tiene que dividir lo que dispone (es un VPS, no es que tenga mucha) entre Apache, MySQL y Redis, los dos primeros son los principales.

Pero no alcanza con limitarle la memoria. Además hay que dejarle explícito cómo liberarla. Ambas configuraciones NO VIENEN de base.

Cuando se tiene un sólo sitio web con Redis es poco probable que reviente, funciona tranquilo, pero aquí eran cinco a la vez con muchas, muchas notas. Como tienen más de 50.000 artículos por sitio eso implica cientos de miles de queries que se hacen a la DB que son distintos entre sí.

Redis guardará TODO los queries sin borrarlos, como si fuesen claves (guarda clave-resultado sin saber qué es cada cosa) y si nada le indica que debe vaciarlos los guardará en RAM hasta que se vuelvan a necesitar.

Al no tener suficiente RAM esto es lo que sucedió:

Hasta el VPS dejó de medir de a ratos, la carga pasó de 1 a 68 y es un VPS con sólo dos núcleos! En el momento que la memoria RAM pegó al 100% todo empezó a fallar.

Poniéndole límites de memoria a Redis

Primero que nada hay que indicarle un máximo de memoria, a Redis no le gusta mucho que lo limiten así que tengan en cuenta que un valor demasiado pequeño es como que no le servirá de mucho. Editen el /etc/redis/redis.conf o donde tengan el archivo de configuración:

El parámetro es 

maxmemory <bytes>

Si tienen 4GB de RAM yo pondría 2GB, se puede escribir así, 2gb o 2000mb, lo interpreta con caracteres:

# 1k => 1000 bytes
# 1kb => 1024 bytes
# 1m => 1000000 bytes
# 1mb => 1024*1024 bytes
# 1g => 1000000000 bytes
# 1gb => 1024*1024*1024 bytes

Pero aquí lo interesante de Redis. Una cosa es la memoria a utilizar pero ¿Cómo la libera? El siguiente parámetro es el método de limpieza que utilizará, en el mismo archivo de configuración te explica las políticas disponibles.

# volatile-lru -> Evict using approximated LRU among the keys with an expire set.
# allkeys-lru -> Evict any key using approximated LRU.
# volatile-lfu -> Evict using approximated LFU among the keys with an expire set.
# allkeys-lfu -> Evict any key using approximated LFU.
# volatile-random -> Remove a random key among the ones with an expire set.
# allkeys-random -> Remove a random key, any key.
# volatile-ttl -> Remove the key with the nearest expire time (minor TTL)
# noeviction -> Don't evict anything, just return an error on write operations.
#
# LRU means Least Recently Used
# LFU means Least Frequently Used
#
# Both LRU, LFU and volatile-ttl are implemented using approximated
# randomized algorithms.

Esto depende de nuestras necesidades, yo usé allkeys-lru y funcionó perfecto, la última versión de Redis incorporó los LFU que estan buenos como concepto.

Por default viene lo siguiente:

maxmemory-policy noeviction

Y al parecer ESE era el problema de tener cinco sitios al mismo tiempo

maxmemory-policy allkeys-lru

Reiniciado el servicio y ahora sí, anda como se debe:

Más info: 1 y 2

Si te gustó esta nota podés...
Invitame un café en cafecito.app


Otros posts que podrían llegar a gustarte...

Comentarios

  • Danbat     19/06/2023 - 18:26:08

    Lo sumo a las cosas que es muy poco probable que alguna vez utilice pero que nunca está de más saber.

    De hecho, una vez tenía que resolver algo, recordé que habías escrito sobre eso, usé el buscador y sí, había un artículo de como 10 años atrás que lo explicaba. Una mezcla entre Stackoverflow y The Internet Archive.

Deje su comentario:

Tranquilo, su email nunca será revelado.
La gente de bien tiene URL, no se olvide del http/https

Negrita Cursiva Imagen Enlace


Comentarios ofensivos o que no hagan al enriquecimiento del post serán borrados/editados por el administrador. Los comentarios son filtrados por ReCaptcha V3.