2009-10-29 14 views
9

Il nostro sito funziona bene per il 90% del giorno, quindi durante le ore di punta quando il traffico è circa il doppio del normale, tutto rallenta a passo d'uomo. I tempi di caricamento delle pagine normalmente sono di 1 secondo e durano 30 secondi. Controllando i nostri log degli errori, sembra che potrebbe esserci un problema con il pool di connessioni. Abbiamo 3 server Web collegati a 1 sql server db. Il server SQL sta volando con meno del 25% di utilizzo su tutti i core.Il periodo di timeout è trascorso prima di ottenere una connessione dal pool

Osservo il contatore di Connessioni utente sul nostro server SQL e vediamo che durante il nostro picco abbiamo 400 + connessioni utente, ma fuori orario è di circa 120+.

Sono sicuro che stiamo usando solo le impostazioni predefinite di MS per gestire il nostro pool di app. Cosa posso fare per testare per vedere se c'è un problema con il pool di app? Quali sono i lati negativi dell'aumento delle dimensioni del pool di applicazioni a 1000 (e come faccio a farlo?).

Grazie!

+0

Quali versioni di ASP.Net e SqlServer? – zendar

+4

quando ho letto per la prima volta la riga dell'oggetto, ho pensato che fossi un bagnino. – Jason

risposta

7

Questo potrebbe essere correlato alle connessioni sql non correttamente disposte (restituite al pool). Assicurati di chiamare SqlConnection.Dispose.

+0

+1: Stesso pensiero. – Arthur

+2

Oppure disporre implicitamente mettendo la connessione in 'using() {...}' costruzione. –

+0

Nel mio caso, non stavo chiudendo la connessione. – Mahmoodvcs

5

questo potrebbe essere perché il pool di connessioni SQL è esaurito (questo è diverso dal pool di app.) È possibile verificare che increasing the pool size attraverso la stringa di connessione:

Integrated Security=SSPI;Initial Catalog=northwind;Max Pool Size=100; 

Ma più probabilmente, il database può 'tenere il passo con il flusso di domande in arrivo. Questo fa sì che le connessioni siano in attesa della fine della query. L'aggiunta di più connessioni consentirà di evitare richieste di burst, ma non di mantenere un traffico elevato e sostenuto.

Ecco alcuni suggerimenti per migliorare le prestazioni del vostro SQL Server sotto continuo carico elevato:

  • hardware Gettare il problema (in particolare RAM sul SQL Server)
  • Fissare SQL Server Profiler per il server, ottenere una traccia di un periodo ad alto carico, e seguire i suoi indici suggeriti
  • Dal registro di traccia, esaminare l'esecuzione di query lunghe, e migliorare quelli insieme ad uno sviluppatore di T-SQL

Buona fortuna, queste cose possono essere piuttosto complesse!

15

Nella mia esperienza ci sono 3 tipi principali di timeout è possibile ricevere da SQL Server:

1) InvalidOperationException - Un guasto per il cliente di ottenere una connessione di pool da una propria piscina prima il timeout specificato sul comando stringa (predefinito 15 secondi). Il pool del client ha le dimensioni massime e tutte le connessioni in pool sono in uso e rimangono in uso prima che scada il timeout.

2) SQLException - Timeout connessione. Il pool di connessioni del client sta creando una nuova connessione al database, ma il database non risponde prima del timeout specificato nella stringa di comando (predefinito 15 secondi).

3) SQLException - Timeout comando. È stata ottenuta una connessione, ma il tempo impiegato dall'istruzione SQL per esercitare il comando ha superato il timeout specificato nella proprietà CommandTimeout del comando (valore predefinito 30 secondi)


Le circostanze di un server che si sta comportando normalmente fino a quando non viene caricato il carico suona come il caso # 1. Ho trovato che i timeout arrivano molto velocemente, in genere 2 secondi.

Ho trovato la soluzione a questo è di aumentare i thread massimi in SQL Server. Il valore predefinito è zero - lascia decidere a SQL Server. Ho visto casi in cui un server stout si trova con poca risorsa mentre si è limitato assegnando troppi thread.

è possibile aumentare i fili max impostazione con questo Transact-SQL:

sp_configure 'max worker threads', 8192 
go 
Reconfigure 

Quindi, riavviare il servizio SQL.

proposito, si può vedere quante discussioni sono attualmente assegnati da SQL Server con questo comando:

select sum(current_workers_count) from sys.dm_os_schedulers 

Questa impostazione filettatura fa una differenza enorme nel modo in cui SQL Server esegue in molte connessioni. SQL Server diventa molto insensibile una volta esaurito i thread.

1

Quando ho ricevuto questo errore:

The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached

era dovuto al fatto che stavo usando il metodo SqlCommand.ExecuteQuery() anziché SqlCommand.ExecuteNonQuery().

Ad esempio: Il mio invito procdure memorizzato originale simile a questa:

using (SqlCommand cmd = new SqlCommand()) 
{ 
    cmd.CommandType = System.Data.CommandType.StoredProcedure; 
    cmd.CommandText = "InsertSproc"; 
    cmd.Parameters.AddWithValue("@Value", myValue); 
    cmd.Parameters.AddWithValue("@LoggedDate", myDate); 
    DatabaseManager.instance.ExecuteQuery(cmd); 
} 

Il codice di cui sopra è quello che ha generato l'eccezione. Tuttavia, cambiando la chiamata a utilizzare ExecuteNonQuery() ha risolto il problema:

using (SqlCommand cmd = new SqlCommand()) 
{ 
    cmd.CommandType = System.Data.CommandType.StoredProcedure; 
    cmd.CommandText = "InsertSproc"; 
    cmd.Parameters.AddWithValue("@Value", myValue); 
    cmd.Parameters.AddWithValue("@LoggedDate", myDate); 
    DatabaseManager.instance.ExecuteNonQuery(cmd); 
} 
1

ho avuto questo problema con PowerShell e back to back query (invoke-sqlcmd seguita da un'altra invoke-sqlcmd). Entrambe le domande riguardavano modifiche dei dati. Risolto aggiungendo -connectiontimeout 1 alla chiamata parametro.

Esempio:

invoke-sqlcmd "insert into testdb..tab1 (cname) select 'x'" -connectiontimeout 1 
invoke-sqlcmd "update testdb..tab1 set ctr=ctr+1 where cname='aaa'" 

Lunghezza di timeout può variare a seconda del numero di righe interessate.

Problemi correlati