Prácticas recomendadas para gestionar la memoria

Si una instancia de Memorystore para Redis no se gestiona ni se configura correctamente, puede experimentar presión de memoria, lo que puede afectar al rendimiento de la aplicación. En esta página se describen las prácticas recomendadas que puedes usar para gestionar de forma eficiente el uso de memoria de tu instancia.

En este tema:

Conceptos de gestión de la memoria

En esta sección se presentan los conceptos que debes conocer para gestionar el uso de memoria de tu instancia.

Capacidad de instancia

  • La capacidad de la instancia es la cantidad de memoria que aprovisionas en gigabytes (GB) y por la que se te cobra. Para obtener más información sobre cómo seleccionar la capacidad de instancia adecuada, consulta Ajustar el tamaño de una instancia de Memorystore.

Configuración de maxmemory

  • Maxmemory es una configuración de Redis que te permite definir el límite de memoria en el que se aplica tu política de desalojo. Memorystore para Redis designa esta configuración como maxmemory-gb. Cuando creas una instancia, maxmemory-gb se define como la capacidad de la instancia. En función de la métrica de proporción de uso de memoria del sistema, es posible que tengas que reducir el límite de maxmemory-gb para proporcionar una sobrecarga de memoria en los picos de carga de trabajo.

    Para obtener más información, consulta el artículo Gestionar la proporción de uso de la memoria del sistema.

    Para saber cómo ajustar maxmemory-gb, consulta Configurar instancias de Redis.

Ratio de uso de memoria del sistema

  • La métrica Ratio de uso de memoria del sistema te permite medir el uso de memoria de una instancia en relación con la memoria del sistema. Memorystore gestiona automáticamente la memoria del sistema para controlar los picos de uso de memoria causados por operaciones que requieren mucha memoria y la fragmentación de la memoria, que es habitual en Redis de código abierto.

    Si la métrica de la proporción de uso de memoria del sistema supera el 80%, significa que la instancia está sometida a presión de memoria y debes seguir las instrucciones que se indican en Gestionar la proporción de uso de memoria del sistema. Si no tomas medidas y el uso de memoria sigue aumentando, corres el riesgo de que la instancia falle por falta de memoria. Es posible que la métrica de la proporción de uso de la memoria del sistema supere el 80% debido a la fragmentación de la memoria. Por otro lado, si la métrica aumenta rápidamente hasta el 80% o más, es posible que hayas usado una de las operaciones que consumen mucha memoria.

    El ratio de uso de la memoria del sistema debe ser del 50% o inferior durante las actualizaciones de mantenimiento. Además, a veces, para exportar, se requiere que el ratio de uso de la memoria del sistema sea del 50% o inferior.

Memoria usada

  • La métrica Memoria usada muestra la cantidad de datos que hay en tu instancia de Memorystore. La memoria usada de una instancia puede aumentar hasta el límite de configuración de maxmemory-gb. Cuando la memoria usada supera tu límite de maxmemory-gb, se aplica tu política de desalojo.

Política de desahucio

  • La política de desalojo de tu instancia (también conocida como política maxmemory) determina cómo desalojará Redis las claves cuando los datos de tu instancia alcancen el maxmemory-gb límite. Redis elimina claves como parte del caso práctico normal de uso de la caché. La expulsión de claves se produce como un proceso en segundo plano, por lo que las claves no se expulsan inmediatamente después de alcanzar el límite de maxmemory-gb. Una alta tasa de escritura puede superar la tasa de expulsión de claves, lo que provoca que se agote la memoria.

    La política de desalojo predeterminada de una instancia de Memorystore es volatile-lru. Si usas una volatile-* política de desalojo, asegúrate de definir TTLs en las claves que quieras que caduquen. De lo contrario, Redis no tendrá claves que desalojar.

    Para ver una lista de las políticas de desalojo, consulta las políticas de maxmemory.

    Para saber cómo cambiar tu política de desalojo, consulta Configurar instancias de Redis.

