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

Author
By Darío Rivera
Posted on 2022-11-18 in 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

Ingeniero de desarrollo en PlacetoPay , Medellín. Darío ha trabajado por más de 6 años en lenguajes de programación web especialmente en PHP. Creador del microframework DronePHP basado en Zend y Laravel.

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