Solución al error "Background saving terminated by signal 9" en Redis

Author
Por Darío Rivera
Publicado el 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

Acerca de Darío Rivera

Author

Application Architect at Elentra Corp . Quality developer and passionate learner with 10+ years of experience in web technologies. Creator of EasyHttp , an standard way to consume HTTP Clients.

LinkedIn Twitter Instagram

Sólo aquellos que han alcanzado el éxito saben que siempre estuvo a un paso del momento en que pensaron renunciar.