Blog

Cómo ejecutar Pruebas de Performance de streaming de video con el Plugin HLS para JMeter

Como hacer uso de esta herramienta open source para probar el streaming de video de manera incremental.

En esta publicación, quiero compartir algo en lo que hemos estado trabajando con BlazeMeter durante varios años. En este proyecto, tuvimos la oportunidad de contribuir al código open source de JMeter, haciendo que esta herramienta sea capaz de simular carga en protocolos de streaming de video, y así poder ejecutar pruebas de performance.

Como también hemos podido utilizar esta herramienta en algunos de nuestros proyectos, tenemos algunos consejos que le ayudarán a preparar y ejecutar pruebas de performance en HLS (el protocolo en el que estamos trabajando).

Quiero agradecer especialmente a Roger Abelenda, Luis Martínez y Sebastián Lorenzo de Abstracta por su contribución a este artículo sobre pruebas de performance de streaming de video. Espero que esta publicación pueda ser de utilidad y sirva de guía para esta práctica.

Cualquier tipo de sistema que sea utilizado por varios usuarios, pero en particular el streaming de video, debe probarse para minimizar cualquier riesgo antes del lanzamiento. En las próximas líneas, me enfocaré específicamente en estas pruebas

Antes de comenzar, recuerde que como en cualquier prueba de performance, necesitamos simular la interacción entre el cliente y el servidor, por lo que en este caso nos concentraremos en el protocolo HLS (HTTP Live Streaming).

¿Cómo funciona el protocolo HLS?

Puede encontrar la explicación del protocolo HLS de Apple en este artículo. Básicamente, el protocolo tiene ciertos pasos a seguir, que explicaré a continuación. Aunque el protocolo está diseñado para tres variantes, On Demand, Live y Event, me centraré en el ejemplo On Demand. Una vez que haya entendido uno, es muy fácil comprender a los demás.

Desde el lado del servidor (Codificador)

El audio o video que se transmitirá se puede reproducir en diferentes niveles de calidad, bitrates y resoluciones. Cada versión se denomina “variante”. Entonces, desde el lado del servidor tenemos diferentes variantes del mismo video, con diferentes resoluciones. En el ejemplo que se ve en la anterior imagen, tenemos el mismo video en tres variantes, una en baja resolución diseñada para una conexión 3G (este es solo un ejemplo para ayudar a comprender mejor el protocolo), otra con mejor resolución para cuando el espectador está conectado a Wi-Fi, y una tercera variante con la resolución más alta para cuando alguien mira el video en un Apple TV (ya que este protocolo fue creado por Apple, lo pondremos como ejemplo).

Las diferentes variantes se dividen en pequeños segmentos por el codificador (Media Segment Files). En otras palabras, cada video se dividirá en muchas partes y se guardará en un archivo de extensión ‘.ts’.

El codificador crea una lista de reproducción multimedia para cada variante con las URL de cada segmento. Esto sería como el índice de los segment files, de modo que el cliente pueda saber cómo ensamblar el video a partir de todos esos segmentos.

El codificador también crea un Master Playlist File con las URLs de cada lista de reproducción multimedia. De esta forma, el cliente sabrá qué variantes están disponibles (las resoluciones disponibles para descargar).

Desde el lado del cliente (reproductor de video o audio)

Se descarga la Master Playlist, y con ella vienen las diferentes Media Playlists con las variantes (diferentes calidades de video, bitrates y resoluciones), que contienen las referencias a los segmentos y los videos correspondientes.

Los segmentos indicados por la Media Playlist se descargan en tiempo real y en el caso del Live Video o Event, la Media Playlist se descarga periódicamente para comprobar si hay nuevos segmentos que se han agregado.

Protocolo HLS paso a paso

A continuación, puede ver cómo sería un flujo de mensajes al reproducir un video desde un navegador. Este es un ejemplo simple para que pueda visualizar el paso a paso con claridad y finalmente comprenderlo.

En el sitio de DemoBlaze, vaya a la sección ‘Nosotros’, donde encontrará un video. Esta es la URL.

Esa es la Master Playlist File. Si accede a esa URL se descargará un archivo de extensión m3u8, cuyo contenido es el siguiente:

#EXTM3U


#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=8674000,RESOLUTION=1024×576,CODECS=”avc1.4d001f,mp4a.40.2″


about_demo_hls_2M.m3u8


#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=7633000,RESOLUTION=960×540,CODECS=”avc1.4d001f,mp4a.40.2″


about_demo_hls_1-5M.m3u8


