Problemas de eficiencia usando WCF 3.0?? Aqui esta la solución!!

|

Justo antes de que salga como RTM WCF y el Framework 3.0 tome la decision de usarlo para un proyecto que estaba como hecho para que se use WCF y cabia justo en la dimension de tiempo para que funcione todo en lo correcto, pues bien cuando ya estuvo en produccion a veces mi proyecto no era muy rapido, asi es que comence a indagar que sucedia, al tener por backend Oracle 10g y con un poco de mala experiencia con esa base de datos (debes realmente tener un dba para que funcione como debe y cuando escribes SQL pues tienes que tener un cuidado aun mayor por que si lo escribes solo por escribir seguramente sera lento), por esto pase un par de meses monitoreando la base y afinando mis sentencias, esto definitivamente mejoro el rendimiento en casi todos los procesos, asi es que primera leccion aprendida: Si usas Oracle como backend tambien asegurate de tener un experimentado dba que acompañe todo el desarrollo y la puesta en producción...
Ahi no termina la historia, comenzo a crecer el sistema y mucho mas de lo planeado y volvio a ponerse lento, y mas lento, y mas lento!!! Si bien los usuarios no tenian mucho problema con la lentitud por que la interfase de usuario es asincronica, la verdad yo veia que tenia cada vez mas problemas con la velocidad, ciertos procesos internos realmente tomaban demasiado tiempo, nuevamente entre a buscar el problema, mucho debug del codigo no ayudaba mucho asi es que tenia que probar tecnicas de profile, un producto que me ayudo en verdad es el ANTS profiles de RedGate (http://www.red-gate.com/products/ANTS_Profiler/index.htm) en mi opinion cualquier desarrollador profesional deberia tener una herramienta como esta, ayudo mucho y mas que nada encontre algunas cosas interesantes:

1. Cuando habia comunicacion entre el Cliente WCF y el Servidor WCF el consumo de memoria era realmente un problema, especialmente mi servicio el cual comenzaba a crecer y no dejaba de hacerlo, e incluso nunca liberaba memoria, asi este inactivo algunos días, lo cual me tenia confundido, incluso revisaba con el profiler la memoria, como estaba actuando el GC y cosas relacionadas lo que encontre es que habian millones de objetos de tipo String que no se morían, eso era raro por cuanto yo apenas si usaba un par de constantes dentro del servicio, no ocupaban tanta memoria pero estaban ahi...

2. Despues aisle la funcionalidad del servicio y lo separe en 2, con lo cual pude analizar mejor, resulta que tenia 2 servicios, A y B, donde A era la cara para los programas clientes y a su vez era cliente de B, y B servia como una capa de persistencia, saben que fue lo importante, solo los programas que actuaban como clientes WCF crecian mucho en memoria, el servicio B no pasaba de los 150MB mientras el servicio A llegaba a los 2GB, como es un servidor 32 bits se moria el servicio por su puesto con un System.OutOfMemoryException, esto claro afectaba la disponibilidad del servicio...

Bien al parecer encontre un patron, iba entonces en busqueda de que era exactamente, busque en foros pero nadie tenia un problema similar, estaba casi por rendirme cuando despues de algunos meses note algo extraño: tenia una laptop nueva con Windows Vista y un beta de Visual Studio 2008, en esa maquina funcionaba mucho mas rapido el cliente y no comia tanta memoria, cual era la diferencia?? En un principio pense que era que Vista al tener el Framework 3.0 como parte del sistema operativo esto hacia que WCF sea mas eficiente, pero habia otro cliente Vista que estaba en un punto mas bien intermedio, un tanto rapido pero normalmente lento, descartando todo tipo de problemas de comunicaciones y hardware, resulta que habia una cosa que no habia tomado en cuenta, el Framework 3.5....

Pero que tenia este que comenzaba a notar mejoría?? Un prerequisito importante, los Service Packs 1 de los Frameworks 2.0 y 3.0!!! Y por si acaso tambien el Framework 3.5 tiene un Garbage Collector nuevo y mejorado!! Investigando un poco mas encontre los Knowledge Base de dichos Service Packs (2.0 http://support.microsoft.com/kb/945757, 3.0 http://support.microsoft.com/kb/945826) y pues ni modo me los lei todo para ver que tanto podian afectar a mi software, pero habia estado probando inconcientemente en el cliente Vista con Framework 3.5 beta, y todo funcionaba ok, asi es que hice un par de pruebas mas y comence a desplegar el Framework 3.5 pero el RTM, tanto en el Servidor como en los clientes, el resultado?? Una espectacular mejora en los tiempos de respuesta, al fin vi mi problema resuelto!!!

Ahora tengan cuidado con el SP1 de Framework 2.0 por que si cambia algunas cosas, si deciden dar el paso pues ejecuten abosultamente todas las pruebas del software de nuevo con Service Pack puesto asi despues no tendran sorpresas de tipo mi codigo no funciona o estaba funcionando y ahora ya no....

Espero que esto les de algo de orientación, a mi me costo meses lidiar con este problema...

2 comments:

Pablo_mhr said...

Nos parece interesante este artículo... tenemos un problema similar con WCF y nos gustaría saber si instalando Framework 3.5 en los Clientes y en el Servidor se soluciona el problema o además hay que tomar en cuenta otras consideraciones. Gracias.

Fco Lomas said...

Hola!! mira en mi experiencia si ha solucionado los problemas de fiabilidad y velocidad, incluso en ambientes de produccion que han estado siendo usados al introducir el framework nuevo todo ha ido bien, yo te recomiendo que pruebes en tu ambiente de desarrollo y te convenceras de que es una solucion, incluiso ya hay un sp1 de framework 3.5 con lo que puedes tener aun mas confianza!