2012-01-10 14 views
15

(Disculpe si esta es una pregunta muy larga, dijo que es específica)ASP.NET 2.0-4.0 Aplicaciones web que experimentan una puesta en marcha inicial extremadamente lenta.

La empresa para la que trabajo tiene una serie de sitios, que han estado funcionando durante algún tiempo sin problemas. Las aplicaciones son una mezcla de ASP.NET 2.0, 3.5 y 4.0, todas usan ADO.NET para conectarse a una instancia de SQL Server Standard (en el mismo servidor web), todas alojadas con IIS7.

El problema comenzó cuando nos cambiamos a un servidor web actualizado. Hicimos todo lo posible para configurar el servidor, db instance e IIS con la misma configuración exacta (excepto por el nombre de la máquina diferente, y el hecho de que habíamos actualizado de SQLExpress a Standard), y por lo que pudimos ver, lo hicimos . Ambos servidores ejecutan Windows Server 2008 R2 (se aplicaron todas las actualizaciones actuales) y recibieron una instalación predeterminada.

El problema es muy evidente al iniciar una de estas aplicaciones. Cuando llegue a la página de inicio de sesión de nuestra aplicación, la página en sí misma se carga extremadamente rápido. Esto es cierto incluso cuando carga la página desde una máquina nueva que no podría tener la página en caché, con el almacenamiento en caché de IIS deshabilitado. El problema es realmente visible cuando ingresa su información de inicio de sesión y hace clic en el botón de inicio de sesión. Debido al diseño (no excelente) de nuestras bases de datos, el proceso de inicio de sesión debe acceder a una serie de bases de datos, teóricamente hasta 150 DB separadas, pero en la práctica generalmente 2. El problema ocurre incluso cuando solo se abren 2 bases de datos (el mínimo). No es un gran diseño, pero tenemos que vivir con eso por ahora.

Al tratar de abrir inicialmente una conexión a la base de datos, todo el proceso se detiene durante unos 20 segundos cada vez, independientemente de si se está conectando a 2 dbs o 40. He ejecutado un .NET profiler (jetbrains dottrace) contra el proceso, y la única información que podía tomar de él era que una o todas las llamadas a sqlconnection.open() representaban el 90% del tiempo. Esto solo ocurre con el primer uso de la aplicación, pero el problema se agrava por el hecho de que IIS parece ignorar las configuraciones de reciclaje que le hemos asignado, y recicla la aplicación después de unos minutos de inactividad, causando que el problema vuelva a ocurrir .

También traté de usar el perfilador de SQL Server para ver qué operaciones de la base de datos causaron la desaceleración, pero debido a todas las otras actividades de la base de datos (y el hecho de que tuve que hacerlo en nuestro servidor de producción, el problema no ocurre en nuestros entornos de prueba) No pude precisar la operación exacta que estaba causando la interrupción. Trataré de llegar tarde a la noche y de cerrar los sitios de producción para ejecutar el generador de perfiles SQL, pero es posible que no pueda hacerlo de inmediato.

En el curso de la investigación del problema, he intentado un par de soluciones

  • Pensando que podría ser un problema de resolución de nombres, he intentado modifiying tanto el archivo hosts en el servidor web, así como dar las connectionStrings una dirección IP en lugar del nombre del servidor para resolver, sin diferencias. He oído que el protocolo LLMNR causa problemas como este, pero creo que tratar de conectarme por IP o resolver con el archivo hosts debería haber eliminado esa posibilidad, aunque admito que nunca intenté desconectar LLMNR.

  • He aumentado los tiempos de espera inactivos, los intervalos de reciclaje, etc. en IIS, pero esto ni siquiera parece respetarse, y mucho menos resolver el problema. Esto me lleva a creer que hay una configuración que anula la configuración de la aplicación IIS en la máquina.

  • muchas otras correcciones de código, ninguna de las cuales marcó la diferencia. ¿La configuración de SqlServer está causando el problema?

  • otras cosas que olvidé por ahora.

¡Cualquier idea, experiencia o lo que sea será muy apreciada para ayudarme a resolver este problema!

+0