#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=3733000,RESOLUTION=640×360,CODECS=”avc1.4d001f,mp4a.40.2″


about_demo_hls_1M.m3u8


#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2624000,RESOLUTION=480×270,CODECS=”avc1.42001e,mp4a.40.2″

about_demo_hls_600k.m3u8

Estas son básicamente las descripciones de las variantes. El reproductor puede elegir automáticamente o darle al usuario la posibilidad de indicar qué tipo de variante quiere descargar (un video en alta resolución o uno de baja calidad, lo cual sería conveniente si tiene una mala conexión a Internet). Imagine entonces que el usuario opta por descargar la opción de menor calidad, que sería la última (resolución de 480 por 270). Si observa el Master Playlist File, la URL de la Media Playlist correspondiente sería esta; y el contenido (recortado) sería el siguiente:

#EXTM3U


#EXT-X-VERSION:3


#EXT-X-MEDIA-SEQUENCE:0


#EXT-X-ALLOW-CACHE:YES


#EXT-X-TARGETDURATION:13


#EXTINF:12.046444,


about_demo_hls_600k00000.ts


#EXTINF:9.000000,


about_demo_hls_600k00001.ts


#EXTINF:9.000000,


about_demo_hls_600k00002.ts


#EXTINF:12.000000,


about_demo_hls_600k00003.ts


#EXTINF:9.000000,





about_demo_hls_600k00110.ts


#EXTINF:10.133333,


about_demo_hls_600k00111.ts


#EXT-X-ENDLIST

Esto contiene la lista de segmentos de un video de 13 segundos. El cliente es quien pedirá estos segmentos uno a uno y sabrá qué hacer con ellos. Para verlo, vaya a la sección ‘Nosotros’ del sitio de BlazeDemo, luego vaya a las herramientas para desarrolladores de Chrome (tecla F12) y, en la pestaña Red, filtre con la siguiente expresión regular:

/m3u8|\.ts/

De esta manera, solo verá las solicitudes de Master Playlist File, Media Playlists (las que terminan en m3u8) y los segmentos (extensiones ts).

¿Cómo funciona el Plugin JMeter?

Puede encontrar una guía completa de HLS en el repositorio donde está el código fuente del complemento o en esta publicación del blog BlazeMeter escrita por Andres Favre, cuando era parte de nuestro equipo de desarrollo como tester.

El Plugin es muy simple, solo hay una solicitud a la Master Playlist File y el resto es automático, tal como lo sería un reproductor de video. No es necesario realizar todas las solicitudes por separado ni analizar las respuestas para ver qué solicitudes se deben realizar a continuación. La lógica del protocolo está encapsulada en un solo JMeter Sampler.
Luego de instalar el plugin, solo debe definir la URL de la Master Playlist y luego indicar algunos parámetros para ver de cuál video quiere simular su reproducción (el que tiene la máxima calidad, la mínima, una especifica, por cuánto tiempo, etc.)

Al ejecutar una prueba con este Plugin, así es como se vería el resultado en JMeter:

Puede ver que la primera solicitud es a la Master Playlist, la segunda a la Media Playlist (esto depende de lo que hayamos configurado en el Sampler) y luego comienza la secuencia de segmentos.

Así es como se vería el resultado en BlazeMeter:

Ahora que abordamos cómo funcionan el protocolo y el complemento HLS, aquí hay algunas consideraciones a tener en cuenta al armar y ejecutar nuestras pruebas:

¿Qué tener en cuenta al definir el Script?

Tiene que saber qué prueba quiere ejecutar y para eso, es importante pensar en las variables: cuántos usuarios concurrentes habrá, si hay un ramp-up, y si es así, por cuánto tiempo, qué fluye por el sistema, diferentes accesos, datos que pueden variar, etc. También es importante saber qué tipo de video quiere descargar, es decir, un Event, Live o VOD (video on demand). En cualquier caso, tiene la posibilidad de indicar la duración del video que desea descargar, que básicamente determinará la duración de la prueba.

Para ensamblar el script, puede seguir una secuencia paso a paso similar a la que expliqué anteriormente en el ejemplo de BlazeDemo, aunque también puede usar la extensión de Chrome para grabar scripts en JMeter y Taurus. A partir de los 11 minutos de este video, puede ver cómo usar dicha extensión.

Como siempre, es esencial agregar chequeos a estas pruebas porque no es suficiente verificar si el código de respuesta HTTP es correcto (algo que JMeter hace automáticamente). Es mejor agregar algunas validaciones a las respuestas para asegurarse de obtener lo que espera. Como no hay mucho que ver con los segmentos, dado que el contenido es binario, las opciones de contenido que puede validar son solo el contenido de la Master Playlist y la Media Playlist.

