Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Parlare dei colli di bottiglia delle prestazioni di SQL Server

Se gli utenti del database si sono lamentati del fatto che ultimamente le prestazioni di SQL Server siano state scarse, è possibile che tu stia riscontrando gli effetti di uno o più colli di bottiglia di SQL Server. Questi colli di bottiglia si verificano per una serie di motivi, ma spesso si verificano a causa di problemi di memoria, I/O o CPU.

Sebbene non sia sempre facile determinare se i problemi di prestazioni derivano da un collo di bottiglia di SQL Server o da un'altra origine, puoi cercare questi sintomi comuni di colli di bottiglia per restringere la ricerca dell'origine del problema.

Sintomi comuni dei colli di bottiglia di SQL Server

  • SQL Server monopolizza il processore
  • Tempi di esecuzione più lunghi sulle query
  • I/O eccessivi
  • Registro dell'applicazione che mostra i messaggi di memoria insufficiente
  • Attività estrema sui dischi
  • Lunghi tempi di attesa per I/O

La comparsa improvvisa di uno o più di questi sintomi è una buona indicazione della presenza di un collo di bottiglia di SQL Server da qualche parte nel sistema. Ora tocca a te trovarlo.

Tipi di colli di bottiglia di SQL Server

Esistono tre tipi principali di colli di bottiglia di SQL Server:memoria, I/O e CPU. È importante che i DBA conoscano le cause, i sintomi e le soluzioni di ciascuno di essi, in modo da poter identificare e rimuovere rapidamente i colli di bottiglia e ridurre al minimo l'impatto delle scarse prestazioni. Abbiamo anche incluso alcuni dei migliori contatori di prestazioni da monitorare che aiuteranno a identificare immediatamente i colli di bottiglia delle prestazioni.

Colli di bottiglia della memoria

I colli di bottiglia della memoria sono in genere il risultato di risorse di memoria insufficienti o attività di SQL Server che consumano la memoria disponibile. I sintomi a cui prestare attenzione includono tempi di esecuzione delle query più lunghi, I/O eccessivo, messaggi di memoria insufficiente nel registro dell'applicazione e frequenti arresti anomali del sistema.

I modi migliori per evitare i colli di bottiglia relativi alla memoria consistono nell'usare un Query Optimizer per eliminare le query non necessarie o obsolete e nel configurare l'aspettativa di vita della pagina insieme al rapporto di hit della cache del buffer per limitare i viaggi sul disco. Se è troppo tardi per evitare il collo di bottiglia, prova a rivedere e ottimizzare le query, riconfigurare la memoria o aggiungere memoria fisica.

Contatori da monitorare:memoria disponibile, memoria totale del server, memoria del server di destinazione, pagine/sec, percentuale di hit della cache del buffer

Colli di bottiglia I/O

Quando lo spazio di archiviazione disponibile non è sufficiente per supportare le normali operazioni di database come TempDB, è probabile che si verifichino colli di bottiglia di I/O. Tempi di risposta lunghi, rallentamenti delle applicazioni e frequenti timeout delle attività sono tutti indicatori chiave di un collo di bottiglia I/O.

È possibile evitare questo tipo di collo di bottiglia impostando il monitoraggio con allarmi e avvisi di soglia per identificare quali attività utilizzano quantità eccessive di spazio di archiviazione. Se si verifica un collo di bottiglia di I/O, limitare la lettura e la scrittura delle pagine del database da e verso il disco. Ciò richiederà di controllare e correggere frequenti scansioni dell'indice, query inefficienti e statistiche non aggiornate.

Contatori da monitorare:lunghezza media della coda del disco, media del disco in secondi/lettura, media del disco in secondi/scrittura, % del tempo del disco, media delle letture del disco/sec, media delle scritture del disco/sec

Colli di bottiglia della CPU

La causa principale dei colli di bottiglia della CPU è l'insufficienza delle risorse hardware. È abbastanza facile identificare questo collo di bottiglia controllando i log per determinare se SQL Server utilizza una CPU eccessiva.

