20

(Sorry if this is a really long question, it said to be specific)

The company I work for has a number of sites, which have been running for some time with no problems. The applications are a mix of ASP.NET 2.0, 3.5, and 4.0, all using an ADO.NET to connect to a SQL Server Standard instance (on the same webserver) all being hosted with IIS7.

The problem began when we moved to an upgraded webserver. We made every effort to set up the server, db instance and IIS with the exact same settings (except for the different machine name, and the fact that we had upgraded from SQLExpress to Standard), and as far as we could tell, we did. Both servers are running Windows Server 2008 R2 (all current updates applied), and received a default install.

The problem is very apparent when starting up one of these applications. When you reach the login page of our application, the page itself loads extremely fast. This is true even when you load the page from a new machine that could not possibly have the page cached, with IIS caching disabled. The problem is actually visible when you enter your login information and click the login button. Because of the (not great)design of our databases, the login process must access a number of databases, theoretically up to 150 separate DBs, but in practice usually 2. The problem occurs even when only 2 databases (the minimum) are opened. Not a great design, but we have to live with it for now.

When trying to initially open a connection to the database, the entire process stops for about 20 seconds every time, regardless of whether you are connecting to 2 dbs or 40. I have run a .NET profiler (jetbrains dottrace) against the process, and the only information I could take from it was that one or all of the calls to sqlconnection.open() was accounting for 90% of the time. This only happens on first-use of the application, but the problem is compounded by the fact that IIS seems to disregard the recycling settings we have set for it, and recycles the application after a few minutes of idle, causing the problem to occur again.

I also tried to use the SQL Server profiler to see which database operations were the cause of the slowdown, but because of all the other DB activity, (and the fact that I had to do this on our production server, because the problem doesnt occur in our test environments) I couldn't pin down the exact operation that was causing the stoppage. I will try coming in late at night and shutting down the production sites to run the SQL profiler, but I might not be able to do this right away.

In the course of researching the problem, I have tried a couple solutions

  • Thinking it might be a name resolution problem, I tried modifiying both the hosts file on the webserver as well as giving the connectionstrings an IP address instead of the servername to resolve, with no difference. I have heard of the LLMNR protocol causing problems like this, but I think trying to connect by IP or resolving with the hosts file should have eliminated that possibility, tho i admit I never tried actually turning off LLMNR.

  • I have increased the idle timeouts, recycling intervals etc in IIS, but this doesn't even seem to be respected, much less solving the problem. This leads me to believe there is a setting overriding the IIS application settings on the machine.

  • multiple other code fixes, none of which made any difference. Is a SqlServer setting causing the problem?

  • other stuff that i forgot by now.

Any ideas, experience or whatevers would be greatly appreciated in helping me solve this problem!

hcp
  • 486
  • 1
  • 3
  • 11
  • Have you tried to connect to your old SQLExpress DBs just to see if there was a difference in speed? What about connecting just to 1 db as a test (simple SQL stuff)? – webdad3 Jan 10 '12 at 17:49
  • Unfortunately we don't have the option of connecting to the old instance. Once we got the new server up and working, the old server was formatted and repurposed for something else. Even if the instance still existed, the physical deployment of our system wouldn't allow me to connect to the old server without mucking around in the firewalls on both ends and whatnot. – hcp Jan 10 '12 at 18:07

3 Answers3

20

I would advise using a non-tcp connection if you are still running the SQL instance on the local machine. SQL Server supports several protocols, tcp, named pipes, and shared memory are the more common.

Named Pipes

Data Source=np:computer\instance

Shared Memory

Data Source=lpc:computer\instance

Personally I prefer the Shared Memory. Remember you need to enable these protocols, and to avoid configuration mistakes I suggest you disable all you are not using.

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

IIS Reset

In IIS7 there are two ways to configure the idle-timeout. Both begin by clicking on the "Application Pools" section and right-clicking the appropriate app domain. If you click the "Recycling..." option there is one setting. The other is in "Advanced Settings..." under the section for "Process Model" you will find "Idle Time-out (minutes)" which set to zero disables the process timeout. This later option is the one that works for us.

If I were you I'd solve this problem first as restarting the appdomain and/or worker process is always painful even if you don't have a 20 second lag.

csharptest.net
  • 62,602
  • 11
  • 71
  • 89
1

Some ideas:

  • from the web server, can you ping the db server and get a "normal" response, or are you seeing a similar delay?
  • if you're seeing a delay, run a tracert to see if you can nail down where the slowness is occurring
  • try using a tool like QueryExpress (http://www.albahari.com/queryexpress.aspx) which doesn't require an install to run. You can download this EXE and run it from your web server. See if you can connect to your db using this and run queries in a normal fashion.
  • Try something like SysInternals' TcpView (http://technet.microsoft.com/en-us/sysinternals/bb897437) to take a look at your open connections and see what activity is happening on your server and how much data is being sent to and received from your db server.

Just some initial thoughts on where I'd start to look based upon your problem description. I hope this helps. Good luck with things!

David Hoerster
  • 28,421
  • 8
  • 67
  • 102
  • Well actually, the web server and DB server are one and the same. Atm we are running IIS & connecting to an SQLServer instance on the same machine, so there should be no network traffic involved until the page is served. (there is a locally isolated network for internal traffic for that rack anyways) I tried both your other suggestions anyhow, programs running outside IIS can connect no problem, and there aren't any tcp connections out of the ordinary on inital run, as compared to a "warmed up" run which works properly. – hcp Jan 10 '12 at 18:57
0

With IIS not respecting recycling settings: did restarting IIS/rebooting change the behavior?

Leon
  • 3,311
  • 23
  • 20
  • Multiple times, even restarted and cold-booted the server itself, no change. – hcp Jan 10 '12 at 18:53
  • 1
    You mentioned that SQL Server and IIS are on the same box. Does WMI/Resource monitoring show anything unusual? Do machine config files / website config files have anything unusual (IIS7 and ASP.NET are more coupled than IIS6)? – Leon Jan 10 '12 at 20:39