Dziwny problem z wydajnością w SQL Server 2016

14

Mamy jedno wystąpienie SQL Server 2016 SP1 działające na maszynie wirtualnej VMware. Zawiera 4 bazy danych, każda dla innej aplikacji. Wszystkie te aplikacje znajdują się na osobnych serwerach wirtualnych. Żadne z nich nie jest jeszcze w użyciu produkcyjnym. Osoby testujące aplikacje zgłaszają jednak problemy z wydajnością.

Oto statystyki serwera:

  • 128 GB pamięci RAM (maks. 110 GB pamięci dla programu SQL Server)
  • 4 rdzenie @ 4,6 GHz
  • Połączenie sieciowe 10 GBit
  • Cała pamięć jest oparta na dyskach SSD
  • Pliki programów, pliki dziennika, pliki bazy danych i tempdb znajdują się na osobnych partycjach serwera
  • asd

Użytkownicy wykonują dostęp do pojedynczego ekranu za pośrednictwem aplikacji ERP opartej na C ++.

Kiedy przeprowadzam test warunków skrajnych SQL Servera z Microsoftem za ostresspomocą wielu małych zapytań lub dużych zapytań, uzyskuję maksymalną wydajność. Jedynym ograniczeniem jest klient, ponieważ nie może wystarczająco szybko odpowiedzieć.

Ale kiedy prawie nie ma użytkowników, SQL Server prawie nic nie robi. Jednak ludzie muszą czekać wiecznie, aby zapisać wszystko w aplikacji.

Według zapytania Paula Randala „ Powiedz mi, gdzie boli ” 50% wszystkich zdarzeń oczekiwania ASYNC_NETWORK_IO.

Może to oznaczać albo problem z siecią, albo problem z wydajnością serwera aplikacji lub klienta. Żadne z nich nie wykorzystuje nawet swoich zasobów przy maksymalnej wydajności. Przez większość czasu procesor wynosi około 26% na wszystkich komputerach (klient, serwer, serwer db).

Opóźnienie połączenia sieciowego wynosi około 1-3 ms. IO serwera db ma maksymalną prędkość zapisu 20 MB / s podczas normalnego użytkowania z aplikacją (średnio 7-9 MB / s). Kiedy przeprowadzam test warunków skrajnych, uzyskuję około 5 GB / s.

Rozmiar bufora pamięci podręcznej wynosi 60 GB dla bazy danych naszego systemu ERP, 20 GB dla naszego oprogramowania finansowego, 1 GB dla oprogramowania do kontroli jakości, 3 GB dla systemu archiwizacji dokumentów.

Dałem konto SQL Server prawo do natychmiastowej inicjalizacji plików . To w żaden sposób nie zwiększyło wydajności.

Oczekiwana długość życia strony wynosi około 15 000+ podczas normalnego użytkowania. W trakcie ciężkich testów wytrzymałościowych spada do około 0,05 tys., Czego należy się spodziewać. Liczba partii na sekundę wynosi około 2-8 tys., W zależności od obciążenia pracą.

Powiedziałbym, że aplikacja ERP jest po prostu źle napisana, ale nie mogę, ponieważ dotyczy to wszystkich aplikacji. Nawet przy minimalnym obciążeniu.

Jednak nie potrafię wskazać, co to powoduje. Czy są jakieś wskazówki, samouczki ze wskazówkami, aplikacje, dokumenty najlepszych / najgorszych praktyk lub cokolwiek innego, co macie na myśli w związku z tym problemem?

Są to wyniki z sp_BlitzFirst:

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

Uruchomiłem to 600 sekund. Zacząłem to podczas dużego obciążenia aplikacji. 1/3 tego czasu ASYNC_NETWORK_IO. Ja również przetestowane połączenie sieciowe z NTttcp, PsPing, ipferf3, i pathping. Nic niezwykłego. Czasy odpowiedzi wynoszą maksymalnie 3 ms, średnio 0,3 ms. Przepustowość wynosi około 1000 MB / s.

Moje dochodzenie zawsze ASYNC_NETWORK_IOkończy się na tym, że jestem numerem jeden.

Zbadaliśmy rezultat wyłączenia tej Large-Receive-Offloadfunkcji w VMware. Wciąż testujemy, ale wyniki wydają się niespójne. Nasz pierwszy „test porównawczy” trwał 19 minut (najwyższy wynik to 13 minut, który osiąga się tylko wtedy, gdy aplikacja działa na maszynie wirtualnej z samym serwerem SQL Server). Drugi wynik to 28 minut, co jest naprawdę złe.

Pierwszy wynik naszego „testu porównawczego” wynosił 19 minut. Który jest dobry. Ponieważ najwyższy wynik wynosił 13 minut (co można osiągnąć tylko wtedy, gdy aplikacja porównuje wyniki na maszynie wirtualnej z samym serwerem SQL Server). To mocno wskazuje na problem związany z siecią. Lub problem z konfiguracją VMware.