Fragmentación de la memoria

  • La fragmentación de la memoria puede provocar que tu instancia de Memorystore se quede sin memoria, aunque la proporción de memoria usada con respecto a la memoria total sea baja.maxmemory-gb La fragmentación de la memoria se produce cuando el sistema operativo asigna páginas de memoria que Redis no puede utilizar por completo después de repetidas operaciones de escritura y eliminación. La acumulación de este tipo de páginas puede provocar que el sistema se quede sin memoria y, finalmente, que el servidor Redis falle. La configuración de activedefrag Redis puede ayudar a reducir la fragmentación.

Desfragmentación activa

  • Las versiones 4.0 y posteriores de Redis ofrecen una configuración activedefrag. Si es posible, debes crear tu instancia de Memorystore con Redis 4.0. Memorystore asigna el valor "no" a activedefrag de forma predeterminada. Si se define activedefrag como "yes", se produce un intercambio de CPU, pero puede ayudar a mitigar la fragmentación de la memoria, que contribuye a los problemas de falta de memoria.

    Si la métrica de ratio de uso de memoria del sistema indica fragmentación de la memoria, deberías activar activedefrag. De lo contrario, activedefrag sigue siendo un ajuste opcional.

Operaciones con un uso intensivo de la memoria

Las siguientes operaciones usan una cantidad de memoria significativa, sobre todo si se ejecutan junto con una tasa de escritura alta:

Operación de exportación

La función export (exportar) de Memorystore usa la operación BGSAVE de Redis, que usa la copia al escribir. En función del tamaño de los datos, el volumen de escritura y las claves utilizadas, la memoria necesaria para una exportación puede ser el doble del espacio que ocupan los datos. Por lo tanto, para que las exportaciones se realicen correctamente, es posible que tengas que reducir el límite de maxmemory-gb al 50% de la capacidad de tu instancia durante las exportaciones.

Operaciones de escalado y actualización de versiones

Escalar o actualizar durante periodos de carga de escritura alta puede ejercer presión sobre la memoria de tu instancia debido a la sobrecarga de memoria causada por la replicación. Además, una carga de lectura alta puede aumentar el tamaño del búfer de salida de Redis, lo que provoca un aumento de la presión de la memoria. Si se produce un error en una operación de escalado o actualización debido a la presión de memoria, debes hacer lo siguiente:

  • Reduce el maxmemory-gb al 50% de la capacidad de tu instancia antes de realizar una operación de escalado o actualización. Si es posible, también debe reducir maxmemory durante los periodos de poco tráfico de la instancia, ya que así se reduce el impacto negativo que tiene la reducción de maxmemory en su ratio de aciertos de caché.
  • Escalar o actualizar durante los periodos de baja actividad de escritura.

Mantenimiento

Mantenimiento: también añade presión de memoria a tu instancia. Debe tomar medidas para que la métrica "Ratio de uso de memoria del sistema" sea del 50% o inferior en el momento del mantenimiento programado. Para ello, puedes programar la tarea para un momento en el que el tráfico de la instancia sea bajo o aumentar temporalmente el tamaño de la instancia durante la ventana de mantenimiento para que la métrica Ratio de uso de memoria del sistema sea del 50% o inferior.

Monitorizar el uso de memoria de una instancia

Monitoriza las métricas y configura las alertas que se indican en esta sección. Estas métricas y alertas te permiten conocer el uso de memoria de tu instancia. Para obtener información sobre cómo ver métricas y configurar alertas, consulte Monitorizar instancias de Redis.

Métrica Dirección métrica completa
Maxmemory redis.googleapis.com/stats/memory/maxmemory
Uso de memoria redis.googleapis.com/stats/memory/usage
Ratio de uso de memoria redis.googleapis.com/stats/memory/usage_ratio
Duración de la sobrecarga de memoria del sistema redis.googleapis.com/stats/memory/system_memory_overload_duration
Ratio de uso de memoria del sistema redis.googleapis.com/stats/memory/system_memory_usage_ratio
Tasa de resultados en caché redis.googleapis.com/stats/memory/cache_hit_ratio
Claves que pueden caducar redis.googleapis.com/keyspace/keys_with_expiration
Claves caducadas redis.googleapis.com/stats/expired_keys
Claves expulsadas redis.googleapis.com/stats/evicted_keys