¿Has intentado conectarte a tus antiguos SQLExpress DBs solo para ver si había una diferencia de velocidad? ¿Qué hay de conectar solo a 1 db como prueba (cosas simples de SQL)? – webdad3

+0

Desafortunadamente no tenemos la opción de conectarnos a la instancia anterior. Una vez que tenemos el nuevo servidor funcionando, el viejo servidor se formateó y reutilizó para otra cosa.Incluso si la instancia aún existiera, la implementación física de nuestro sistema no me permitiría conectarme al servidor anterior sin tener que pasar por los servidores de seguridad en ambos extremos y todo eso. – Caleb

Respuesta

16

Aconsejaría utilizar una conexión que no sea de tcp si aún está ejecutando la instancia de SQL en la máquina local. SQL Server admite varios protocolos, tcp, pipes nombrados y memoria compartida son los más comunes.

canalizaciones con nombre

Data Source=np:computer\instance 

memoria compartida

Data Source=lpc:computer\instance 

personalmente prefiero la memoria compartida. Recuerde que necesita habilitar estos protocolos y para evitar errores de configuración. Le sugiero que desactive todo lo que no esté usando.

ver http://msdn.microsoft.com/en-us/library/ms187892.aspx

IIS Reiniciar

En IIS7 hay dos maneras de configurar el ocioso-descanso. Ambos comienzan haciendo clic en la sección "Grupos de aplicaciones" y haciendo clic con el botón derecho en el dominio de la aplicación correspondiente. Si hace clic en la opción "Reciclar ..." hay una configuración. El otro está en "Configuración avanzada ..." en la sección de "Modelo de proceso" encontrará "Tiempo de espera inactivo (minutos)" que al poner a cero inhabilita el tiempo de espera del proceso. Esta última opción es la que funciona para nosotros.

Si yo fuera usted resolvería este problema primero, ya que reiniciar el dominio de aplicación y/o el proceso de trabajo siempre es doloroso, incluso si no tiene un retraso de 20 segundos.

1

Algunas ideas:

  • desde el servidor web, puede hacer ping al servidor db y obtener una "normal" respuesta, o está viendo un retraso similar?
  • Si ve un retraso, ejecute un tracert para ver si puede determinar dónde está ocurriendo la lentitud
  • intente utilizar una herramienta como QueryExpress (http://www.albahari.com/queryexpress.aspx) que no requiere una instalación para ejecutarse. Puede descargar este EXE y ejecutarlo desde su servidor web. Vea si puede conectarse a su base de datos usando esto y ejecutar consultas de manera normal.
  • Pruebe algo como SysInternals 'TcpView (http://technet.microsoft.com/en-us/sysinternals/bb897437) para echar un vistazo a sus conexiones abiertas y ver qué actividad está sucediendo en su servidor y la cantidad de datos es siendo enviado y recibido desde su servidor db.

Solo algunas ideas iniciales sobre dónde empezaría a buscar en función de la descripción de su problema. Espero que esto ayude. Buena suerte con las cosas!

+0

Bueno, en realidad, el servidor web y el servidor de bases de datos son lo mismo. Atm ejecutamos IIS y nos conectamos a una instancia de SQLServer en la misma máquina, por lo que no debería haber tráfico de red involucrado hasta que se publique la página. (de todos modos hay una red localmente aislada para tráfico interno para ese rack) Probé las otras dos sugerencias, los programas que se ejecutan fuera de IIS no pueden conectarse, y no hay conexiones tcp fuera de lo común en la ejecución inicial, en comparación a una ejecución "calentada" que funciona correctamente. – Caleb

0

Con IIS no respetando las configuraciones de reciclaje: ¿el reinicio de IIS/reinicio cambió el comportamiento?

+0

Varias veces, incluso reiniciar y arrancar en frío el servidor en sí, sin cambios. – Caleb

+1

Mencionó que SQL Server e IIS están en el mismo cuadro. ¿El monitoreo WMI/Resource muestra algo inusual? ¿Los archivos de configuración de máquina/archivos de configuración del sitio web tienen algo inusual (IIS7 y ASP.NET están más acoplados que IIS6)? – Leon

Cuestiones relacionadas