High Disk I / O z serwera sql czy może High Disk I / O spowalnia serwer sql?

18

Kłóciłem się z DBA i kilkoma facetami od sprzętu o problemy z wydajnością na naszym serwerze SQL. Normalnie wszystko jest w porządku, jednak w ciągu ostatnich kilku tygodni mieliśmy ogromne opóźnienia w serwerze SQL. Oczywiste jest, że SQL Server czeka na dysku we / wy. Ale ciągle słyszę, że to dlatego, że SQL Server prosi o nienormalnie wysokie operacje we / wy. Tak nie jest. Z tego, co się dzieje, widzę, że nie ma nic nienormalnego, a wszystkim, na co DBA patrzy, jest to, co powoduje blokowanie i tak dalej, co jest bezużyteczne. Na przykład najważniejszą rzeczą, którą widzimy podczas tworzenia kopii zapasowej, jest działanie w bazie danych ASPState, której używamy do zarządzania stanem sesji ASP na serwerach internetowych. Operacje te zwykle nie są widoczne dla aktywnych wyników Sp_who2, ponieważ występują tak szybko. Baza danych znajduje się w prostym trybie odzyskiwania, a rejestrowanie jest nielegalne. Jednak podczas tych skoków opóźnienia widzimy wiele operacji wyboru i aktualizacji bazy danych, które są blokowane lub czekają. Jestem pewien, że dzieje się tak, że ktoś lub jakieś zadanie wykonuje coś, co powoduje ciężkie użycie dysku w macierzach RAID używanych dla dzienników baz danych i plików danych. Problem polega na tym, że nikt nie chce przyznać, że robi coś, co zabija naszą stronę internetową.

Moje pytanie dotyczy tego, jakie liczniki wydajności lub cokolwiek mogę zarejestrować, co pomoże pokazać, że serwer SQL czeka na operacje we / wy, ale nie dlatego, że prosi o więcej niż normalnie, ponieważ dysk jest zajęty, aby odpowiedzieć na żądania serwera SQL tak szybko jak zwykle?

Edgey
źródło
3
Jaki stan oczekiwania faktycznie widzisz, sieciowe operacje we / wy? tzn. czy używasz SAN?
Eric Higgins,
Sprawdź, czy masz jakieś zapytania, które dominują w wykorzystaniu zasobów na serwerze DB. Jeśli tak, spróbuj je dostroić. Jeśli nie masz żadnych źle zachowujących się zapytań, wysoki czas oczekiwania na PAGEIOLATCH zazwyczaj wskazuje, że Twój system jest związany z operacjami we / wy. Ponadto, jak mówi @EricHiggins, sieci SAN często działają wolno i powodują problemy z wydajnością baz danych.
ConcernedOfTunbridgeWells
Jest to macierz NETAPP połączona z serwerem SQL za pomocą światłowodowych kart HBA Qlogic.
Edgey
Wiem, że jest to stosunkowo stare pytanie, które nie rozwiąże problemu bezpośrednio ... ale przełączyliśmy się na aspnet_state.exe dla stanu sesji i zobaczyliśmy duże obciążenie naszego SQL Servera. Nie jest dobrze udokumentowany, ale dość łatwy w konfiguracji.
MattGWagner
Więc co zrobiłeś / DBA i co było problemem?
Mukus

Odpowiedzi:

19

Spójrz na następujące liczniki perfmon:

Program SQL Server sterujący dużą liczbą żądań We / Wy zostałby potwierdzony skanowaniem dużej liczby, wzrostem liczby wyszukiwań stron i odczytów stron oraz oczekiwaniem na zatrzaśnięcie We / Wy strony. Warto spojrzeć na sys.dm_exec_query_statswpisy o wysokiej liczbie odczytów fizycznych. Mogą szybko wskazać winowajcę.

Zasadniczo podejście do problemu jako do rozwiązania problemu z wydajnością, właściwe jest zastosowanie metodologii takiej jak oczekiwania i kolejki . Ty, DBA, wydajesz się postępować właściwie, więc powinieneś go słuchać.

Remus Rusanu
źródło
Nie mam problemu z DBA, on jest jednym z najlepszych DBA, z którymi pracowałem. I dał mi listę procedur blokujących o wysokim stopniu blokowania. Ale jak wspomniałem, jednym z procesów, który powoduje wiele blokowania, jest „TempUpdateStateItemLong”, który jest procem używanym przez magazyn stanów sesji SQL. Jest to procesor MS i aktualizuje tylko jedną tabelę według sessionID, który jest indeksowanym kluczem podstawowym w tabeli. Również co najwyżej ta tabela zawiera 2000-3000 rekordów, więc aktualizacje naprawdę nie powinny zająć żadnego czasu.
Edgey
To dobre miejsce na początek. Nadal korzystamy z programu SQL Server 2000, jesteśmy w trakcie aktualizacji, ale nie stanie się to jeszcze przez kilka miesięcy, więc nie mam czekania na PAge IO Latch. Dzięki jeszcze raz.
Edgey
Należy pamiętać, że samo blokowanie nie oznacza wysokiego IO. Może to być rywalizacja o blokadę, co wpłynęłoby na tabelę bez względu na rozmiar, szczególnie jeśli optymalizator wybierze plan oparty na skanowaniu tabeli.
Remus Rusanu
A także sprawdzić proces za IO Data Bytes/seci sprawdzić, czy jakiś inny proces zaśmiecać dysku.
Remus Rusanu
12

Aby zacząć korzystać z zapytań diagnostycznych Glenna Berry'ego i SP_Whoisactive Adama Machanica, aby dowiedzieć się, co się naprawdę dzieje.

Najpierw sprawdź, które pliki bazy danych mają najwięcej wąskich gardeł we / wy, uruchamiając to zapytanie (zapytanie Glenna Berry'ego)

SELECT  DB_NAME(fs.database_id) AS [Database Name] ,
        mf.physical_name ,
        io_stall_read_ms ,
        num_of_reads ,
        CAST(io_stall_read_ms / ( 1.0 + num_of_reads ) AS NUMERIC(10, 1)) AS [avg_read_stall_ms] ,
        io_stall_write_ms ,
        num_of_writes ,
        CAST(io_stall_write_ms / ( 1.0 + num_of_writes ) AS NUMERIC(10, 1)) AS [avg_write_stall_ms] ,
        io_stall_read_ms + io_stall_write_ms AS [io_stalls] ,
        num_of_reads + num_of_writes AS [total_io] ,
        CAST(( io_stall_read_ms + io_stall_write_ms ) / ( 1.0 + num_of_reads
                                                          + num_of_writes ) AS NUMERIC(10,
                                                              1)) AS [avg_io_stall_ms]
FROM    sys.dm_io_virtual_file_stats(NULL, NULL) AS fs
        INNER JOIN sys.master_files AS mf WITH ( NOLOCK ) ON fs.database_id = mf.database_id
                                                             AND fs.[file_id] = mf.[file_id]
ORDER BY avg_io_stall_ms DESC
OPTION  ( RECOMPILE );

Następnie uruchom to zapytanie, aby zobaczyć dziesięć najważniejszych zdarzeń, na które czeka Twój serwer (zapytanie Jonathana Kehayiasa ). Podobne zapytanie znajdziesz również w zapytaniach diagnostycznych Glenn Berry.

SELECT TOP 10
        wait_type ,
        max_wait_time_ms wait_time_ms ,
        signal_wait_time_ms ,
        wait_time_ms - signal_wait_time_ms AS resource_wait_time_ms ,
        100.0 * wait_time_ms / SUM(wait_time_ms) OVER ( ) AS percent_total_waits ,
        100.0 * signal_wait_time_ms / SUM(signal_wait_time_ms) OVER ( ) AS percent_total_signal_waits ,
        100.0 * ( wait_time_ms - signal_wait_time_ms )
        / SUM(wait_time_ms) OVER ( ) AS percent_total_resource_waits
FROM    sys.dm_os_wait_stats
WHERE   wait_time_ms > 0 -- remove zero wait_time
        AND wait_type NOT IN -- filter out additional irrelevant waits
( 'SLEEP_TASK', 'BROKER_TASK_STOP', 'BROKER_TO_FLUSH', 'SQLTRACE_BUFFER_FLUSH',
  'CLR_AUTO_EVENT', 'CLR_MANUAL_EVENT', 'LAZYWRITER_SLEEP', 'SLEEP_SYSTEMTASK',
  'SLEEP_BPOOL_FLUSH', 'BROKER_EVENTHANDLER', 'XE_DISPATCHER_WAIT',
  'FT_IFTSHC_MUTEX', 'CHECKPOINT_QUEUE', 'FT_IFTS_SCHEDULER_IDLE_WAIT',
  'BROKER_TRANSMITTER', 'FT_IFTSHC_MUTEX', 'KSOURCE_WAKEUP',
  'LAZYWRITER_SLEEP', 'LOGMGR_QUEUE', 'ONDEMAND_TASK_QUEUE',
  'REQUEST_FOR_DEADLOCK_SEARCH', 'XE_TIMER_EVENT', 'BAD_PAGE_PROCESS',
  'DBMIRROR_EVENTS_QUEUE', 'BROKER_RECEIVE_WAITFOR',
  'PREEMPTIVE_OS_GETPROCADDRESS', 'PREEMPTIVE_OS_AUTHENTICATIONOPS', 'WAITFOR',
  'DISPATCHER_QUEUE_SEMAPHORE', 'XE_DISPATCHER_JOIN', 'RESOURCE_QUEUE' )
ORDER BY wait_time_ms DESC

Gdy będziesz mieć te informacje pod ręką, znacznie łatwiej będzie rozwiązać problem.

BTW możesz znaleźć wiele postów na temat używania sp_whoisactive do rozwiązywania problemów tutaj.

DaniSQL
źródło
1
Właśnie użyłem ostatniego skryptu z tej listy - jego dupka.
the_good_pony