Ir al contenido principal

Análisis de peticiones en logs. [1/2]

Introducción


Últimamente me he interesado por la información que podemos obtener mediante los logs para utilizarla de forma proactiva. Por lo normal utilizamos los registros para detección de anomalías o desperfectos que afectan la operación de una aplicación, pero rara vez utilizamos toda la información que compone un log para proyectar un comportamiento u obtener el diagnóstico de cómo opera con "normalidad" nuestro sistema. 

En esta entrada de blog me gustaría realizar un análisis que responda a la pregunta ¿vale la pena invertir horas en la optimización de código en una aplicación web?. Para ello, nos enfocaremos en la correlación de los tiempos de respuesta (aka TR) y el número de peticiones que el sistema resuelve en un periodo de tiempo. Podríamos auxiliarnos de pruebas de estrés, sin embargo, algunas veces no disponemos de los ambientes necesarios, y solo nos queda hechar mano de los registros productivo, aún así, es decisión de cada quién cómo obtener la información requerida.
 
Los logs como el access de Apache es sumamente flexible para conocer cómo se desempeña la aplicación en cualquier ambiente. Una característica impportante es que puede ser en tiempo real o no, los registros (siempre que se resguarden) estarán disponibles para tratarlos.

El ejercicio fue realizado sobre un JBOSS 5.2, no obstante, puede funcionar con cualquier registro en formato log access. La configuración de tal formato de log en JBOSS sale del alcance de este documento. Haremos mucho uso de las herramientas de GNU/Linux, especialmente AWK; y algo de paquetería para presentación de datos.

Insumos


El formato luce más o menos como sigue:



Time Taken: 0.045 172.23.0.16 - - [11/Dec/2015:12:33:07 -0600] GET /APP/home.seam HTTP/1.1 200 18063 45
Time Taken: 0.017 172.23.105.153 - - [11/Dec/2015:12:33:09 -0600] GET /APP/home.seam HTTP/1.1 200 18063 17
Time Taken: 0.018 172.23.0.15 - - [11/Dec/2015:12:33:09 -0600] GET /APP/home.seam HTTP/1.1 200 18063 18



Nos interesa el tiempo de cada petición, la fecha, el método HTTP, el recurso en cuestión y por supuesto, el código de respuesta HTTP. Tenemos que ser claros en qué buscamos para darle sentido a la información. Para tales efectos, cree un formato como el que sigue.


Nombre del reporte/aplicación
Instancia 1 Instancia 2
Tiempo de respuesta Tiempo de respuesta
Promedio Máximo Mínimo Promedio Máximo Mínimo
0.0194362 10.715 0.014 0.021783 6.967 0.016
Peticiones Peticiones
Total Mayores a 2 segundos % Total Mayores a 2 segundos %
836752 39 0.0046608792 837338 37 0.0044187652
Listado de peticiones Listado de peticiones
TR Petición
TR Petición
2.075 /APP/a4j/g/3_3_1.SP3/org/richfaces/ui.pack.js
3.213 /APP/a4j/g/3_3_1.SP3/org/richfaces/ui.pack.js
2.371 /APP/a4j/g/3_3_1.SP3/org/richfaces/ui.pack.js
6.967 /APP/APP/busqueda/BusquedaJerarquica.seam?cid=1853903
4.564 /APP/a4j/g/3_3_1.SP3/org/richfaces/ui.pack.js
6.503 /APP/APP/busqueda/BusquedaDirecta.seam
2.447 /APP/a4j/g/3_3_1.SP3/org/richfaces/ui.pack.js
4.656 /APP/APP/busqueda/BusquedaTematica.seam?cid=1854332
5.786 /APP/home.seam
2.09 /APP/APP/busqueda/BusquedaTematica.seam
2.702 /APP/APP/busqueda/BusquedaTematica.seam?cid=1860193
2.595 /APP/a4j/g/3_3_1.SP3/org/richfaces/ui.pack.js


Ahora bien, veámos cómo obtener cada uno de los datos. 

Juguemos con la línea de comandos


Parto de la idea que estarás utilizando tu poderoso GNU/Linux. Lo primero que buscaremos es el apartado de Tiempos de Respuesta. En este momento es bueno darle una leída a los apuntes de probabilidad y estadística.
 

Tiempo de respuesta
Promedio Máximo Mínimo
0.0194362 10.715 0.014


Promedio

