Tengo un .NET 4.0 Winform y un .NET 4.0 Windows Service que se conectan a una base de datos SQL 2005/2008 a través de LINQ to SQL. Funciona bien y rápido en nuestro entorno de prueba con un clon perfecto de datos de producción, pero en el entorno de producción, se ejecuta muy lentamente y tiene un bajo uso de CPU y uso de ancho de banda. También noté cientos de tiempos de espera de SQL al día, incluso para las consultas más pequeñas en una base de datos bien indexada. Así que dispararon hasta el Analizador ...Linq-to-SQL y sp_reset_connection
encontré que sp_reset_connection representaron un tercio de la duración total de la CPU de SQL y el 90% de todas las llamadas totales SQL durante una captura de 10 minutos bajo carga.
- He intentado desactivar & que permite la agrupación de conexiones y jugando con el número de conexiones permitidas y los tiempos de espera de conexión en la cadena de conexión. Ninguno ha tenido ningún efecto.
- He estado reemplazando mis consultas LINQ con consultas ADO.NET a medida que las encuentro. Estas antiguas consultas de ADO.NET nunca agotan el tiempo de espera. Solo los LINQ.
- He notado otros problemas importantes de rendimiento en ese servidor, pero no estoy seguro de cómo abordar el tema con el administrador del sistema del cliente.
Tengo acceso de administrador en el servidor de aplicaciones donde se ejecuta el servicio. Tengo casi ningún acceso en el servidor de terminal donde ejecutan el Winform, ni al servidor SQL.
¿Cuál es la causa de que sp_reset_connection funcione tan a menudo?
- ¿Hay alguna forma de eludir estas llamadas sin arrancar todo el LINQ de mi aplicación?
- ¿Hay alguna forma de reducir el número de llamadas a este procedimiento almacenado?
- ¿Hay alguna forma de reducir la cantidad de tiempo de procesador que el servidor SQL necesita para estas llamadas?
- ¿Desbarataré algo más si dejo la agrupación deshabilitada y reemplace ese proc almacenado con, por ejemplo, uno vacío?
Aparecerían problemas de contexto de datos 'sp_reset_connection' después de cada comando dentro del bloque' using', a menos que abriera la conexión manualmente (eso es algo que nunca hice porque era contrario a la intuición) o tiene una transacción ambiental (que Siempre lo hice, así que funcionó para mí y ni siquiera me di cuenta por qué). ¿Puedes dar un enlace a "algunas otras páginas"? Me gustaría algo de documentación sobre ese comportamiento. – GSerg