Una de las características clave que Couchbase proporciona para consultar datos JSON es un lenguaje N1QL. N1QL permite a los usuarios acceder y modificar el contenido de sus documentos JSON con sentencias SQL conocidas. Muy a menudo, durante la fase de desarrollo de una nueva aplicación es necesario simular ciertas cargas de trabajo de producción para determinar si la nueva aplicación cumpliría los SLAs requeridos en términos de tiempo de respuesta y concurrencia en un escenario de prueba de estrés. Normalmente, la estructura de los documentos JSON del bucket ya está definida y las consultas N1QL de producción existentes se conocen de antemano. Como parte de la evaluación comparativa de una nueva aplicación, tenemos que definir tanto las cargas de trabajo N1QL existentes como las recién añadidas y, opcionalmente, parametrizarlas; a continuación, ejecutar esas cargas de trabajo con diferentes niveles de concurrencia y medir el rendimiento de las consultas.
En este artículo del blog me gustaría discutir Apache JMeter herramienta que podría ayudar en tal esfuerzo. También puede ver el vídeo de esta demostración aquí.
Apache JMeter
Apache JMeter es una aplicación gratuita de código abierto basada en Java que se utiliza para diseñar y ejecutar pruebas exhaustivas de rendimiento de aplicaciones web, bases de datos, servicios web SOAP y REST, FTP, LDAP y servidores de correo, protocolos TCP y SMTP. JMeter puede emular una carga de trabajo pesada en el servidor y ayudar a analizar el rendimiento en diferentes escenarios de prueba. JMeter viene con una interfaz gráfica de usuario que se utiliza para diseñar y ejecutar pruebas, mientras que la medición de una variedad de métricas de rendimiento, tales como el promedio, el tiempo de respuesta mínimo y máximo, desviación estándar, rendimiento, y etc. Para añadir elementos al plan de pruebas (grupos de hilos, escuchas, muestreadores, etc.), haga clic con el botón derecho del ratón en un elemento del árbol y seleccione un nuevo elemento en el menú "añada". Una de mis características favoritas proporcionadas por JMeter es la capacidad de cambiar fácilmente el número de hilos concurrentes que ejecutan una carga de trabajo en particular. Una vez que se ha diseñado un escenario de prueba en JMeter, se puede guardar en el archivo con el comando .jmx extensión. Para realizar pruebas de carga y obtener resultados óptimos, se recomienda ejecutar un escenario de prueba ya creado en un modo CLI sin GUI suministrando .jmx al ejecutable de JMeter.
Puede obtener más información sobre las capacidades de JMeter descargándolo de https://jmeter.apache.org/ y la lectura de tutoriales/documentación.
Creación de un escenario de prueba
Para mi demo tengo tanto JMeter como el servidor Couchbase ejecutándose en mi Mac. He definido dos cargas de trabajo sencillas con sentencias N1QL para el bucket "travel-sample". La primera carga de trabajo titulada "Workload 1 - Read" ejecuta 5 hilos concurrentes donde cada hilo recoge aleatoriamente consultas N1QL del pull de 10 consultas, como se muestra abajo. Para mi escenario de prueba planeo mantener la tasa objetivo de "Carga de trabajo 1 - Lectura" durante 120 segundos.
Antes de ejecutar la prueba, debe autenticarse una conexión al servidor Couchbase a través de "HTTP Authorization Manager".
Para ilustrar la aplicación de parámetros a la cláusula WHERE, he parametrizado la consulta "Select 3" con rangos de ID de país, bajo y alto. Esos parámetros se tomarían del archivo countries.dat. Puede parametrizar las consultas N1QL a través del elemento de prueba "CSV Data Set Config", como se muestra a continuación.
Cada sentencia N1QL se envía a Couchbase desde el muestreador "HTTP Request" a través de un método POST.
La segunda carga de trabajo "Carga de trabajo 2 - CRUD" tiene una inserción simple, 3 selecciones, operaciones de actualización y eliminación. El objetivo de la prueba es medir las características de rendimiento de la segunda carga de trabajo "Carga de trabajo 2 - CRUD" cuando se ejecuta en nombre de un subproceso que realiza 10 iteraciones de forma autónoma (es decir, solo en el universo) y, a continuación, con la "Carga de trabajo 1 - Lectura" que se ejecuta en paralelo. Las consultas definidas para cada carga de trabajo tienen diferentes perfiles de complejidad y rendimiento, con tiempos de respuesta que oscilan entre menos de un segundo y varios segundos, cuando se ejecutan individualmente.
Ejecución de pruebas y medición del rendimiento
Una vez definido el escenario de prueba, todo lo que tuve que hacer fue ejecutar una prueba de JMeter, bien pulsando el botón verde Start del menú superior o bien suministrando el archivo .jmx al script ejecutable de jmeter. Para medir y visualizar los resultados de rendimiento, añadí varios listeners en "Carga de trabajo 2 - CRUD". El listener "Summary Report" proporciona estadísticas resumidas de la prueba y de cada sentencia N1QL individual. El oyente "Ver árbol de resultados" puede utilizarse con fines de depuración para comprobar los datos de estado, solicitud y respuesta de cada muestra. Hay muchos otros listeners disponibles en JMeter. A continuación se presentan los resultados de rendimiento de "Carga de trabajo 2 - CRUD" cuando se ejecuta de forma independiente, con los tiempos de respuesta medidos en milisegundos. Observe que la primera carga de trabajo "Workload 1 -Read" se deshabilitó durante esta ejecución. Puede desactivar fácilmente ciertas partes de su plan de pruebas haciendo clic con el botón derecho en el elemento de prueba y seleccionando la opción "Desactivar".
Durante la siguiente ejecución, ambas cargas de trabajo estaban activas e inmediatamente noté la diferencia en el tiempo de respuesta, especialmente para una consulta "Select with Join" más compleja, con un tiempo medio transcurrido que saltó de 600 ms a casi 2,6 segundos. Obviamente, la CPU estaba al máximo cuando se ejecutaban varios subprocesos en mi Mac, por lo que estas cifras se ofrecen únicamente a título ilustrativo.
Los resultados de la prueba también pueden visualizarse con el oyente "Gráfico de tiempo de respuesta", como se muestra a continuación. El tiempo transcurrido de la consulta "Select with Join" representado por la línea amarilla se redujo una vez completada la primera carga de trabajo.
En conclusión
JMeter no es la única herramienta disponible para ejecutar pruebas de estrés y evaluar el rendimiento. Couchbase proporciona un par de otras herramientas cbc-pillowfight y cbc-n1qlback para comprobar el rendimiento de las operaciones clave/valor y las sentencias N1QL. YCSB es otra herramienta de evaluación comparativa que puede utilizarse para probar diversas bases de datos NoSQL. Puede encontrar varios artículos sobre YCSB y YCSB-JSON en la página de blogs de Couchbase.
¿Existe un controlador couchbase para jmeter?
Hay un driver JDBC de Couchbase (proporcionado por CData) que puedes usar con JMeter pero nunca lo he probado.