Otra aspecto muy útil es usar el HLS Sampler dentro de un controlador de transacciones que permite obtener el tiempo de respuesta de toda la ejecución y así poder comparar la duración de la descarga real y el tiempo de video que se solicita descargar.

Consideraciones al definir el Escenario

  • Si es posible acceder al video desde diferentes ubicaciones en todo el mundo, realice las pruebas también desde diferentes ubicaciones (Blazemeter le permite configurar fácilmente la distribución de las pruebas desde diferentes lugares del mundo).
  • Pruebe diferentes escenarios, diferentes cargas de usuarios, peaks y estrés.
  • Defina si desea simular con o sin HTTPS.
  • ¿Hay balanceadores de carga? ¿Se utilizan CDNs (Red de distribución de contenidos)? Nuestra sugerencia es probar con “nada en el medio” y también probar toda la infraestructura tal como la recibiría el usuario. Para esto, probablemente necesite dejar la URL como parámetro en su script para que sea posible configurar desde la ejecución en BlazeMeter qué entorno desea estresar.

Siempre es importante calibrar la prueba. Es decir, ejecutar varias pruebas para determinar cuántos usuarios virtuales es posible ejecutar desde un solo motor BlazeMeter, o desde un solo computador si ejecuta la prueba localmente. Normalmente, JMeter puede ejecutar más de 500 hilos desde el mismo computador, pero esto depende mucho del script y, por supuesto, de las características del computador, por lo que es mejor probarlo. También es importante vigilar el estado del computador desde donde se ejecuta la prueba, ya que si se saturaran, los resultados no serían confiables.

Consideraciones al visualizar y analizar los resultados de las Pruebas de Performance 

  • Si lo configura para descargar 10 segundos de video, el tiempo total de la muestra debe ser inferior a 10 segundos; de lo contrario, podrían producirse cortes en el video cuando los usuarios lo reproduzcan. Esta es una forma sencilla de verificar si el video se habrá cortado o no.
  • Es importante controlar los tiempos de respuesta de los segmentos y comparar los resultados de diferentes pruebas. Si ejecuta una prueba con pocos usuarios, le ayudará a ver el tiempo de respuesta de los segmentos en condiciones de carga baja y podrá utilizar esas medidas como referencia.
  • Controle los tiempos de respuesta de las Media Playlists y las Master Playlists.
  • Mientras se reproduce la prueba, acceda al video como cliente real (a través de la web o con una aplicación nativa). Si es posible que varias personas se conecten al mismo tiempo, se obtendrán más datos. Allí obtendrá la experiencia real del usuario cuando el sistema se esté cargando. Siempre usamos esta estrategia en las pruebas de performance, incluso en casos más simples, como solo acceder a una página web. Por lo general, lo llamamos el ‘usuario testigo’ (witness user). En las aplicaciones de streaming de video, esta estrategia se vuelve mucho más importante.

Al final de esta publicación de Konstantine Firsanov, descubrirá cómo agregar un postprocesador para obtener ciertas métricas que le permitirán analizar la experiencia del usuario al usar el HLS Sampler.

Los servicios de pruebas de carga de streaming ahora son más fáciles

El Plugin HLS para JMeter es una contribución open source que hemos hecho gracias al apoyo de BlazeMeter.

Aunque nuestro equipo continúa trabajando en este proyecto, ¡todas las contribuciones son bienvenidas! Puede encontrar este Plugin y muchos más en el repositorio Github de BlazeMeter.

Webinar sobre el Plugin de HLS

Nuestro CTO, Roger Abelenda (que ayuda en el trabajo de nuestro equipo de desarrollo de Plugins para JMeter), hace una demostración del Plugin HLS y comparte algunas buenas prácticas a considerar al ejecutar pruebas de performance de streaming de video:


¿Desea conocer cuándo es el momento oportuno para comenzar con las pruebas de performance, a qué niveles y con qué carga? O bien, ¿aprender más sobre las pruebas de performance de streaming de video? Agende aquí una consultoría gratuita y personalizada de 30 minutos con nuestros expertos.


Otros contenidos relacionados

JMeter DSL, una innovadora herramienta para Testing de Performance

Threads Virtuales: JMeter y Project Loom

¿Por qué son necesarias las pruebas de performance? 

¿Cómo armar un plan de prueba de performance?

22 / 166