Prácticas recomendadas para la administración de la memoria

Una instancia de Memorystore para Redis, si no se administra y configura de forma correcta, puede experimentar una presión de memoria que puede afectar el rendimiento de la aplicación. En esta página, se describen las prácticas recomendadas que puedes usar para administrar de manera eficiente el uso de memoria de tu instancia.

En este tema:

Conceptos de administración de memoria

En esta sección, se presentan conceptos que debes comprender para administrar el uso de memoria de tu instancia.

Capacidad de la instancia

  • La capacidad de la instancia es la cantidad de memoria que se aprovisiona en Gigabytes (GB), y lo que se te cobra por eso. Para obtener más detalles sobre cómo seleccionar la capacidad de instancia correcta, consulta ajusta el tamaño de tu instancia de Memorystore.

Configuración de Maxmemory

  • Maxmemory es una configuración de Redis que te permite establecer el límite de memoria en el que se implementa la política de expulsión. Memorystore para Redis designa esta configuración como maxmemory-gb. Cuando creas una instancia, maxmemory-gb se establece en la capacidad de la instancia. Según la métrica de la proporción de uso de memoria del sistema, es posible que debas reducir el límite de maxmemory-gb a fin de proporcionar sobrecarga de memoria para los aumentos de carga de trabajo.

    Para obtener más detalles, consulta Cómo administrar la proporción de uso de memoria del sistema.

    Para aprender a ajustar maxmemory-gb, consulta Configura instancias de Redis.

Proporción de uso de memoria del sistema

  • La métrica de proporción de uso de memoria del sistema te permite medir el uso de la memoria de una instancia en relación con la memoria del sistema. Memorystore administra la memoria del sistema de forma automática para manejar los aumentos de uso de memoria que generan las operaciones de uso intensivo de memoria y la fragmentación de memoria, que son comunes en Redis de código abierto.

    Si la métrica de proporción de uso de memoria del sistema supera el 80%, esto indica que la instancia está bajo presión de memoria y debes seguir las instrucciones en Administra la proporción de uso de memoria del sistema. Si no tomas ninguna medida y el uso de memoria sigue creciendo, corres el riesgo de que falle una instancia debido a la falta de memoria. La métrica de proporción de uso de memoria del sistema puede superar el 80% debido a la fragmentación de memoria. De manera alternativa, si la métrica aumenta con rapidez al 80% o más, es posible que hayas usado una de las operaciones que consumen mucha memoria.

    Debes tener una proporción de uso de memoria del sistema del 50% o menos durante las actualizaciones de mantenimiento. Además, a veces, la exportación requiere una proporción de uso de memoria del sistema del 50% o menos.

Memoria en uso

  • 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 maxmemory-gb. Cuando la memoria usada excede tu límite de maxmemory-gb, la política de expulsión entra en vigor.

Política de expulsión

  • La política de expulsión de tu instancia (también conocida como política de maxmemory) determina cómo Redis expulsa las claves cuando los datos de la instancia alcanzan el límite de maxmemory-gb. Redis expulsa las claves como parte del caso de uso de caché normal. La expulsión de claves ocurre como un proceso en segundo plano, por lo que las claves no se expulsan de inmediato después de que se alcanza el límite maxmemory-gb. Una tasa de escritura alta puede superar la expulsión de claves, lo que da como resultado una condición de falta de memoria.

    La política de expulsión predeterminada de una instancia de Memorystore es volatile-lru. Si usas una política de expulsión de volatile-*, asegúrate de configurar los TTL en las claves que deseas que venzan; de lo contrario, Redis no tiene claves para expulsar.

    Para obtener una lista de políticas de expulsión, consulta Políticas de maxmemory.

    Para obtener información sobre cómo cambiar tu política de expulsión, consulta Cómo configurar instancias de Redis.

Fragmentación de memoria

  • La fragmentación de memoria puede causar que tu instancia de Memorystore se quede sin memoria, incluso cuando la proporción de memoria usada para maxmemory-gb sea baja. La fragmentación de memoria ocurre cuando el sistema operativo asigna páginas de memoria que Redis no puede usar por completo después de operaciones repetidas de escritura y eliminación. La acumulación de esas páginas puede provocar que el sistema se quede sin memoria y, finalmente, que el servidor de Redis falle. La configuración activedefrag de Redis puede ayudar a reducir la fragmentación.

