Solución al error "Background saving terminated by signal 9" en Redis
Es bastante común que el servicio de redis reporte este error cuando tiene un fallo en la asignación de memoria disponible y no puede guardar los datos. Si cuando inicias el servicio de redis obtienes una alerta como la siguiente
WARNING overcommit_memory is set to 0! Background save may fail under low memory condition
Es muy probable q estés teniendo errores por poca memoria disponible. Cuando hay un error de memoria generalmente se escribirá en el log de redis el siguiente error.
Background saving terminated by signal 9
Para verificar esto, puedes hacer uso de la CLI de redis y observar algunos valores de memoria.
user@server$ redis-cli info memory | grep _human
used_memory_human:69.72M
used_memory_rss_human:120.87M
used_memory_peak_human:154.82M
total_system_memory_human:23.32G
used_memory_lua_human:44.00K
used_memory_scripts_human:200B
maxmemory_human:0B
Vamos a ponerlo un poco más claro resaltando los puntos más importantes:
memoria asignada por redis
used_memory_human: 69.72M
memoria reportada por el S.O
used_memory_rss_human: 120.87M
pico más alto de memoria consumido
used_memory_peak_human: 154.82M
Por otro lado, pareciera que la memoria para redis es bastante grande (total_system_memory_human), sin embargo, esto corresponde a que estos datos vienen de una instancia de redis en linux, por lo cual la memoria total será la memoria del host. Redis estará sujeto a la máxima memoria asignada en el contenedor.
Docker
Si usas docker, puedes comprobar si estos valores están muy cerca del umbral disponible para el contenedor con el siguiente comando:
user@server$ docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM %
3cf88e6f3fdb test-redis 0.25% 126.2MiB / 128MiB 98.58%
Estando la memoria a un casi 99% es casi imposible ignorar un error de asignación de memoria.
Dentro de la instancia puedes probar obteniendo el máximo de memoria disponible.
user@server$ cat /sys/fs/cgroup/memory.max
134217728
Ya que 134217728 to Mib = 128MB, ese será nuestro límite de memoria actual.
En este caso, se debe asignar más memoria al contenedor en los límites de recursos tal y como se muestra a continuación.
redis:
container_name: test-redis
deploy:
resources:
limits:
memory: 128M