cat logs_1/*.log | awk '{print $3,$9}' | awk '{sum +=$1} END {if (NR >0) print sum/NR}'


Máximo

cat logs_1/*.log | awk '{print $3,$10}' | sort -h

Mínimo

cat logs_1/*.log | awk '{print $3,$10}' | sort -r


Peticiones
Total Mayores a 2 segundos %
836752 39 0.0046608792


Total

 cat logs_1/*.log | awk '{print $3,$10}' | wc -l

Mayores a 2 segundos

cat logs_1/*.log | awk '{print $3,$10}' | awk '{ if ($1 > 2) print $2 }'

%

La fórmula en OpenOffice es: =(Mayores a 2 segundos *100)/Total de peticiones

Listado de peticiones
TR Petición
2.075 /APP/a4j/g/3_3_1.SP3/org/richfaces/ui.pack.js
2.371 /APP/a4j/g/3_3_1.SP3/org/richfaces/ui.pack.js

TR 

cat logs_1/*.log | awk '{print $3,$10}' | awk '{ if ($1 > 2) print $1 }'  

Petición

cat logs_1/*.log | awk '{print $3,$10}' | awk '{ if ($1 > 2) print $2 }'

Conclusión


Como se puede observar, los promedios en los tiempos de respuesta generales son muy buenos con respecto a los tiempos máximos y su frecuencia (datos de ejemplo). Por tanto, no vale la pena invertir horas en mejorar esos tiempos.

En la siguiente entrada abordaré la frecuencia de los tiempos máximos distinguiendo sobre el recurso y el porcentaje en que se presentan, de tal manera que dilucidemos si un recurso que es solicitado en pocos casos es su TR es alto con respecto al resto de sus solucitudes.


Comentarios

Entradas populares de este blog

Ángulo de Corte

El armar un gallo de pulgada es una de las cosas más sujeta a mitos y medias verdades. Este es uno de los muchos temas que los galleros enuncian con una seguridad a prueba de balas.  Hasta el momento no he leído un solo escrito o esquema con detalle científico que tenga conclusiones claras y precisas de lo que sucede en un combate ni la ergonomía que mejor se adapta, todo proviene de un sistema de creencias que, muy en lo personal, me cuesta creer. El ángulo de corte se refiere a la posición de la punta de la navaja con respecto al codo de la pata. Dependiendo del amarrado es que la sitúa en un rango de los 5° a los 9°. De lo que no dudo es que no hay una manera precisa de emitir teorema alguno sobre este rubro. La formula del corte está dada por la sujeción de la navaja, la forma de la navaja, la altura de la botana, la posición de disparo del gallo, así como la calidad y aprendizaje del mismo durante el desarrollo de la pelea. Son muchas las variables, sin emba...

Análisis de conexiones TIME_WAIT

El tema de las conexiones mal utilizadas es un dolor de cabeza para muchos administradores de servidores de aplicaciones. Es común que las aplicaciones que mantenemos en nuestro resguardo sufran degradación, e incluso fallos, por el "simple" hecho de no cerrar las conexiones o tardar demasiado en hacerlo (vía sistema operativo). Como sabemos, una conexión pasa por varios estados, mismos que salen de la intención de este escrito. Las conexiones establecidas (ESTABLISHED) son demasiado costosas cuando abren y cierran, debido a eso, se han creado manejadores de conexiones (pooles) que mantienen abiertas las conexiones para reutilizarlas dependiendo la demanda. Es por eso, que en medida de lo posible, hay que utilizar un manejador de conexiones, ya sea a base de datos o algún broker. Entrando de lleno al tema, las conexiones en estado TIME_WAIT son un problema por el consumo de memoria, ocupando cada una 64k de memoria no paginable, es decir,  todo el tiempo se mantiene...

Significado de los dígitos de versión del kernel Linux

Algunas de las cosas que siempre quise saber, pero nunca me hice del tiempo para investigarlo es la función de los cuatro dígitos del kernel Linux. Su significado poco tiene que ver con hechos cabalísticos o confusos enunciados matemáticos. Mejor que en mis palabras están las de Tanenbaum: Los números de versión de Linux consiste en cuatro números, A.B.C.D, como 2.6.9.11. El primer número indica la versión del kernel. El segundo indica la revisión mayor. Antes del kernel 2.6 los números pares correspondían a versiones estables del kernel, mientras que los impares correspondían a versiones inestables que estaban en desarrollo. Después del kernel 2.6 los significados se manejaron de forma distinta. El tercer número corresponde a la revisión de versiones menores, como la aceptación de drivers. El cuarto número corresponde a las correcciones de errores menores o parches de seguridad.  Como ven, el señor Tanenbaum es sumamente lacónico con la explicación de los dígitos que compo...