Desfragmentación activa

  • Las versiones de Redis 4.0 y posteriores proporcionan una configuración activedefrag. Si es posible, debes crear tu instancia de Memorystore con Redis 4.0. En Memorystore, activedefrag se configura como “no” de forma predeterminada. Configurar activedefrag en “sí” implica una compensación de CPU, pero puede ayudar a mitigar la fragmentación de memoria, lo que contribuye a problemas de falta de memoria.

    Si la métrica de proporción de uso de memoria del sistema indica la fragmentación de memoria, debes activar activedefrag. De lo contrario, activedefrag seguirá siendo una configuración opcional.

Operaciones con uso intensivo de memoria

En las siguientes operaciones, se usa una memoria significativa, en especial cuando se ejecutan junto con una tasa de escritura alta:

Operación de exportación

La función de exportación de Memorystore usa la operación BGSAVE de Redis, que usa la función de copia en escritura. Según el tamaño de los datos, el volumen de operaciones de escritura y las claves afectadas, la memoria requerida para una exportación puede ser el doble del tamaño del espacio que ocupan tus datos. Por lo tanto, para que las exportaciones se realicen correctamente, es posible que debas reducir el límite de maxmemory-gb al 50% de la capacidad de tu instancia durante las exportaciones.

Operaciones de escalamiento y actualización de versiones

El escalamiento o la actualización durante períodos de carga de escritura alta pueden aumentar la presión de memoria en la instancia debido a la sobrecarga de memoria que causa la replicación. Además, una carga de lectura alta puede aumentar el tamaño del búfer de salida de Redis, lo que aumenta la presión de memoria. Si una operación de escalamiento o actualización falla debido a la presión en la memoria, debes hacer lo siguiente:

  • Reduce maxmemory-gb al 50% de la capacidad de la instancia antes de una operación de escalamiento o actualización. Si es posible, también debes reducir la memoria máxima durante los períodos del tráfico de instancia baja, ya que esto reduce el impacto negativo que produce reducir la cantidad máxima de memoria en la tasa de aciertos de caché.
  • Escala o actualiza durante períodos de escrituras bajas

Mantenimiento

El mantenimiento también agrega presión de memoria a tu instancia. Debes tomar medidas para que la métrica de proporción de uso de memoria del sistema sea del 50% o menos en el momento del mantenimiento programado. Puedes hacerlo mediante la programación para un momento en el que el tráfico de la instancia sea bajo o mediante el escalamiento temporal del tamaño de la instancia durante el período de mantenimiento, de modo que la métrica de proporción de uso de memoria del sistema sea de un 50% o menos.

Supervisa el uso de memoria de tu instancia

Supervisa las métricas y configura las alertas que se describen en esta sección. Estas métricas y alertas te brindan estadísticas sobre el uso de memoria de tu instancia. Para aprender a ver las métricas y configurar alertas, consulta Supervisa instancias de Redis.

Métrica Dirección completa de la métrica
Maxmemory redis.googleapis.com/stats/memory/maxmemory
Uso de memoria redis.googleapis.com/stats/memory/usage
Proporción del 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
Proporción de uso de memoria del sistema redis.googleapis.com/stats/memory/system_memory_usage_ratio
Tasa de aciertos de caché redis.googleapis.com/stats/memory/cache_hit_ratio
Claves con fecha de vencimiento redis.googleapis.com/keyspace/keys_with_expiration
Claves vencidas redis.googleapis.com/stats/expired_keys
Claves expulsadas redis.googleapis.com/stats/evicted_keys

Proporción del uso de memoria

La métrica de proporción de uso de memoria indica qué tan cerca está el tamaño del conjunto de trabajo de alcanzar el límite de maxmemory-gb. A menos que la política de expulsión esté configurada para no expulsar, los datos de la instancia que llegan a maxmemory no siempre indican 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 expulsar las claves a fin de liberar espacio.

Proporción de uso de memoria del sistema

La proporción de uso de memoria del sistema es una métrica fundamental que se debe supervisar. A fin de garantizar que la instancia tenga suficiente memoria para admitir tu carga de trabajo y otras operaciones que consumen mucha memoria, es importante que siempre tengas suficiente memoria del sistema disponible.

Configura una alerta para que te notifique si la métrica de proporción de uso de memoria del sistema alcanza el 80%. Si alcanza el 80%, debes comenzar a supervisar la métrica de proporción de uso de memoria del sistema con más detalle. Si la proporción de uso de memoria del sistema sigue aumentando de manera significativa, debes activar activedefrag, reducir maxmemory y considerar escalar tu instancia.

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

