Solución de problemas del lado cliente de Redis Cache

En esta sección se describen problemas que se producen debido a una condición en la aplicación cliente.

Presión de memoria en el cliente de Redis

La presión de memoria en la máquina del cliente genera todo tipo de problemas de rendimiento que pueden retrasar el procesamiento de respuestas de la caché. Cuando se alcanza la presión de memoria, el sistema puede paginar 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 la utilización de memoria en la máquina para asegurarse de que no exceda 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.

La presión de memoria alta en el cliente se puede mitigar varias maneras:

  • Examine con más detalle los patrones de utilización 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.

Ráfaga 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.

Supervise cómo las estadísticas de ThreadPool cambian a lo largo del tiempo con un ejemplo ThreadPoolLogger. Puede usar mensajes de TimeoutException de StackExchange.Redis, tal como aparece debajo, 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)

En la excepción anterior, hay varias incidencias que son interesantes:

  • Observe que en la sección IOCP y la sección WORKER tiene un valor de Busy que es mayor que el valor de Min. Esta diferencia significa que es necesario ajustar la configuración de ThreadPool.
  • También puede ver in: 64221. Este valor indica que se han recibido 64 211 bytes en la capa de sockets del kernel del cliente, pero que la aplicación aún no los ha leído. Esta diferencia normalmente significa que la aplicación (por ejemplo, StackExchange.Redis) no está leyendo los datos de la red con la rapidez con la que el servidor se los envía.

Puede configurar las opciones de ThreadPool para asegurarse de que su grupo de subprocesos se escala verticalmente a gran velocidad en escenarios de ráfaga.

Uso elevado de la CPU del cliente

Un uso elevado de la CPU del cliente indica que el sistema no puede seguir el ritmo del trabajo que se le ha solicitado hacer. Aunque la caché haya enviado la respuesta rápidamente, es posible que el cliente no pueda procesar la respuesta de manera oportuna.

Supervise la utilización de la CPU de todo el sistema del cliente mediante las métricas disponibles en Azure Portal o a través de los contadores de rendimiento en la máquina. Tenga cuidado de no supervisar la CPU de un proceso, porque un solo proceso puede tener un uso de CPU bajo pero la CPU de todo el sistema puede ser elevada. Busque picos de uso de CPU que correspondan a tiempos de espera agotados. Una utilización de la CPU alta también puede provocar valores de in: XXX en mensajes de error de TimeoutException, como se describe en la sección Ráfagas de tráfico.

Nota

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 StackExchange.Redis NuGet. Hay errores que se solucionan constantemente en el código que lo hacen más solido frente a tiempos de espera agotados, por lo que es importante tener la versión más reciente.

Para mitigar la utilización de la CPU elevada de un cliente:

  • Investigue lo que está provocando los picos en la CPU.
  • Actualice la máquina virtual del cliente a un tamaño mayor con más capacidad de CPU.

Limitación de ancho de banda del lado cliente

En función de la arquitectura de los equipos cliente, estos pueden tener limitaciones en el ancho de banda de red disponible. Si el cliente supera el ancho de banda disponible por una sobrecarga de la capacidad de red, los datos no se procesarán en el lado cliente con la rapidez con la que el servidor se los envía. Esta situación puede provocar tiempos de espera.

Supervise cómo cambia la utilización del ancho de banda a lo largo del tiempo mediante un ejemplo BandwidthLogger. Este código puede no ejecutarse correctamente en algunos entornos con permisos restringidos (como sitios web de Azure).

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.

Información adicional