Asterisk Taskpool: De una intuición a una Mejora de Rendimiento Significativa

Asterisk ha utilizado durante más de 10 años el threadpool API, que proporciona métodos comunes para un pool configurable de threads que pueden ejecutar trabajo arbitrario. Los dos usuarios más intensivos han sido PJSIP y Stasis, que lo emplean principalmente para despachar trabajo de manera asíncrona.

Basándose en tendencias observadas (posts y comentarios sobre los taskprocessors stasis/pool y stasis/pool-control), se intuyó que el costo de usar el threadpool API era elevado. Al examinar la implementación, confirmó sus sospechas:

Ineficiencias del Threadpool:

  • Mantiene una cola única de trabajo para todas las tareas
  • Utiliza una segunda cola de gestión separada para administrar el pool
  • Cada tarea insertada resulta en 2 tareas encoladas: la tarea real y una tarea de gestión del threadpool
  • Si el threadpool no responde lo suficientemente rápido, la cola única puede crecer indefinidamente, causando los famosos mensajes de stasis/pool taskprocessor

Pruebas de Eficiencia del Threadpool

Ejecutando tests durante 30 segundos con 50 threads:

  • Threadpool Push: 22,809,319 tareas ejecutadas (760,310 por segundo)
  • Threadpool Serializer Push: 16,590,999 tareas ejecutadas (553,033 por segundo)

El uso de serializers incurre en aproximadamente 27% de penalización en rendimiento. 

Conclusión: El threadpool API es bueno para tareas de duración media a larga, pero ineficiente para tareas de corta a media duración. El overhead de gestionar el threadpool simplemente no vale la pena.

La Solución: Taskpool API

Se diseñó un nuevo API específicamente enfocado en tareas de corta a media duración, llamado taskpool.

Diferencias Clave del Taskpool:

  1. No hay cola única de trabajo: Cuando se inserta una tarea, se asigna inmediatamente a un taskprocessor específico y se encola directamente en él
  2. No hay cola de gestión separada: Si el taskpool necesita crecer, se hace al insertar una tarea. Si necesita reducirse, se hace de forma asíncrona en segundo plano usando un scheduled item periódico
  3. Es efectivamente un pool de taskprocessors con la configurabilidad del threadpool API

Aclaración Importante sobre Taskprocessors

Los taskprocessors en sí mismos son bastante eficientes. Los problemas de taskprocessor son causados fundamentalmente por cómo los usuarios los emplean. Si son lentos o no los usan eficientemente, el síntoma son problemas de taskprocessor.

Resultados de Rendimiento del Taskpool

Ejecutando tests equivalentes en el mismo sistema:

  • Taskpool Push: 61,255,016 tareas ejecutadas (2,041,833 por segundo) – 2.69x más tareas que threadpool
  • Taskpool Serializer Push: 48,997,697 tareas ejecutadas (1,633,256 por segundo) – 2.95x más tareas que threadpool

La penalización por uso de serializers se reduce a aproximadamente 20%.

Rendimiento en Diferentes Sistemas

Otros usuarios han reportado resultados aún mejores, hasta 20x de mejora. El rendimiento depende del sistema y CPU específico, pero es una mejora para todos sin excepción.

Nota crítica: A lo largo de todo este proceso, no se hicieron cambios a los taskprocessors en sí mismos. Esto demuestra cómo el uso correcto de taskprocessors puede marcar una enorme diferencia en rendimiento.

¿Dónde se Usa Taskpool Actualmente?

El usuario principal de taskpool es Stasis para despacho de mensajes desde las versiones:

  • Asterisk 20.17.0
  • Asterisk 22.7.0
  • Asterisk 23.1.0

Cambios Visibles:

  • La configuración cambió a taskpool (las opciones de threadpool siguen soportadas)
  • En core show taskprocessors, los taskprocessors pool y pool-control fueron removidos y reemplazados por stasis taskpool

Impacto Reportado:

Los reportes tempranos muestran:

  • Reducción de 20-30% en uso de CPU
  • Resolución de problemas de rendimiento para múltiples usuarios

Para usarlo: Solo actualiza a una de las versiones listadas o superior. No hay nada más que hacer.


Conclusión: Esta mejora demuestra cómo una intuición bien fundamentada y un análisis cuidadoso de la arquitectura pueden resultar en mejoras significativas de rendimiento, simplemente utilizando las herramientas existentes (taskprocessors) de manera más eficiente. Fuente: https://www.asterisk.org/taskpool-a-hunch-turned-performance-improvement/

 

Vota el Articulo: 

Sin votos (todavía)
Evalúa la calidad del articulo
Suscribirse a Comentarios de "Asterisk Taskpool: De una intuición a una Mejora de Rendimiento Significativa" Suscribirse a VozToVoice - Todos los comentarios