¿Por qué veo un uso de memoria elevado o creciente en mi clúster de ElastiCache?

Última actualización: 15/09/2022

Veo un uso de memoria elevado o creciente en mi clúster de Amazon ElastiCache. ¿Cómo se determina el uso de la memoria en los nodos del clúster de ElastiCache?

Resolución

Para determinar el uso general de la memoria en el clúster y sus nodos, revise estas métricas de Redis. Estas métricas se publican en Amazon CloudWatch para cada nodo de un clúster:

  • BytesUsedForCache: el número total de bytes asignados por Redis para el conjunto de datos, los búferes, etc. Esta métrica se deriva de la salida del comando INFO de un nodo de Redis. Utilice esta métrica para determinar el uso de memoria del clúster.
  • FreeableMemory: esta métrica de nivel de host muestra la cantidad de memoria libre disponible en el host. Cuando el uso de memoria aumenta debido a los datos de la caché o por la sobrecarga, puede ver la disminución en FreeableMemory. Una disminución en FreeableMemory sugiere poca memoria libre en el host. Puede producirse un intercambio si FreeableMemory es demasiado baja.
  • DataBaseMemoryUsagePercentage: esta métrica se deriva del resultado del comando de Redis INFO. Este es el porcentaje de memoria que utiliza el nodo del clúster. Redis inicia la política de expulsión de memoria máxima de Redis después de que esta métrica alcance el 100 % del umbral.

Tenga en cuenta que, de forma predeterminada, ElastiCache para Redis reserva el 25 % de lamemoria máxima para el uso que no sea de datos, como la conmutación por error y la copia de seguridad. Si no especifica suficiente memoria reservada para el uso que no sea de datos, aumentan las posibilidades de intercambio. Para obtener más información, consulte Administración de memoria reservada.

Causas del uso repentino de memoria elevada

  • Claves agregadas recientemente: el agregado de nuevos pares clave-valor provoca un aumento en el uso de la memoria. Agregar elementos a las claves existentes también aumenta el uso de la memoria. Compruebe la métrica SetTypeCmds para determinar si hay cambios de datos recientes en el nodo. Esta métrica registra el número total de comandos de tipo escritura y se deriva de la estadística commandstats de Redis.
  • Aumento en el uso del búfer: los clientes están conectados a Redis a través de la red. Si el cliente no lee de la caché lo suficientemente rápido, Redis mantiene los datos de respuesta en un espacio de memoria denominado búfer de salida del cliente. El cliente puede continuar la lectura desde el espacio del búfer. Esto también se aplica a los clientes Pub y Sub si los clientes suscritos no leen lo suficientemente rápido.
    Si hay un cuello de botella en el ancho de banda de la red o si el clúster se encuentra bajo una carga intensa de forma continua, es posible que el uso del búfer siga acumulándose. Esta acumulación provoca el agotamiento de la memoria y la degradación del rendimiento. De forma predeterminada, ElastiCache para Redis no restringe el crecimiento del búfer de salida y cada uno de los clientes tiene su propio búfer. Utilice el comando client-list para comprobar el uso del búfer.
  • Gran cantidad de conexiones nuevas: una gran cantidad de conexiones nuevas puede aumentar el uso de la memoria. Todas las conexiones nuevas crean un descriptor de archivo que consume memoria. El consumo total de memoria con una gran cantidad de conexiones nuevas puede ser elevado, lo que puede provocar la expulsión de los datos o errores de OOM. Comprueba la métrica NewConnections para ver el número total de conexiones nuevas aceptadas.
  • Uso elevado de intercambio: es normal ver algún uso de intercambio en un nodo de caché cuando hay memoria libre. Sin embargo, un uso excesivo de intercambios puede provocar problemas de rendimiento. Por lo general, el intercambio alto comienza a producirse en un nodo que se ejecuta bajo presión de memoria, lo que da como resultado una memoria con poca capacidad de liberación. Utilice la métrica SwapUsage para monitorear el intercambio en el host.
  • Fragmentación de memoria alta: una fragmentación de memoria alta indica ineficiencias en la administración de la memoria dentro del sistema operativo. Es posible que Redis no libere memoria cuando se quitan las claves. Utilice la métrica MemoryFragmentationRatio para monitorear la tasa de fragmentación. Si tiene problemas de fragmentación, active el parámetro activedefrag para la desfragmentación activa de la memoria.
  • Claves grandes: una clave con un tamaño de datos grande o un gran número de elementos se denomina clave grande. Es posible que vea un uso elevado de memoria como resultado de una clave grande, incluso si la métrica CurrItems permanece baja. Para detectar claves grandes en el conjunto de datos, utilice el comando redis-cli --bigkeys.