Ratio de uso de memoria

La métrica Ratio de uso de memoria indica cuánto se acerca el tamaño de tu conjunto de trabajo al límite maxmemory-gb. A menos que la política de desalojo se haya definido como no-eviction, el hecho de que los datos de la instancia alcancen el valor de maxmemory no siempre indica que haya un problema. Sin embargo, la expulsión de claves es un proceso en segundo plano que lleva tiempo. Si tienes una tasa de escritura alta, es posible que te quedes sin memoria antes de que Redis tenga tiempo de eliminar claves para liberar espacio.

Ratio de uso de memoria del sistema

La proporción de uso de la memoria del sistema es una métrica fundamental que se debe monitorizar. Para asegurarte de que la instancia tiene suficiente memoria para admitir tu carga de trabajo y otras operaciones que requieren mucha memoria, es importante que siempre haya suficiente memoria del sistema disponible.

Define una alerta para recibir una notificación si la métrica de la proporción de uso de la memoria del sistema alcanza el 80%. Si alcanza el 80%, debes empezar a monitorizar más de cerca la métrica de ratio de uso de memoria del sistema. Si la proporción de uso de la memoria del sistema sigue aumentando de forma drástica, debes activar activedefrag, reducir maxmemory y plantearte escalar tu instancia.

Cuando la proporción de uso de la memoria del sistema alcanza el 100%, se bloquea cualquier operación que aumente aún más el espacio de memoria de tu instancia y Redis devuelve el siguiente error:

-OOM command not allowed under OOM prevention.

Para obtener más información, consulta el artículo Gestionar la proporción de uso de la memoria del sistema.

Duración de la sobrecarga de memoria del sistema

Si el uso de memoria es demasiado alto, Memorystore bloqueará las escrituras en tu instancia para mantenerla en buen estado. Duración de la sobrecarga de memoria del sistema: registra cuánto tiempo permanece tu instancia en el estado de escritura bloqueada.

Deberías configurar una alerta para esta métrica y así saber cuándo se bloquean las escrituras de tu instancia. También puedes volver a consultar esta métrica para solucionar el problema de recepción del error -OOM command not allowed under OOM prevention..

Tasa de resultados en caché

Debes monitorizar periódicamente tu proporción de aciertos de caché para saber qué porcentaje de búsquedas de claves se devuelve correctamente mediante las claves de tu instancia de Redis. Por lo general, una proporción de aciertos de caché más alta es mejor que una más baja. Deberías anotar tu ratio de aciertos de caché antes de hacer cambios de configuración importantes, como ajustar el límite maxmemory-gb, cambiar tu política de desalojo o escalar tu instancia. Después de modificar la instancia, vuelve a comprobar la proporción de aciertos de caché para ver cómo ha afectado el cambio a esta métrica.

Claves que pueden caducar y claves caducadas

La métrica de Stackdriver Claves que pueden caducar monitoriza el número de claves que se han configurado para que caduquen. Si no hay claves que caduquen, puede ser un indicio de que no estás configurando TTLs en las claves. En estos casos, cuando los datos de la instancia alcanzan el límite de maxmemory-gb, no hay claves que expulsar, lo que puede provocar una condición de falta de memoria si utilizas una política de expulsión de volatile-*.

Otra métrica que puedes monitorizar son las claves caducadas. Si la métrica muestra muchas claves caducadas, pero sigues viendo presión de memoria en tu instancia, deberías reducir maxmemory-gb.

Resolver una condición de falta de memoria