Obecnie jestem zagubiony w metodach, które należy zastosować, aby doprowadzić go do wąskiego gardła.

Maksymalną wydajność aplikacji można osiągnąć tylko wtedy, gdy aplikacja jest uruchomiona na maszynie wirtualnej z samym serwerem SQL Server. Jeśli aplikacja zostanie uruchomiona na innej maszynie wirtualnej lub wirtualnym pulpicie, czas trwania naszego testu porównawczego wzrośnie trzykrotnie (od 13 minut do 40 minut lub więcej). Wszystkie punkty końcowe (maszyna wirtualna programu SQL Server, maszyna wirtualna serwera aplikacji i pulpit wirtualny) korzystają z tego samego fizycznego sprzętu. Przenieśliśmy wszystkie inne punkty końcowe na inny sprzęt.

EDYCJA: Wydaje się, że problem powrócił. Po zmianie trybu oszczędzania energii ze zrównoważonej na wysoką wydajność, znacznie poprawiliśmy czasy reakcji. Ale dzisiaj ponownie uruchomiłem sp_BlitzFirst, z 300-sekundową próbką. Oto wynik:

To jest wynik

Pokazuje więcej sekundy oczekiwania na ASYNC_NETWORK_IO niż sekundy sp_blitzfirst.

Puste miejsce
źródło

Odpowiedzi:

18

Jeśli twoim głównym oczekiwaniem jest ASYNC_NETWORK_IO, problem nie dotyczy programu SQL Server. Jest to prawie zawsze spowodowane wąskim gardłem aplikacji. Nie mam na myśli wąskiego gardła na serwerze aplikacji, ale raczej wąskie gardło w aplikacji.

Wąskie gardło aplikacji jest zwykle spowodowane przetwarzaniem wiersz po wierszu, gdy SQL Server wysyła dane:

  • Aplikacja żąda danych od programu SQL Server
  • Serwer SQL wysyła dane szybko
  • Aplikacja informuje program SQL Server, aby poczekał, aż przetworzy każdy wiersz
  • SQL Server rejestruje czas oczekiwania, ASYNC_NETWORK_IOgdy aplikacja każe mu czekać

Zamiast tego aplikacja musi zużywać wszystkie dane z SQL Server, a następnie przetwarzać wiersz po wierszu. W tym momencie SQL Server nie ma obrazu.

sp_BlitzFirst wynik

LCK_M_SCzekanie nie jest wysoka. Są na nim tylko 2 sekundy 30-sekundowej próbki, a jej średnia to tylko 400 ms. Jest to bardzo, bardzo mało prawdopodobne, aby stanowił problem. ASYNC_NETWORK_IOjest twoim najwyższym oczekiwaniem w tej próbce. Nadal problem z aplikacją. Jeśli potrzebujesz pomocy z tymi LCKrzeczami, musimy zobaczyć związane z tym zapytania.

Nawet ASYNC_NETWORK_IOnie jest tak źle w tej próbce. Moje oczy stają się duże, gdy czas oczekiwania jest równy lub większy niż wielkość próbki. Właśnie wtedy wkopuję się.

Twój cały problem to ASYNC_NETWORK_IO. To nie jest problem z SQL Server. Jest to problem z aplikacją (przetwarzającą wiersz po wierszu, gdy SQL Server wysyła dane), serwerem aplikacji (już powiedziałeś, że jest w porządku) lub siecią (powiedziałeś, że sieć jest w porządku). Problem dotyczy aplikacji. Aplikacja C ++ musi zostać naprawiona.

Tara Kizer
źródło
6

Aby odpowiedzieć na moje własne pytanie: Głównym powodem pojawienia się ASYNC_NETWORK_IO na naszym SQL Server jako typ najwyższego czasu oczekiwania było energy savingustawienie serwera Windows 'balanced'zamiast 'high performance'. Potem rozmawialiśmy z niektórymi administratorami vm ware i wszyscy powiedzieli, że to ustawienie zabija wydajność .

Rozwiązaniami tego są:

  • Nie instaluj kontroli energii podczas instalacji serwera Windows
  • Ustaw tryb oszczędzania energii na wysoką wydajność dla wszystkich serwerów za pomocą zasad grupy

Wszystkie inne problemy / statystyki dotyczące ASYNC_NETWORK_IO są związane z nieprawidłowym pisaniem naszej aplikacji ERP. Dzięki wszystkim, którzy pomogli mi w rozwiązaniu tego problemu, wasze komentarze, sugestie i porady były bardzo mile widziane i pomocne!

Puste miejsce
źródło
Wiele systemów BIOS ma teraz bardziej szczegółową kontrolę oszczędności energii, na przykład zarządzanie energią NIC. Zastanawiam się, czy nadal można włączyć skalowanie częstotliwości i uniknąć czekania na kartę sieciową poprzez wyłączenie jej trybów oszczędzania energii.
ajeh