+34 911 599 883

+34 911 895 172

Depurar programa asp classic 2.0 y problema de conexion SQL server

 

 

La semana pasada nos llamó un cliente pidiendonos depurar una aplicación realizada con ASP 2.0, era una aplicación que nosotros no habíamos realizado, llevaba años funcionando sin problemas pero desde hacía varios días no funcionaba correctactamente.

La app generaba un fichero en EXCEL a partir de los datos diarios de una tabla de SQL server, y esa tabla en los últimos días había crecido de manera considerable.

Nos encontrabamos ante un reto importante.

Lo primero que hicimos fue un fichero de LOG para poder debugear los datos del fichero ASP e intentar llegar a dónde la aplicación dejaba de funcionar:

dim fs,f
set fs=Server.CreateObject(“Scripting.FileSystemObject”)
set f=fs.OpenTextFile(Server.MapPath(“log.txt”),8,true)

En el que fuimos guardando los datos de las variables de la ejecución:

f.Write (“Salede la funcion con valor: “)
f.WriteLine lstValores

Con ello nos dimos cuenta de que siempre daba error cuando psaba por un bucle principal de ejecución, en las vueltas 5037 y a veces en la 5038.

Comprobamos que no era un error de forma de datos, cambiando los datos de la tabla por otros ocurría lo mismo, parecía un error de memoria o de conexiones.

Modificamos el código justo donde fallaba, para saltarnos unas conexiones que no parecían usarse y conseguimos solucionar de manera temporal el marrón, sin tener la certeza del origen del problema ni su solución definitiva, pero el fichero Excel ya estaba generado.

Revisamos el código ASP que había realizado la otra empresa, y no cerraba nunca conexiones ni reutilizaba conexiones.

Además de que mucho del código podría realizarse con procedimientos almacenados, pero no había tiempo para estas modificaciones.

Con netstat en el servidor web y SQL que era el mismo,  detectamos el origen del problema: se llegaba al límite de conexiones TCP al servidor y por eso la aplicación fallaba.

Lo mejor hubiera sido rehacer el código entero de la aplicación, pero no es lo más barato ni rápido para el cliente, por eso optamos por ampliar el número de conexiones.

Con el “show” obtienes la configuración y con el “set” la estableces

netstat

y en REGEDIT reducir el tiempo que están reservadas las conexiones en el servidor

Reduce the TIME_WAIT by setting the TcpTimedWaitDelay TCP/IP parameter to 30 seconds on the windows registry key HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters, as a DWORD value.

Increase the range of ephemeral ports by setting the dynamicportrange to an higher value through the command netsh int ipv4 set dynamicportrange tcp start=32767 num=65535, this will set the port range from 32768 to 65535.

Fuentes:

http://blogs.msdn.com/b/snehadeep/archive/2009/04/28/connection-leak-its-symptoms-and-troubleshooting.aspx

https://www.outsystems.com/forums/discussion/6956/how-to-tune-the-tcp-ip-stack-for-high-volume-of-web-requests/

http://technet.microsoft.com/en-us/library/cc938217.aspx

http://technet.microsoft.com/en-us/library/cc938178.aspx