A continuación, se indican algunas prácticas recomendadas que debes seguir si tu instancia tiene problemas de memoria o se producen errores por falta de memoria.

  1. Si usas una volatile-* política de expulsión, asegúrate de definir TTLs en las claves que quieras que caduquen. Consulta la política de desahucio para obtener más información.

  2. En las instancias que ejecutan Redis 4.0 y versiones posteriores:

    1. Activa activedefrag en tu instancia. Consulta más información sobre la desfragmentación activa.
  3. Consulta cómo usar las métricas para solucionar problemas de falta de memoria y obtener información valiosa sobre el uso de la memoria de tu instancia: Monitorizar el uso de la memoria de una instancia y Gestionar la proporción de uso de la memoria del sistema.

  4. Consulta cómo ajustar maxmemory al ejecutar operaciones que requieren mucha memoria.

  5. Si la relación de uso de memoria del sistema supera el 80 %, reduce el límite de maxmemory-gb de tu instancia. Para obtener más información, consulta el artículo Gestionar la proporción de uso de la memoria del sistema.

  6. Te recomendamos que aumentes la capacidad de tu instancia.

  7. Si sigues teniendo problemas de falta de memoria, ponte en contacto con el equipo de Asistencia de Google Cloud Platform.

Ajustar el tamaño de una instancia de Memorystore

En esta sección se describen tres enfoques distintos que te ayudarán a dimensionar correctamente tu instancia en función de tu carga de trabajo:

Determinar el tamaño inicial de una instancia de Memorystore

Primero, debes elegir si quieres una instancia de nivel estándar o de nivel básico. Para obtener más información sobre los niveles de Memorystore para Redis, consulta las funciones según nivel de Redis. Una vez que hayas seleccionado el nivel adecuado para tu aplicación, sigue estos pasos para determinar el tamaño de instancia que necesitas:

  1. Determina el tamaño de tus datos.

    • Estima el número de claves y el tamaño medio de las claves que tu aplicación escribirá en tu instancia de Redis. Multiplica estos valores para obtener una estimación aproximada del tamaño de la instancia que necesitas.
  2. Elige una política de desalojo.

    • Si usas la política noeviction maxmemory, el tamaño de tu instancia debe ser lo suficientemente grande como para contener tu carga de trabajo máxima y tu conjunto de trabajo. Si te quedas sin memoria con esta política maxmemory, tu instancia puede entrar en una condición de falta de memoria.
    • Otras políticas de desalojo no influyen en el tamaño de la instancia que debes aprovisionar.
  3. Aprovisionar memoria adicional para instancias de nivel Estándar

    • A diferencia de las instancias de nivel básico, las de nivel estándar reservan el 10% de la capacidad de la instancia como búfer de replicación. Si elige una instancia de nivel Estándar, asegúrese de tomar la estimación de datos del paso 1 y de aprovisionar un 10% adicional para el búfer de replicación.
  4. Estimar la tasa de escritura media y máxima

    • Si es posible, estima la tasa de escritura y el tamaño de las claves que usará tu aplicación. La tasa de escritura en comparación con la tasa de eliminación de claves determina la velocidad a la que crecerá tu instancia con el tiempo.
  5. Aumenta la escala para alcanzar la proporción de aciertos de caché que quieras

    • Monitoriza la proporción de aciertos de caché y, si no obtienes tantos aciertos de caché como quieres, significa que debes aumentar el tamaño de tu instancia o asegurarte de que tu aplicación escribe en tu instancia de Memorystore las claves que se solicitan y no las que se cumplen.

Determinar si tu instancia está bloqueando las escrituras debido a una condición de falta de memoria

Si aparece el siguiente error:

-OOM command not allowed under OOM prevention.

Después, comprueba si:

  1. La métrica de la proporción de uso de memoria del sistema superó el 80% justo antes de que tu instancia empezara a tener problemas.
  2. La proporción de uso de memoria del sistema aumentó muy rápidamente antes de que se produjeran problemas con tu instancia.
  3. La métrica Duración de sobrecarga de memoria del sistema mostró valores superiores a cero durante el mismo periodo en el que se produjeron escrituras bloqueadas.