Prácticas recomendadas para controlar el uso elevado de la memoria

  • Utilizar TTL en las claves: puede especificar el TTL en las claves para el vencimiento. Al hacerlo, se eliminan las claves después del vencimiento sin esperar la presión de la memoria. Esto evita que Redis se llene de claves innecesarias. Un número pequeño de expulsiones no es motivo de preocupación, pero un número elevado de expulsiones significa que el nodo se ejecuta con presión de memoria.
  • Utilizar la política de expulsión: cuando la memoria caché comienza a llenarse, Redis expulsa las claves para liberar espacio en función de la política maxmemory-policy. La política predeterminada de maxmemory-policy se establece en volatile_lru. La práctica recomendada es elegir una política de expulsión que sea específica para las necesidades de la carga de trabajo.
  • Asignar memoria reservada: para evitar problemas durante la conmutación por error o la copia de seguridad, la práctica recomendada es establecer reserved_memory_percentage en al menos un 25 % para el uso que no sea de datos. Si no hay suficiente memoria reservada para realizar la conmutación por error o la copia de seguridad, se producen problemas de intercambio y rendimiento.
  • Utilizar agrupación de conexiones: la agrupación de conexiones ayuda a controlar un gran número de conexiones nuevas que intenta el cliente de Redis. Revise las directrices de prácticas recomendadas de AWS para gestionar un gran número de conexiones nuevas.
  • Ajustar límites de tamaño del búfer de salida: puede ajustar el límite del búfer de salida para controlar el uso del espacio del búfer. Los grupos de parámetros de ElastiCache para Redis proporcionan varios parámetros que comienzan con client-output-buffer-limit-* a fin de evitar el crecimiento ilimitado del uso del búfer de salida del cliente. Tenga en cuenta que no hay un límite sugerido para estos parámetros, ya que cada carga de trabajo es única. Es una práctica recomendada comparar la carga de trabajo para poder elegir un valor adecuado.
  • Considere utilizar la asignación de hash: en Redis, la huella de memoria total de la base de datos de Redis es lineal. Se necesita más memoria con menos claves individuales que con una sola clave asignada con hash y menos campos. La asignación de hash ayuda con las estructuras de datos que tienen una gran cantidad de claves. Además de la asignación de hash, puede aprovechar la codificación ziplist, que reduce la huella de memoria en comparación con las tablas hash. Tenga en cuenta que el uso de asignación de hash puede provocar un aumento en el uso del motor de Redis, ya que se trata de un comando complejo que necesita más CPU que las operaciones establecidas.
  • Escalar el clúster: a veces, puede experimentar presión en la memoria después de tomar las precauciones necesarias. Si esto ocurre y si el uso se debe a la carga de trabajo esperada, considere realizar un escalado adecuado para reducir el cuello de botella de la memoria.
  • Configure una alarma para el uso de la memoria. Puede utilizar las alarmas de CloudWatch para iniciar una alarma cuando el uso de la memoria supera un umbral preestablecido. Utilice la métrica BytesUsedForCache o DatabaseMemoryUsagePercentage para crear una alarma desde la consola de CloudWatch con fines de monitoreo y escalado.