Datapayasadas

diciembre 21, 2011

Performance Tunning: Identificando cuellos de botella

Filed under: .Net, ASP.NET, Herramientas — Etiquetas: , , , , — pabloide86 @ 12:45 am

Holasss amigos! Hacia muchísimo que no escribía por acá! El motivo de este post es compartir mi experiencia con respecto al tunning de performance de una aplicación, mas específicamente de una aplicación web.  Mas que nada para compartir algunas herramientas y procedimientos que me fueron muy útiles a la hora de identificar cuellos de botella en el código.

Por desgracia, este trabajo siempre suele dejarse para el final, cuando todo el trabajo ya esta hecho y estamos al horno con la entrega por lo que cualquier cambio impacta mucho! Asique manos a la obra..

Lo primero que necesitamos es un ambiente aislado para realizar las mediciones, si es posible contar con un ambiente similar al que se contará para desplegar la aplicación mucho mejor.. y sino por lo menos contar con las mismas versiones de sistema operativo, base de datos, servidor web, etc..

También necesitaremos algunas herramientas para realizar las mediciones y poder obtener un diagnostico mas preciso sobre dónde se encuentra el problema. Algunas de las que me resultaron muy utiles son:

  • Drone Profiler http://www.droneprofiler.com/index.aspx (Excelente profiler para el lado servidor que cuenta con una versión free para uso personal).
  • DynaTrace AJAX Edition http://ajax.dynatrace.com/ajax/en/ (Otro excelente profiler pero esta vez para el lado cliente. Se integra con FireFox y con el innombrable cuyas iniciales son dos vocales que no son A, O, U..también es free.
  • Existen otras herramientas como YSlow, FireBug, Fiddler, HttpFox, etc. que también nos pueden ser útiles.
  • Y por ultimo, SQL Profiler por si alguno se anima a revisar la base de datos 😛

Ok, y ahora ¿¿¡por donde empiezo!??

Les cuento mi experiencia con una pagina de consulta que me tocó optimizar. Dicha consulta tardaba unos 19 segundos en mostrar los resultados (10 registros). Cabe destacar que por cada uno de esos 10 registros debía validar una buena cantidad de lógica de negocio para mostrar u ocultar unos checkboxes.

Lo primero que hice fue abrir DynaTrace y ejecutar una sola vez la consulta. De los resultados obtuve que de esos 19 segundos, 14 los perdía en el servidor (llamada al WebMethod que cargaba la grilla por AJAX) y el resto en el cliente (JavaScript/jQuery no optimizado), por lo que el problema evidentemente estaba en el servidor.

Teniendo esta información cerré el DynaTrace y abrí el Drone Profiler, repitiendo la misma prueba: ejecutar una vez la consulta. Con eso logré identificar cuales métodos tardaban mas tiempo en ejecutarse.. la mayoría eran métodos de la capa de acceso a datos (basada en Entity Framework)..con SQL Profiler descarté que el problema fuese la consulta, por lo que definitivamente logré aislar el problema con Entity Framework que tardaba demasiado tiempo en generar las consultas SQL.. luego con la ayuda de Google encontré varias optimizaciones que fui probando hasta lograr un tiempo aceptable. También refactoricé un par de métodos para leer una sola vez las 10 entidades en vez de leerlas una por una.. eso también ayudó..

Luego de todas estas optimizaciones, el tiempo de la consulta bajó a un mínimo de 2,9 segundos, cifra que no pude bajar sin tener que refactorizar mas agresivamente el código..

Como verán, no hay una única forma de encarar esta problemática.. se trata de realizar un primer diagnóstico para ver donde puede estar el cuello de botella (si esta en el lado cliente, si esta en el servidor, o si es la base de datos).. luego investigar mas de cerca el código, ver si existe alguna optimización, o bien si amerita una refactorización completa.. muchas veces el código mas compacto y reutilizable no es el que mejor performa..

Algunos consejos rápidos para optimizar los tiempos de carga de la página:

  • Compresión en IIS
  • Cache para almacenar listas que rara vez cambian (productos, paises, provincias, etc.)
  • Minificar y combinar JavaScript/CSS
  • Compilar en modo Release al desplegar en un ambiente productivo
  • Desactivar el ViewState para controles que no lo necesitan
  • Usar con cuidado los selectores de jQuery
  • No abusar de $(document).ready() y usar $(window).load()

Por ultimo, les dejo algunos enlaces que encontré sobre optimizaciones..

http://www.asp.net/web-forms/tutorials/continuing-with-ef/maximizing-performance-with-the-entity-framework-in-an-asp-net-web-application

http://blog.dynatrace.com/2009/11/09/101-on-jquery-selector-performance/?source=dae30

http://www.artzstudio.com/2009/04/jquery-performance-rules/

http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/d52ff289-94d3-4085-bc4e-24eb4f312e0e.mspx?mfr=true

Espero que les haya resultado útil!

Saludos y felices fiestas!!!

Anuncios

2 comentarios »

  1. Muy bueno pablo, gracias

    Comentario por Mauri — diciembre 21, 2011 @ 11:20 am

  2. muy buen aporte! un saludo

    Comentario por Miguel — febrero 4, 2012 @ 1:01 pm


RSS feed for comments on this post. TrackBack URI

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Blog de WordPress.com.

A %d blogueros les gusta esto: