W tym poście omówię ogólną metodologię rozwiązywania problemów z wydajnością procesora. Lubię domyślnie stosować metodologie, a także lubię zwiększać efektywność rozwiązywania problemów w oparciu o doświadczenia z przeszłości. Bez ogólnych ram zbyt łatwo jest przeoczyć prawdziwą przyczynę w środku kryzysu.
Kroki, które opiszę w tym poście, są następujące:
- Zdefiniuj problem
- Zweryfikuj aktualne warunki
- Odpowiedz „Czy to SQL Server”?
- Zidentyfikuj użytkowników procesora
- Dopasuj wzorzec i rozwiąż
W tym artykule omówimy każdy z tych kroków. Przyjmę założenie, że być może nie korzystasz z narzędzia monitorującego innej firmy. Jeśli jednak tak jest, ramy tutaj nadal obowiązują, ale źródła danych i narzędzia do Twojej dyspozycji będą się różnić od tego, co opisałem.
Zdefiniuj problem
Najpierw musimy zbadać problem. Kiedy ktoś podchodzi do ciebie i mówi, że widzi problem z wydajnością procesora, może to oznaczać wiele różnych rzeczy. Więc pierwszym zadaniem jest zrozumienie, jaki jest obecnie problem z wydajnością procesora.
Niektóre popularne kategorie to:
- Dostępność jest ograniczona ze względu na „pegged CPUs”. Na przykład – wszystkie programy planujące pracujące w 100% na całej planszy, a przepustowość jest zablokowana lub znacznie zmniejszona.
- Spadek wydajności z powodu „wyższego niż normalnie” wykorzystania procesora. Więc nie jesteśmy związani, ale twoje procesory działają z wyższym procentem niż zwykle i prawdopodobnie ma to wpływ na wydajność.
- Inną częstą kategorią problemów z wydajnością procesora jest scenariusz „zwycięzcy i przegrani”, w którym obciążenia konkurują ze sobą. Być może masz obciążenie OLTP, które napotyka zmniejszoną przepustowość z powodu równoległego wykonywania zapytania raportu.
- Innym problemem może być napotkanie punktu krytycznego – w którym w pewnym momencie dochodzi do ograniczenia ogólnej pojemności i skalowalności systemu.
Wspominam te nadrzędne kategorie jako punkt wyjścia, ale wiem, że często mogą istnieć silne zależności między tymi problemami i jedna kategoryzacja może łączyć się z drugą. Mając to na uwadze, pierwszym krokiem jest jak najjaśniejsze zdefiniowanie objawów i problemów.
Zweryfikuj aktualne warunki
Niezależnie od tego, czy problem miał miejsce w przeszłości, czy ma miejsce teraz, ważne jest, aby uzyskać jak najwięcej podstawowych informacji o systemie, obciążeniu pracą i konfiguracjach. Jeśli korzystasz z linii bazowych i run-booków, najlepiej, jeśli już śledzisz większość tych informacji. Jeśli nie, zadaj sobie pytanie, jak szybko możesz uzyskać odpowiedzi na te pytania o 2 w nocy w środku kryzysu.
Poniższe podsekcje obejmują ważne punkty danych, które zwykle mnie interesują w przypadku problemów z wydajnością procesora.
- Ile gniazd i rdzeni?
- Czy funkcja hyper-threading jest włączona?
- Jaki jest model i architektura procesora (32-bit/64-bit)?
- Czy to jest wirtualny gość?
- Jeśli tak, teraz zainteresują Cię również szczegóły dotyczące gospodarza i innych wirtualnych gości, z którymi udostępniasz zasoby.
- Czy obowiązują jakieś ustawienia związane z procesorem?
- Na przykład procesor Hyper-V
- Ile procesorów wirtualnych jest przydzielonych gościom?
- Ile procesorów wirtualnych ma ten gość?
- Czy gość został niedawno przeniesiony do nowego hosta przed problemem?
- Maksymalny stopień ustawienia równoległości
- Próg kosztów dla opcji równoległości
- Ustawienie powinowactwa procesora
- Ustawienie zwiększania priorytetu
- Ustawienie maksymalnej liczby wątków roboczych
- Ustawienie lekkiego łączenia
- Jakie jest ustawienie opcji zasilania? (poziom systemu operacyjnego, host maszyny wirtualnej lub kontrola systemu BIOS)
- Wysoka wydajność, zrównoważony, energooszczędny?
- Czy jest skonfigurowany poza ustawieniami domyślnymi?
- Czy widzisz jakieś nietypowe ostrzeżenia lub błędy?
Fizyczne dane serwera
Szczegóły serwera wirtualnego
Rezerwa, rezerwacja procesora VMware, względna waga procesora Hyper-V i udziały procesora VMware.
Ustawienia konfiguracji instancji SQL Server
Pierwsze trzy konfiguracje mogą wymagać dalszej dyskusji. Rzadko zdarzają się absoluty dotyczące tych ustawień.
Jeśli chodzi o ostatnie trzy ustawienia, takie jak „zwiększenie priorytetu”, jeśli widzę, że mają one wartości inne niż domyślne, zdecydowanie będę naciskać na więcej informacji ogólnych i historii.
Ustawienia opcji zasilania procesora
Ustawienia opcji zasilania poniżej „Wysoka wydajność” są nadal bardzo powszechne i nie należy ich ignorować w przypadku serwerów hostujących instancje SQL Server.
Konfiguracja Resource Governor
Nadal uważam, że rzadko spotyka się klientów korzystających z tej funkcji, ale łatwo jest sprawdzić, czy jest ona używana i czy będzie tego warta w czasach, gdy jest faktycznie skonfigurowana poza domyślną.
Dziennik błędów SQL Server i dzienniki zdarzeń Windows
Po co szukać w dziennikach błędów i zdarzeń problemów z procesorem? Czasami problemy nadrzędne mogą powodować problemy z wydajnością w programie SQL Server. Nie chcesz tracić czasu na dostrajanie zapytania lub dodawanie nowego indeksu, gdy jesteś nadrzędny, ponieważ główną przyczyną problemu jest degradacja komponentów sprzętowych.
Odpowiedz „Czy to SQL Server?”
Brzmi to oczywiste, kiedy o to pytam, ale naprawdę nie chcesz spędzać znacznej ilości czasu na rozwiązywaniu problemów z wysokim procesorem w SQL Server, jeśli winowajcą nie jest w rzeczywistości SQL Server.
Zamiast tego poświęć chwilę, aby sprawdzić, który proces zużywa najwięcej procesora. Do wyboru jest kilka opcji, w tym:
- Proces:% czasu użytkownika (tryb użytkownika)
- Proces:% czasu uprzywilejowanego (tryb jądra)
- Menedżer zadań
- Eksplorator procesów
- Ostatnie informacje o procesorze za pośrednictwem sys.dm_os_ring_buffers lub sesji dotyczącej kondycji systemu dla określonych instancji SQL Server działających w systemie
Jeśli jest to SQL Server i masz do wyboru wiele instancji SQL Server, upewnij się, że rozwiązujesz problem z właściwą instancją SQL Server na hoście. Jest na to kilka sposobów, w tym użycie SELECT SERVERPROPERTY('processid')
aby uzyskać identyfikator PID, a następnie powiązać go z Menedżerem zadań lub Eksploratorem procesów.
Po potwierdzeniu, że jest to SQL Server, czy widzisz długi czas użytkownika lub czas uprzywilejowany (jądra)? Ponownie można to potwierdzić za pomocą procesu:% czasu uprzywilejowanego (obiekt sqlservr), a także Menedżera zadań Windows lub Eksploratora procesów.
Chociaż problemy z wysokim czasem jądra powinny być rzadkie, nadal wymagają innych ścieżek rozwiązywania problemów niż problemy ze standardowym czasem użytkowania procesora. Niektóre potencjalne przyczyny długiego czasu jądra to wadliwe sterowniki filtrów (antywirusy, usługi szyfrowania), nieaktualne lub brakujące aktualizacje oprogramowania układowego i sterowników lub wadliwe składniki we/wy.
Zidentyfikuj użytkowników procesora
Po sprawdzeniu, która instancja programu SQL Server wpływa na wykorzystanie procesora przez użytkownika w systemie, w Internecie dostępnych jest wiele gotowych przykładów zapytań, z których można skorzystać.
Poniżej znajduje się lista DMV, których ludzie często używają w różnych formach podczas problemów z wydajnością. Uporządkowałem to w formacie pytań i odpowiedzi, aby pomóc określić, dlaczego chcesz uzyskać do nich dostęp.
- sys.dm_exec_requests
- sys.dm_exec_sql_text
- sys.dm_exec_sessions
- sys.dm_exec_connections
- sys.dm_exec_query_plan
- sys.dm_os_waiting_tasks
- sys.dm_exec_query_stats
- Agregacja według total_worker_time
- Zdefiniuj średnie za pomocą liczby_wykonań
- Jeśli obciążenia ad hoc, możesz pogrupować według query_hash
- Użyj plan_handle z sys.dm_exec_query_plan, aby pobrać plan
- sys.dm_os_tasks
- Uporządkowane według session_id, request_id
- sys.dm_exec_query_plan
- Spójrz na operatorów planu – ale pamiętaj, że to tylko szacunkowy plan
- sys.dm_exec_query_stats
- Filtruj total_elapsed_time mniej niż total_worker_time
- Pamiętaj jednak, że może to być fałszywie negatywny wynik w przypadku scenariuszy blokujących – w których czas trwania jest zawyżony z powodu oczekiwania na zasób
Jakie żądania są obecnie wykonywane i jaki jest ich status?
Co to jest wykonywanie?
Skąd to jest?
Jaki jest jego szacunkowy plan? (ale uważaj na niszczenie xml w systemie z już ograniczonym procesorem)
Kto czeka na zasób i na co czekają?
Które zapytania zajęły najwięcej czasu procesora od ostatniego restartu?
Czy to zapytanie korzysta z równoległości?
Dopasuj wzorzec i rozwiąż
Prawdopodobnie śmiejesz się z tego konkretnego kroku – ponieważ ten może być najbardziej zaangażowany (i jest to kolejny powód, dla którego profesjonaliści SQL Server są zatrudniani zarobkowo). Istnieje kilka różnych wzorców i związanych z nimi rozdzielczości – więc zakończę ten post listą najczęściej występujących sterowników problemów z wydajnością procesora, które widziałem w ciągu ostatnich kilku lat:
- Wysokie operacje we/wy (i z mojego doświadczenia wynika, że jest to najpopularniejszy sterownik procesora)
- Problemy z oszacowaniem kardynalności (i związana z nimi niska jakość planu zapytań)
- Nieoczekiwany równoległość
- Nadmierna kompilacja / rekompilacja
- Intensywne obliczenia wywołania UDF, operacje niszczenia
- Operacje rzędy po rzędach
- Równoczesne działania konserwacyjne (np. UPDATE statystyk za pomocą FULLSCAN)
Z każdym zidentyfikowanym przeze mnie obszarem wiąże się duża ilość pracy do zbadania. Jeśli chodzi o skonsolidowane zasoby, nadal uważam, że jednym z lepszych jest artykuł techniczny „Rozwiązywanie problemów z wydajnością w SQL Server 2008” napisany przez Sunila Agarwala, Borisa Baryshnikova, Keitha Elmore'a, Juergena Thomasa, Kun Cheng i Burzina Patel.
Podsumowanie
Jak w przypadku każdej metodologii, istnieją granice jej wykorzystania i obszary, w których można improwizować. Pamiętaj, że nie sugeruję, aby kroki opisane w tym poście były używane jako sztywne ramy, ale zamiast tego uważam je za punkt wyjścia do rozwiązywania problemów. Nawet bardzo doświadczeni profesjonaliści SQL Server mogą popełniać błędy początkujących lub być stronniczym przez ich nowsze doświadczenia związane z rozwiązywaniem problemów, więc posiadanie minimalnej metodologii może pomóc w uniknięciu rozwiązania niewłaściwego problemu.