In un mondo ideale, potresti evitare colli di bottiglia della CPU disponendo di un server dedicato solo per SQL Server ed eseguendo tutto il resto del software su un'altra macchina. Poiché questa non è un'opzione per la maggior parte dei DBA, dovrai sapere come sbloccare la tua CPU.

Il primo passo è identificare i maiali della CPU. Una volta che sai dove si trova il problema, puoi ottimizzare le query, migliorare i tuoi piani di esecuzione o riconfigurare il sistema.

Contatori da monitorare:% tempo processore, richieste batch/sec, compilazioni SQL/sec, ricompilazioni SQL/sec

Una storia sui colli di bottiglia delle prestazioni di SQL Server

"Abbiamo alcuni colli di bottiglia delle prestazioni di SQL Server da affrontare", ha detto il mio capo, un venerdì in ritardo.

"Come lo sai?" ho chiesto.

“Le vendite si lamentano del rallentamento del loro database ultimamente. Dobbiamo vedere cosa sta succedendo."

"OK. Prenoterò una sala conferenze così possiamo sederci e lavorarci su".

"Non preoccuparti", disse il capo. “È tardi di venerdì pomeriggio. Ciò significa che il modo migliore per studiare i colli di bottiglia è con un paio di nostri. Andiamo al Pike Pub nel mercato."

Siamo entrati in un bar nascosto nel mercato di Pike Place e abbiamo trovato un tavolino vicino alla finestra.

"Qual è il tuo tipo preferito di collo di bottiglia?" chiese il capo.

Ho detto che ero parziale per una Nellie cattiva nel collo di bottiglia da 22 once.

«Buona scelta», disse il capo. "Ordinalo e io prenderò la Citrus Summer Ale."

Mentre aspettavamo l'arrivo dei colli di bottiglia, ci siamo messi al lavoro sui colli di bottiglia delle prestazioni di SQL Server.

"Dovremo verificare la presenza di problemi in diversi punti", ha detto il capo. "Potrebbero essere problemi di memoria, storage o processori, ma per gli utenti sembrano tutti uguali, giusto? Performance scadente.

“I problemi con la CPU non sono così difficili da trovare. Se questo è il problema, vedremo che SQL Server sta monopolizzando il processore e causando un picco continuo.

"Se si tratta di un problema di memoria, vedremo cose come tempi di esecuzione più lunghi sulle query e più I/O perché l'applicazione deve continuare a esaurirsi sul disco. Possiamo anche controllare il registro dell'applicazione per i messaggi di memoria insufficiente.

"E se il collo di bottiglia è nello storage, vedremo attività estreme sui dischi e lunghi tempi di attesa per I/O".

I nostri colli di bottiglia sono arrivati. Li abbiamo studiati attentamente mentre consideravamo il problema delle prestazioni in modo più approfondito.

Le molte potenziali origini dei colli di bottiglia delle prestazioni di SQL Server

"E se si tratta di un problema di I/O?" Ho chiesto. “Dovremmo vedere se il tempo di attesa di WRITELOG è troppo alto rispetto al tempo di attesa totale. Oppure, parlando di I/O, forse c'è un problema nell'SQL stesso. Se c'è un codice inefficiente, come un NESTED LOOP JOIN su una tabella enorme, l'SQL potrebbe chiedere di leggere le righe sulla tabella interna miliardi di volte. Ciò punirebbe davvero le prestazioni".

"Potrebbe essere", disse il capo. "Le operazioni di join e di ordinamento complesse possono essere difficili, soprattutto quando il database tempdb non è configurato correttamente. La contesa di Tempdb sembra un normale blocco del database, ma in realtà è una contesa bloccata a causa di processi simultanei che aspettano tutti il ​​loro turno nelle pagine di allocazione."

"Quali strumenti possiamo usare per esaminare tutte queste cose?" ho chiesto.

"SQL Server aveva un profiler per l'esame delle stored procedure, ma è deprecato. Qualcosa del genere è un buon modo per trovare e diagnosticare le query problematiche, anche se è solo il primo passo. Poi ci sono viste e funzioni di gestione dinamica che ti aiutano a monitorare lo stato di salute del tuo server e database, risolvere i problemi e ottimizzare il tuo SQL."

