es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El perfilado de Rebus con RabbitMQ tiene un alto consumo de CPU.

Estoy usando Rebus para comunicarme con rabbitmq y he configurado para utilizar 4 trabajadores con una paralelización máxima de 4. También me he dado cuenta de que el recuento de prefetch es 1 (probablemente para tener un equilibrio uniforme entre los consumidores).

Mi problema ocurre cuando tengo un pico de, digamos, 1000 mensajes, por ejemplo, noto un alto uso de la CPU en un entorno de Kubernetes con 2 contenedores donde la CPU está limitada, digamos, a 0.5 CPU.

He perfilado la aplicación con dotTrace y muestra que la causa está en el método cancenationToken.WaitHandle.wait dentro de la clase DefaultBackOffStrategy.

Mi pregunta es si la configuración inicial de los trabajadores/paralelismo está haciendo que esto ocurra o si necesito ajustar algo en Rebus. También he intentado cambiar el recuento de prefetch para cada consumidor, pero en la interfaz de gestión de rabbitmq, esto no cambia el valor predeterminado (que es uno).

Además, con el perfilador de CPU de Visual Studio y mirando los contadores de .net, noto algunos contadores de contención de bloqueo (¿puede estar esto relacionado?).

Mi pregunta en este punto es por qué el uso de la CPU es tan alto y una forma de solucionar esto correctamente.

Gracias por cualquier ayuda proporcionada.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Problema con Rabbitmq y Rebus: Uso elevado de la CPU durante picos de mensajes

    Descripción del problema

    El usuario experimenta un alto uso de la CPU en un entorno de Kubernetes con dos contenedores al utilizar Rebus para comunicarse con Rabbitmq. La configuración incluye 4 trabajadores con una paralelización máxima de 4 y un recuento de anticipación de 1. El usuario observa el problema durante picos de mensajes, como por ejemplo con 1000 mensajes. El usuario ha realizado un perfilado de la aplicación con dotTrace y ha descubierto que el problema se encuentra en el método CancellationToken.WaitHandle.Wait dentro de la clase DefaultBackOffStrategy. Además, el usuario ha intentado cambiar el recuento de anticipación sin éxito.

    Posibles causas

    La configuración inicial de los trabajadores y la paralelización puede estar provocando el alto uso de la CPU durante los picos de mensajes. Además, puede haber necesidad de ajustar algo en Rebus para solucionar este problema. El usuario también ha observado contadores de contención de bloqueo al utilizar el perfilador de CPU en Visual Studio, lo cual podría ser una causa potencial del problema.

    Posibles soluciones

    Para reducir el alto uso de la CPU, es posible que sea necesario aumentar el número de contenedores en el entorno de Kubernetes o ajustar la configuración de los trabajadores y la paralelización en consecuencia. Además, modificar la configuración de Rebus, como cambiar la estrategia de espera, también puede ayudar. Asimismo, el usuario puede intentar cambiar el recuento de anticipación utilizando la interfaz de administración avanzada de RabbitMQ o aumentar el número de consumidores para mejorar el procesamiento de mensajes. En cuanto al problema de contención de bloqueo, sería mejor determinar si está relacionado con la configuración de Rebus/Rabbitmq o en algún otro lugar de la aplicación.

    En resumen, solucionar el alto uso de la CPU en un entorno de Rebus y Rabbitmq requiere un examen exhaustivo de la configuración, la arquitectura de la aplicación y el entorno del sistema. Puede que sea necesario realizar cambios para mejorar el rendimiento o identificar posibles cuellos de botella que deben solucionarse.

Comments are closed.