-OOM command not allowed under OOM prevention.

Consulta Administra la proporción de uso de memoria del sistema para obtener más detalles.

Duración de la sobrecarga de memoria del sistema

Si el uso de memoria es demasiado alto, Memorystore bloquea las operaciones de escritura en tu instancia para mantenerla en buen estado. La duración de la sobrecarga de memoria del sistema realiza un seguimiento del tiempo que tu instancia está en el estado de escritura bloqueada.

Debes configurar una alerta para esta métrica a fin de que sepas cuándo se bloquean las operaciones de escritura en tu instancia. Además, puedes volver a consultar esta métrica para solucionar problemas de recepción del error -OOM command not allowed under OOM prevention..

Tasa de aciertos de caché

Debes supervisar con frecuencia tu proporción de aciertos de caché para saber qué porcentaje de búsquedas de claves muestra las claves en tu instancia de Redis de forma correcta. En términos generales, una proporción de aciertos de caché alta es mejor que una proporción de aciertos de caché más baja. Debes tener en cuenta tu proporción de aciertos de caché antes de realizar cualquier cambio importante en la configuración, como ajustar el límite de maxmemory-gb, cambiar la política de expulsión o escalar la instancia. Luego, después de modificar tu instancia, vuelve a verificar la proporción de aciertos de caché para ver cómo el cambio afectó a esta métrica.

Claves con fecha de vencimiento y claves caducadas

La clave de vencimiento de la métrica de Stackdriver supervisa la cantidad de claves que están configuradas para el vencimiento. Si no hay claves con vencimiento, puede ser una indicación de que no estás configurando TTL en las claves. En esos casos, cuando los datos de tu instancia alcanzan el límite de maxmemory-gb, no hay claves para expulsar, lo que puede generar una condición de falta de memoria si usas una política de expulsión volatile-*.

Otra métrica que puedes supervisar son las claves vencidas. Si la métrica muestra muchas claves vencidas, pero aún ves la presión de memoria en tu instancia, debes reducir maxmemory-gb.

Resuelve una condición de memoria insuficiente

A continuación, se mencionan algunas prácticas recomendadas que debes seguir si tu instancia experimenta presión de memoria o se queda sin errores de memoria.

  1. Si usas una política de expulsión de volatile-*, asegúrate de configurar los TTL en las claves que deseas que venzan. Consulta la Política de expulsión para obtener más detalles.

  2. Para instancias que ejecutan Redis 4.0 y versiones posteriores, haz lo siguiente:

    1. Activa activedefrag para tu instancia. Consulta Desfragmentación activa para obtener más detalles.
  3. Obtén más información sobre cómo usar métricas para resolver problemas de las condiciones de memoria y obtener información valiosa sobre el uso de la memoria de tu instancia: Supervisa el uso de memoria de tu instancia, Administra la proporción de uso de memoria del sistema.

  4. Obtén información para ajustar maxmemory cuando se ejecutan operaciones intensivas de memoria.

  5. Si la proporción de uso de memoria del sistema supera el 80%, reduce el límite de maxmemory-gb de tu instancia. Consulta Administra la proporción de uso de memoria del sistema para obtener más detalles.

  6. Considera aumentar la capacidad de escalamiento vertical de tu instancia.

  7. Si aún tienes condiciones de OOM, comunícate con el equipo de Asistencia de Google Cloud Platform.

Redimensiona la instancia de Memorystore

En esta sección, se abordan tres enfoques distintos que te ayudan a ajustar el tamaño de tu instancia según la carga de trabajo:

Determina 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 Funciones de nivel de Redis. Una vez que hayas seleccionado el nivel correcto para tu aplicación, sigue estos pasos a fin de determinar qué tamaño de instancia necesitas:

  1. Determina el tamaño de tus datos.

    • Estima la cantidad de claves y el tamaño promedio de las claves que escribirá la aplicación 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 expulsión.

    • Si usas la política noeviction de maxmemory, el tamaño de la 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 de maxmemory, tu instancia puede ingresar una condición de falta de memoria.
    • Otras políticas de expulsión no influyen en el tamaño de la instancia que debes aprovisionar.
  3. Aprovisiona memoria adicional para instancias de nivel estándar

    • A diferencia de las instancias de nivel Básico, las instancias de nivel estándar reservan el 10% de la capacidad de la instancia como un búfer de replicación. Si eliges una instancia de nivel estándar, asegúrate de tomar la estimación de datos del paso uno y aprovisionar un 10% adicional para el búfer de replicación.
  4. Calcula la tasa de escritura promedio y máxima

    • Si es posible, estima la tasa de escritura y el tamaño de las claves que usará tu aplicación. En comparación con la tasa de eliminación de claves, la tasa de escritura determina la velocidad con la que crecerá la instancia con el tiempo.
  5. Escala para alcanzar la tasa de aciertos de caché deseada.

    • Supervisa la tasa de aciertos de caché y, si no obtienes tantos aciertos de caché exitosos como desees, esto significa que deberás aumentar el tamaño de la instancia o asegurarte de que tu aplicación esté escribiendo las claves en la instancia de Memorystore que se están solicitando y que no se completaron.