Si es así, es probable que la instancia esté bloqueando las escrituras debido a que no tiene memoria suficiente.

Gestionar la proporción de uso de la memoria del sistema

Configura una alerta para recibir una notificación si la métrica Ratio de uso de memoria del sistema supera el 80%. Si la proporción de uso de memoria del sistema supera el 80%, debes tomar las medidas oportunas para que la instancia no se quede sin memoria. En función del volumen de escritura y del patrón de acceso a las claves, el uso de la memoria del sistema puede aumentar rápidamente hasta el 100 %. Memorystore ofrece las siguientes formas de gestionar la relación de uso de memoria del sistema:

  • Activa activedefrag en las instancias que ejecuten Redis 4.0 o versiones posteriores.
  • Reduce el límite de maxmemory-gb de tu instancia.
  • Escala verticalmente la instancia.
  • Elige la política de desalojo adecuada.
  • Definir TTLs en claves volátiles.
  • Eliminar manualmente las claves de tu instancia.

Activar activedefrag

Si la relación de uso de memoria del sistema supera el 80%, activa activedefrag (en el caso de las instancias que ejecutan Redis 4.0 o versiones posteriores). La desfragmentación puede tardar horas en liberar la memoria fragmentada. Si el tráfico de escritura es elevado, es posible que la desfragmentación por sí sola no sea suficiente para evitar que tu instancia se quede sin memoria. Por lo tanto, es posible que tengas que implementar las siguientes recomendaciones:

Reduce el límite de maxmemory de tu instancia

Si la proporción de uso de la memoria del sistema supera el 80 %, debe reducir maxmemory-gb, pero primero consulte cómo ha cambiado la proporción de uso de la memoria del sistema a lo largo del tiempo para determinar qué nuevo límite de maxmemory-gb debe establecer.

Situación 1: La proporción de uso de memoria del sistema ha ido aumentando de forma gradual y lenta. Es probable que haya fragmentación, por lo que debes reducir maxmemory-gb en pequeños incrementos hasta que la proporción de uso de la memoria del sistema se estabilice por debajo del 80%.

Situación 2: La proporción de uso de la memoria del sistema ha aumentado rápidamente y se observa una carga de escritura significativa en la instancia. Es probable que el pico se haya producido por una operación que requiere mucha memoria. En esta situación, debe reducir el maxmemory-gb límite en incrementos mayores para asegurarse de que la instancia evite entrar en una condición de falta de memoria o se recupere de ella. Ten en cuenta que reducir maxmemory puede disminuir la proporción de aciertos de caché de tus instancias. Una proporción de aciertos de caché mucho menor indica que debes aumentar la escala de tu instancia para que tu aplicación pueda aprovechar las ventajas de usar Redis. Para obtener información sobre cómo ajustar la configuración de maxmemory-gb, consulta Configurar instancias de Redis.

Ampliar una instancia

Sigue las instrucciones que se indican en Escalar instancias de Redis para aumentar la capacidad de tu instancia.

Ejemplo de escalado de maxmemory:

Si tienes una instancia de 10 GB con maxmemory-gb configurado en 8 GB, tendrás 8 GB para almacenar claves y 2 GB de sobrecarga de memoria. Si aumentas la escala de la instancia a 20 GB, maxmemory-gb se ajustará a 16 GB. Por lo tanto, tu instancia ahora tiene 16 GB de memoria para almacenar claves y 4 GB de sobrecarga. Consulta Escalar instancias de Redis para obtener instrucciones sobre cómo aumentar o reducir el tamaño de tu instancia.

Elige la política de desocupación adecuada

Si almacenas datos volátiles, elige una de las volatile-* políticas de desalojo. Si almacenas datos que no son volátiles, elige una de las allkeys-* políticas.

Eliminar manualmente las claves de tu instancia

Puedes mejorar las condiciones de falta de memoria eliminando claves de tu instancia manualmente. Se trata de una solución temporal que te ayuda a mejorar el estado de tu instancia.