Jesteśmy zajęci testowaniem systemu OLTP, który opracowaliśmy w .NET 4.0 i uruchamiamy SQL Server 2008 R2 z tyłu. System korzysta z kolejek SQL Server Service Broker, które są bardzo wydajne, ale podczas przetwarzania doświadczamy osobliwego trendu.
SQL Server przetwarza żądania z zawrotną prędkością przez 1 minutę, po czym następuje ~ 20 sekund zwiększonej aktywności zapisu na dysku. Poniższy wykres ilustruje problem.
Yellow = Transactions per second
Blue = Total CPU usage
Red = Sqlsrv Disk Write Bytes/s
Green = Sqlsrv Disk Read Bytes/s
Podczas rozwiązywania problemów próbowaliśmy następujące bez znaczącej zmiany we wzorcu:
- Zatrzymano agenta SQL Server.
- Zabito prawie co drugi uruchomiony proces (brak A / V, SSMS, VS, Eksplorator Windows itp.)
- Usunięto wszystkie inne bazy danych.
- Wyłączono wszystkie liczniki konwersacji (nie używamy żadnych wyzwalaczy).
- Odejście od podejścia opartego na kolejce komunikatów do prostego / surowego projektu monitorowania tabeli.
- Zastosowano różne obciążenia od lekkich do ciężkich.
- Naprawiono wszystkie zakleszczenia.
Wygląda na to, że SQL Server może budować swoją pamięć podręczną i zapisywać ją na dysku w określonych odstępach czasowych, ale nie mogę znaleźć niczego online, aby poprzeć tę teorię.
Następnie planuję przenieść rozwiązanie do naszego dedykowanego środowiska testowego, aby sprawdzić, czy mogę odtworzyć problem. Każda pomoc w tym okresie byłaby bardzo mile widziana.
Aktualizacja 1 Zgodnie z życzeniem, wykres zawierający strony kontrolne stron / s , oczekiwaną długość życia strony i niektóre liczniki opóźnień dysku.
Wygląda na to, że punkt kontrolny (jasnoniebieska linia) jest przyczyną zmniejszonej wydajności (żółta linia), którą obserwujemy. ^
Opóźnienie dysku pozostaje względnie stałe podczas przetwarzania, a oczekiwany czas życia strony nie wydaje się mieć zauważalnego wpływu. Dostosowaliśmy również ilość pamięci RAM dostępnej dla programu SQL Server, co również nie miało dużego wpływu. Zmiana modelu odzyskiwania z SIMPLE
na FULL
również nie miała większego znaczenia.
Aktualizacja 2 Zmieniając „Interwał odzyskiwania” w następujący sposób, udało nam się skrócić interwał, w którym występują punkty kontrolne:
EXEC sp_configure 'show advanced options',1
GO
RECONFIGURE
GO
EXEC sp_configure 'recovery interval', '30'
GO
RECONFIGURE
GO
EXEC sp_configure 'show advanced options',0
GO
RECONFIGURE
Nie jestem jednak pewien, czy jest to zła praktyka?
FULL
lub BULK_LOGGED
, nadal zachowuje się tak, jakby istniała do SIMPLE
momentu wykonania pełnej kopii zapasowej.