Determina si tu instancia bloquea las escrituras debido a una condición de memoria insuficiente

Si recibes el siguiente error, haz lo siguiente:

-OOM command not allowed under OOM prevention.

Comprueba lo siguiente:

  1. La métrica de proporción de uso de memoria del sistema superó el 80% antes de que tu instancia comenzará a experimentar problemas.
  2. La proporción de uso de memoria del sistema aumentó mucho antes de que se produzcan problemas con tu instancia.
  3. La métrica de duración de la sobrecarga de memoria del sistema mostró valores superiores a cero durante el mismo período en el que se experimentaron escrituras bloqueadas.

Si es así, esto indica que la instancia bloquea las escrituras debido a una condición de memoria insuficiente.

Administra la proporción de uso de memoria del sistema

Configura una alerta para que te notifique si la métrica de proporción 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 adecuadas para que la instancia no se quede sin memoria. Según el volumen de escritura y el patrón de acceso a las claves, el uso de memoria del sistema puede aumentar rápidamente al 100%. Memorystore ofrece las siguientes maneras de administrar la proporción de uso de memoria del sistema:

  • Activa activedefrag para las instancias que ejecutan la versión 4.0 de Redis y versiones posteriores.
  • Reduce el límite de maxmemory-gb de tu instancia
  • Escala verticalmente la instancia.
  • Elige la política de expulsión adecuada.
  • Establece TTL en claves volátiles.
  • Borra las claves de tu instancia de forma manual.

Activa activedefrag

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

Reduce el límite de maxmemory de tu instancia

Si la proporción de uso de memoria del sistema excede el 80%, debes disminuir maxmemory-gb, pero primero tienes que ver cómo cambió la proporción de uso de memoria del sistema con el tiempo para determinar qué límite nuevo de maxmemory-gb establecer.

Situación 1: La proporción de uso de memoria del sistema ha escalado de forma gradual y detenida. La fragmentación es un posible problema, y deberías reducir maxmemory-gb en pequeños incrementos hasta que la proporción de uso de memoria del sistema se estabilice por debajo del 80%.

Situación 2: la proporción de uso de memoria del sistema aumentó con rapidez y ves una carga de escritura significativa en tu instancia. Es probable que una operación que consume mucha memoria haya provocado el aumento repentino. En esta situación, debes reducir el límite de maxmemory-gb en incrementos más grandes para asegurarte de que la instancia evite ingresar una condición de falta de memoria o se recupere de una condición de memoria insuficiente. Debes tener en cuenta que reducir maxmemory puede reducir la tasa de aciertos de caché de las instancias. Una tasa de aciertos de caché mucho menor indica que debes escalar verticalmente 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 Configura instancias de Redis.

Escala la instancia

Sigue las instrucciones en Escala instancias de Redis para aumentar la capacidad de tu instancia.

Ejemplo de escalamiento de memoria máxima:

Si tienes una instancia de 10 GB con maxmemory-gb establecido en 8 GB, tienes 8 GB para almacenar claves y 2 GB de sobrecarga de memoria. Si escalas la instancia a 20 GB, maxmemory-gb se escala a 16 GB. Por lo tanto, tu instancia ahora tiene 16 GB de memoria para almacenar claves y 4 GB de sobrecarga. Consulta Escala instancias de Redis con el fin de obtener instrucciones para aumentar o disminuir el tamaño de la instancia.

Elige la política de expulsión adecuada

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

Borra las claves de tu instancia de forma manual

Puedes mejorar las condiciones de falta de memoria si borras claves de tu instancia de forma manual. Esta es una solución temporal que te ayuda a mejorar el estado de la instancia.