Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Una operación de cliente de Azure Cache for Redis que no recibe una respuesta oportuna puede provocar una latencia alta o una excepción de tiempo de espera. En este artículo se explica cómo solucionar problemas comunes que pueden dar lugar a tiempos de espera y latencia elevados.
Una operación podría experimentar problemas o agotar el tiempo de espera en varias fases. El origen del problema ayuda a determinar la causa y la mitigación. Este artículo se divide en problemas del lado cliente y del lado servidor.
Problemas del lado cliente
- Conexiones de cliente elevadas
- Uso elevado de CPU en hosts de cliente
- Grandes valores de clave
- Presión de memoria en el cliente de Redis
- Limitaciones del ancho de banda de red en los hosts de cliente
- RedisSessionStateProvider retryTimeout
- Configuración de TCP para aplicaciones cliente basadas en Linux
- Configuración del grupo de subprocesos y ráfagas de tráfico
Problemas del lado servidor
- Uso de memoria alto
- Carga de servidor elevada
- Comandos de larga duración
- Limitaciones de ancho de banda de red
- Mantenimiento del servidor.
Solución de problemas de lado cliente
Los siguientes problemas del lado cliente pueden afectar a la latencia y al rendimiento y a los tiempos de espera.
Número elevado de conexiones de cliente
Se pueden producir errores en las solicitudes de cliente para las conexiones de cliente más allá del máximo de la memoria caché. Las conexiones de cliente elevadas también pueden provocar una carga elevada del servidor al procesar intentos repetidos de reconexión.
Un número elevado de conexiones de cliente puede indicar una pérdida de conexión en el código de cliente. Es posible que las conexiones no se estén reutilizando o cerrando correctamente. Revise el uso de conexiones en el código de cliente.
Si las conexiones altas son todas las conexiones cliente legítimas y necesarias, es posible que tenga que actualizar la memoria caché a un tamaño con un límite de conexión superior. Compruebe si la métrica Max aggregate for Connected Clients (Agregado máximo para clientes conectados ) está cerca o superior al número máximo de conexiones permitidas para el tamaño de la memoria caché. Para más información sobre el dimensionamiento por conexión de cliente, vea Rendimiento de Azure Cache para Redis.
Uso elevado de CPU en hosts de cliente
El uso elevado de la CPU del cliente indica que el sistema no puede seguir el ritmo del trabajo asignado. Incluso si la memoria caché envía la respuesta rápidamente, es posible que el cliente no pueda procesar la respuesta lo suficientemente rápido. Es mejor mantener la CPU del cliente en menos de 80%.
Para mitigar la utilización de la CPU elevada de un cliente:
- Investigue la causa de los picos de CPU.
- Actualice el cliente a un tamaño mayor de máquina virtual (VM) con más capacidad de CPU.
Supervise el uso de cpu en todo el sistema del cliente mediante métricas disponibles en Azure Portal o a través de contadores de rendimiento en la máquina virtual. Compruebe la métrica Errores (Tipo: ClientesNoResponsivos) para determinar si los hosts cliente pueden procesar las respuestas del servidor de Redis a tiempo.
Tenga cuidado de no supervisar la CPU del proceso, ya que un único proceso puede tener un uso bajo de CPU, pero la CPU de todo el sistema puede ser alta. Busque picos de uso de CPU que correspondan a tiempos de espera. La CPU alta también puede provocar valores altos in: XXX
en los mensajes de error de timeoutException
. Consulte la sección Configuración del grupo de subprocesos y ráfagas de tráfico para obtener un ejemplo.
StackExchange.Redis 1.1.603 y versiones posteriores incluyen la métrica local-cpu
en mensajes de error de timeoutException
. Asegúrese de usar la versión más reciente del paquete NuGet StackExchange.Redis, ya que los errores se corrigen periódicamente para que el código sea más resistente a los tiempos de espera. Para obtener más información, consulte Investigación de timeout
excepciones en StackExchange.Redis.
Valores de clave grandes
Puede usar el comando redis-cli --bigkeys
para buscar claves grandes en la memoria caché. Para obtener más información sobre redis-cli, la interfaz de la línea de comandos de Redis, consulte CLI de Redis.
Para mitigar el problema:
Aumente el tamaño de la máquina virtual para obtener mayores funcionalidades de ancho de banda. Más ancho de banda en la máquina virtual cliente o servidor podría reducir los tiempos de transferencia de datos para respuestas más grandes. Compare el uso de red actual en ambas máquinas virtuales con los límites de los tamaños de máquina virtual actuales. Más ancho de banda solo en el servidor o en el cliente puede no ser suficiente.
Aumente el número de objetos de conexión que usa la aplicación. Use un enfoque round robin para realizar solicitudes a través de objetos de conexión distintos. Para obtener información sobre el uso de varias claves y valores más pequeños, vea Consideración de más claves y valores más pequeños.
Presión de memoria en el cliente de Redis
La presión de memoria en el cliente puede provocar problemas de rendimiento que retrasan el procesamiento de respuestas de caché. Cuando se produce presión de memoria, el sistema podría paginar los datos en el disco. Estos errores de página hacen que el sistema se ralentice considerablemente.
Para detectar presión de memoria en el cliente:
- Supervise el uso de memoria en la máquina virtual para asegurarse de que no supera la memoria disponible.
- Supervise el contador de rendimiento
Page Faults/Sec
del cliente. Durante el funcionamiento normal, la mayoría de los sistemas tienen algunos errores de página. Los picos de errores de página que corresponden con los tiempos de expiración de solicitudes pueden indicar la presión de memoria.
Para mitigar la presión de memoria alta en el cliente:
- Investigue los patrones de uso de memoria para reducir el consumo de memoria en el cliente.
- Actualice la máquina virtual del cliente a un tamaño mayor con más memoria.
Limitación del ancho de banda de red en los hosts de cliente
En función de su arquitectura, las máquinas cliente pueden tener limitaciones en la disponibilidad del ancho de banda de red. Si el cliente supera el ancho de banda disponible sobrecargando la capacidad de red, los datos no se procesan en el lado cliente tan rápido como el servidor lo envía. Esta situación puede provocar tiempos de espera.
Para mitigarlo, reduzca el consumo de ancho de banda de red o aumente el tamaño de la máquina virtual del cliente a una con más capacidad de red. Para obtener más información, consulte Tamaño de solicitud o respuesta grande.
RedisSessionStateProvider retryTimeout
Si usa RedisSessionStateProvider
, asegúrese de establecer correctamente retryTimeout
. El valor retryTimeoutInMilliseconds
debe ser mayor que el valor operationTimeoutInMilliseconds
. De lo contrario, no se produce ningún reintento.
En el siguiente ejemplo, retryTimeoutInMilliseconds
se establece en 3000
.
<add
name="AFRedisCacheSessionStateProvider"
type="Microsoft.Web.Redis.RedisSessionStateProvider"
host="enbwcache.redis.cache.windows.net"
port="6380"
accessKey="..."
ssl="true"
databaseId="0"
applicationName="AFRedisCacheSessionState"
connectionTimeoutInMilliseconds = "5000"
operationTimeoutInMilliseconds = "1000"
retryTimeoutInMilliseconds="3000"
>
Para obtener más información, consulte:
- Proveedor de estado de sesión de ASP.NET para Azure Cache for Redis
- Proveedor de caché de salida de ASP.NET para Azure Cache for Redis
Configuración de TCP para aplicaciones cliente hospedadas en Linux
Las aplicaciones cliente hospedadas en Linux podrían experimentar problemas de conectividad debido a la configuración optimista de TCP en Linux. Para obtener más información, consulte Configuración de TCP para aplicaciones cliente hospedadas en Linux.
Configuración del grupo de subprocesos y ráfagas de tráfico
Las ráfagas de tráfico se combinan con una mala configuración de ThreadPool
pueden provocar retrasos en el procesamiento de datos ya enviados por el servidor Redis, pero que aún no se han consumido en el lado cliente. Compruebe la métrica Errores (Tipo: UnresponsiveClients) para validar si los hosts de cliente pueden mantenerse al día con picos repentinos en el tráfico. Puede configurar las opciones de ThreadPool para asegurarse de que su grupo de subprocesos se escale verticalmente a gran velocidad en escenarios de ráfaga.
Puede usar timeoutException
mensajes de StackExchange.Redis para investigar más a fondo.
System.timeoutException: timeout performing EVAL, inst: 8, mgr: Inactive, queue: 0, qu: 0, qs: 0, qc: 0, wr: 0, wq: 0, in: 64221, ar: 0,
IOCP: (Busy=6,Free=999,Min=2,Max=1000), WORKER: (Busy=7,Free=8184,Min=2,Max=8191)
La excepción anterior muestra varios problemas.
- En la sección
IOCP
y la secciónWORKER
, el valor deBusy
es mayor que el deMin
, lo que significa que losThreadPool
requerimientos necesitan ajuste. - El valor
in: 64221
indica que se recibieron 64 221 bytes en la capa de socket del kernel del cliente, pero que la aplicación no la leyó. Esta diferencia suele significar que la aplicación, por ejemplo StackExchange.Redis, no lee los datos de la red tan rápido como el servidor lo envía.
StackExchange.Redis 1.1.603 y versiones posteriores incluyen la métrica local-cpu
en mensajes de error de timeoutException
. Asegúrese de usar la versión más reciente del paquete NuGet StackExchange.Redis, ya que los errores se corrigen periódicamente para que el código sea más resistente a los tiempos de espera. Para obtener más información, consulte Investigación de excepciones de tiempo de espera en StackExchange.Redis.
Solución de problemas del lado servidor
Los siguientes problemas del lado servidor pueden afectar al rendimiento y dar lugar a tiempos de espera.
Uso de memoria alto
La presión de memoria en el servidor puede provocar varios problemas de rendimiento que retrasan el procesamiento de solicitudes. Cuando se produce una presión de memoria, el sistema traslada los datos al disco, lo que hace que el sistema se ralentice significativamente.
Algunas causas posibles de presión de memoria son que la memoria caché está llena de datos a cerca de su capacidad máxima, o que el servidor de Redis tiene una fragmentación de memoria alta.
Es probable que la fragmentación ocurra si un patrón de carga almacena datos con una gran variación de tamaño, por ejemplo, cuando los datos se distribuyen en tamaños de 1 KB y 1 MB. Cuando se elimina una clave de 1 KB de la memoria existente, una clave de 1 MB no puede caber en el espacio, lo que provoca la fragmentación. De forma similar, si se elimina una clave de 1 MB, una clave agregada de 1,5 MB no puede caber en la memoria reclamada existente. Esta memoria libre sin usar da como resultado la fragmentación.
Si una caché está fragmentada y funciona bajo mucha presión de memoria, el sistema realiza un proceso de recuperación para intentar recuperar la memoria RSS (Resident Set Size). Redis expone dos estadísticas, used_memory
y used_memory_rss
, a través del comando INFO, que pueden ayudarle a identificar este problema. También puede ver estas métricas en Azure Portal.
Si el valor used_memory_rss
es superior al 150 % de la métrica used_memory
, hay fragmentación en la memoria. La fragmentación puede causar problemas cuando:
- El uso de memoria está cerca del límite máximo de memoria de la memoria caché.
- La
used_memory_rss
métrica es mayor que el límite máximo de memoria, lo que podría provocar fallos de página en la memoria.
Puede realizar varias acciones para ayudar a mantener el uso de memoria en buen estado.
- Configurar una directiva de memoria y establecer tiempos de expiración de las claves. Es posible que esta política no sea suficiente si tiene fragmentación.
- Configure los valores maxmemory-reserved y maxfragmentationmemory-reserved que son lo suficientemente grandes como para compensar la fragmentación de memoria.
- Crear alertas en métricas como la memoria usada para recibir una notificación anticipada sobre los impactos potenciales.
- Escalar a un tamaño mayor de caché con más capacidad de memoria. Para obtener más información, consulte Preguntas frecuentes sobre Azure Cache for Redis.
Para obtener más recomendaciones sobre la administración de memoria, consulte Procedimientos recomendados para la administración de memoria.
Carga elevada del servidor
La carga alta del servidor significa que el servidor de Redis está ocupado y no puede mantenerse al día con las solicitudes, lo que conduce a tiempos de espera o respuestas lentas. Para mitigar la carga alta del servidor, investigue primero la causa, como comandos de larga duración debido a una presión de memoria alta.
Puede supervisar métricas como la carga del servidor desde Azure Portal. Para comprobar la métrica Carga del servidor, seleccione Información en Supervisión en el menú de navegación izquierdo de la página de caché y vea el gráfico Carga del servidor . O bien, seleccione Métricas en Supervisión en el menú de navegación izquierdo y, a continuación, seleccione Carga del servidor en Métricas.
Observe los picos de uso de la carga del servidor que se corresponden con los tiempos de espera. Cree alertas en las métricas de carga del servidor para recibir una notificación anticipada sobre posibles impactos.
Picos en la carga del servidor
En las cachés C0 y C1, es posible que vea picos cortos en la carga del servidor no causados por un aumento de las solicitudes mientras el examen interno de Defender se ejecuta en las máquinas virtuales. En estos niveles, verá una mayor latencia para las solicitudes mientras se producen exámenes internos de Defender.
La caché en los niveles C0 y C1 solo tienen un único núcleo a varias tareas, lo que divide el trabajo de atender solicitudes internas de análisis de Defender y Redis. Si la latencia adicional de los exámenes internos de Defender afecta negativamente a la carga de trabajo de producción en una caché de C1, puede escalar a una oferta de nivel superior con varios núcleos de CPU, como C2. Para obtener más información, consulte Elección del nivel correcto.
Para obtener más información sobre los cambios rápidos en el número de conexiones de cliente, consulte Evitar picos de conexión de cliente.
Ampliación
Puede escalar horizontalmente hacia más fragmentos para distribuir la carga entre varios procesos de Redis o escalar verticalmente a un tamaño de caché mayor con más núcleos de CPU. Las operaciones de escalado consumen mucha CPU y memoria, ya que pueden implicar mover datos alrededor de los nodos y cambiar la topología del clúster. Para más información, consulte Preguntas más frecuentes sobre planeamiento y escalado de Azure Cache for Redis.
Comandos de larga duración
Algunos comandos de Redis son más caros de ejecutar que otros. La documentación de comandos de Redis muestra la complejidad del tiempo de cada comando. El procesamiento de comandos de Redis es monohilo. Cualquier comando que tarde mucho tiempo en ejecutarse puede bloquear a otros usuarios que lo siguen.
Revise los comandos que emite en el servidor de Redis para comprender sus impactos en el rendimiento. Por ejemplo, el comando KEYS se usa a menudo sin saber que es una operación de Notación Big O (O(N)). Para reducir los picos de CPU, puede evitar KEYS
mediante SCAN.
Puede ejecutar los siguientes comandos de Redis en una consola para investigar comandos de larga duración y costosos.
-
El
CLIENT LIST
comando devuelve información y estadísticas sobre el servidor de conexiones de cliente en un formato legible principalmente humano. -
El
INFO
comando devuelve información y estadísticas sobre el servidor en un formato sencillo para que los equipos analicen y sea fácil de leer. LaCPU
sección puede ser útil para investigar el uso de cpu. Unserver_load
de100
(valor máximo) indica que el servidor de Redis estaba ocupado todo el tiempo y nunca estaba inactivo al procesar las solicitudes.En el ejemplo siguiente se muestra una salida del
INFO
comando :# CPU used_cpu_sys:530.70 used_cpu_user:445.09 used_cpu_avg_ms_per_sec:0 server_load:0.01 event_wait:1 event_no_wait:1 event_wait_count:10 event_no_wait_count:1
-
MONITOR
es un comando de depuración que transmite todos los comandos procesados por el servidor de Redis.MONITOR
puede ayudarle a comprender lo que sucede con la base de datos. Este comando es exigente y puede afectar negativamente y degradar el rendimiento. -
El registro lento de Redis es un sistema para registrar consultas que superaron un tiempo de ejecución especificado. El tiempo de ejecución no incluye operaciones de E/S como hablar con el cliente o enviar la respuesta, pero solo el tiempo necesario para ejecutar realmente el comando.
El comando
SLOWLOG
lee y restablece el registro de consultas lentas de Redis y también se puede usar para investigar comandos de larga duración en el lado cliente. Puede supervisar y registrar comandos costosos que se ejecutan en el servidor de Redis mediante SLOWLOG GET.
Limitaciones de ancho de banda de red
Tamaños de caché diferentes tienen capacidades distintas de ancho de banda de red. Si el servidor supera el ancho de banda disponible, los datos no se envían al cliente tan rápidamente. Las solicitudes del cliente podría agotar el tiempo de espera debido a que el servidor no puede insertar datos al cliente lo suficientemente rápido.
Puede supervisar métricas como Lectura de caché y Escritura en caché en Azure Portal para ver cuánto ancho de banda del lado servidor se usa. Cree alertas sobre estas métricas para recibir una notificación anticipada sobre posibles impactos.
Para mitigar las situaciones en las que la utilización de ancho de banda de red está cerca de la capacidad máxima, haga lo siguiente:
- Cambiar el funcionamiento de las llamadas del cliente para reducir la carga de la red.
- Escalar a un tamaño mayor de caché con más capacidad de ancho de banda de red. Para obtener más información, consulte Preguntas frecuentes sobre Azure Cache for Redis.
Mantenimiento del servidor.
El mantenimiento planeado o no planeado puede provocar interrupciones con las conexiones de cliente. El número y el tipo de excepciones dependen de dónde se encuentre la solicitud en la ruta de acceso al código cuando la memoria caché cierra sus conexiones.
Si la caché de Azure Redis se somete a una conmutación por error, todas las conexiones de cliente del nodo que se ha caído se transfieren al nodo que sigue funcionando. La carga del servidor podría aumentar debido al aumento de las conexiones. Puede intentar reiniciar las aplicaciones cliente para que todas las conexiones de cliente se vuelvan a crear y redistribuir entre los dos nodos.
Una operación que envía una solicitud, pero no recibe una respuesta cuando se produce la conmutación por error podría obtener una excepción de timeout
. Las nuevas solicitudes en el objeto de conexión cerrado reciben excepciones de conexión hasta que la reconexión se produce correctamente.
Para comprobar si hubo una conmutación por error en su caché de Azure Redis durante el periodo en que ocurrieron sus excepciones timeout
, compruebe la métrica Errores. En la página del portal de Azure de la memoria caché, seleccione Métricas en Supervisión en el menú de navegación izquierdo. A continuación, cree un nuevo gráfico que mida la métrica Errores , dividida por ErrorType. Una vez creado este gráfico, verá un recuento de conmutación por error. Para obtener más información sobre las conmutaciones por error, vea Conmutación por error y aplicación de revisiones para Azure Cache for Redis.
Para obtener más información sobre la mitigación de problemas debido al mantenimiento del servidor, consulte los artículos siguientes:
- Actualizar canal y programar actualizaciones
- Resistencia de la conexión
- Notificaciones de AzureRedisEvents
Contenido relacionado
- Investigación de
timeout
excepciones en StackExchange.Redis. - Solución de problemas de conectividad
- Solución de problemas de pérdida de datos en Azure Cache for Redis
- ¿Cómo puedo ejecutar comandos de Redis?
- ¿Cómo puedo realizar una evaluación comparativa y probar el rendimiento de mi caché?
- Monitorear Azure Cache para Redis