"Ma SQL Server ha così tante parti mobili", ho detto. "Preferirei avere uno strumento che guardi l'intera immagine dall'esterno verso l'interno".

"Anch'io lo farei. Preferibilmente dal cloud, quindi non abbiamo bisogno di più hardware e software in locale per farlo."

Ridurre i colli di bottiglia delle prestazioni in SQL Server

Pike cominciava ad essere affollato. E, per quanto io e il capo fossimo disposti a sederci in un pub e parlare in un negozio, dopotutto era venerdì sera. Avevamo altri posti dove andare, altre persone da vedere e altre cose di cui parlare.

"Cosa dovremmo fare una volta individuati i colli di bottiglia?" ho chiesto.

"Raccogliamo i soliti sospetti", ha detto il capo. “Per evitare di utilizzare troppa memoria, dobbiamo dire agli sviluppatori di database quale codice e query stanno perdendo memoria. Se troviamo operazioni che uniscono quattro, cinque o sei tabelle, dovremo fornire agli sviluppatori alcuni suggerimenti e best practice per l'ottimizzazione di SQL Server per riprogettare il database. Oppure, potremmo avere troppi indici e potremmo sprecare cicli aggiornandoli; è difficile per CPU e I/O come avere troppo pochi indici. Potremmo avere un problema con la frammentazione dell'indice di SQL Server oppure potremmo dover eliminare gli indici obsoleti e duplicati."

«Ha senso», dissi. “Forse abbiamo bisogno di aggiungere più hardware. Dischi più veloci possono aiutare con i colli di bottiglia di I/O. CPU sempre più veloci fanno la differenza nei tempi di risposta alle query. E l'aggiunta di RAM significa maggiore scalabilità di SQL Server, giusto?"

"Sì", ha detto il capo, "ma prima voglio essere sicuro che la causa principale non sia un problema di sviluppo o DevOps. Una volta che sarò convinto che non lo sia, giocherò la scheda Acquista altro hardware."

Ci siamo seduti per un momento e abbiamo guardato il pub riempirsi di festaioli del venerdì sera.

"Capo", ho chiesto, "pensi che tutte queste persone sappiano quanto conducono un'esistenza spensierata, senza l'onere di gestire sessioni bloccate, attesa massima di I/O, aspettativa di vita della pagina e rapporti di hit della cache del buffer?"

"È una croce da portare, vero?" rispose il capo. “La maggior parte delle persone non ha idea di cosa stiamo passando. Meno male che affrontiamo i colli di bottiglia delle prestazioni di SQL Server in modo così silenzioso, con così tanta grazia sotto pressione e con così buon gusto. A proposito di buon gusto, come te la cavi con il collo di bottiglia?"

Ho controllato. “Il mio collo di bottiglia è vuoto. Così è la mia bottiglia."

"Anche il mio. Tempo di andare. Abbiamo del lavoro da fare."

È possibile un sistema a collo di bottiglia Zero SQL Server?

Sappiamo che ci sono passaggi che possiamo adottare per evitare questi tre tipi comuni di colli di bottiglia di SQL Server. Ma è possibile configurare un database SQL Server così bene da non avere colli di bottiglia?

La risposta breve probabilmente non lo è. Anche il DBA più diligente vedrà che di tanto in tanto si verificano colli di bottiglia di SQL Server. Ma puoi adottare misure per evitare in modo proattivo i colli di bottiglia e ridurre al minimo il loro impatto sulle prestazioni. Ad esempio, Brent Ozar offre alcuni ottimi suggerimenti per monitorare i contatori Perfmon per ottimizzare il tuo SQL Server e puoi utilizzare la vista sys.dm_os_performance_counters per identificare i colli di bottiglia e correggerli rapidamente.

I colli di bottiglia di SQL Server sono un dato di fatto della vita del DBA. Fortunatamente, con un'adeguata supervisione, un monitoraggio diligente e una frequente ottimizzazione delle query, i problemi di prestazioni possono essere risolti prima ancora che gli utenti si accorgano che c'è un problema.