Coding with Titans

so breaking things happens constantly, but never on purpose

Resource Governor w MS SQL 2008

Resource Governor to nowa opcja dostępna tylko w Microsoft SQL Server 2008 Enterprise. Dzięki niej możliwe jest w końcu zagwarantowanie priorytetów oraz średniego czasu wykonania zapytań, od których zależy nasz biznes. Pozwala on między innymi na zarządzanie i przypisywanie zasobów “typom” użytkowników łączących się z naszą bazą danych. Każdy “typ” reprezentowany jest jako pewna workload groupa, która z kolei posiada referencję do zasobów (resource pool). Zasobami są tutaj: minimalna i maksymalna ilość pamięci RAM oraz czasu procesora. Oba podawane są w procentach.

Resource Governor

Procedura wygląda następująco - podczas łączenia, zanim jeszcze kontrola (czy uchwyt) zostanie zwrócony wywołującemu, wykonywana jest funkcja klasyfikująca (User Defined Function, UDF), którą sami możemy utworzyć, czy modyfikować. A następnie wszystkie zapytania (niezależnie od ich rodzaju), które wykonywane są w ramach danego połączenia będą ograniczane. Ograniczenia te zostają zaaplikowane jednak dopiero wówczas, gdy aktywnych jest kilka, różnych połączeń. Nawet restrykcyjne ograniczenia nie są więc brane pod uwagę, jeśli w danych aktualnie warunkach serwer dysponuje większymi zasobami, które może przydzielić. Gwarantuje to tym samym, że przy mało obłożonym serwerze, nawet połączenia o niskim priorytecie wykonają się możliwie najszybciej.

Dwie wbudowane grupy (“default” i “internal”) nie posiadają żadnych ograniczeń. Ich zadaniem jest wykonywanie zapytań, gdy: coś źle zostało sklasyfikowane (wtedy “default”) lub aby nie zagłodzić procesów własnych engine’u bazy, tzn.: SQL Server Agent, Service Brokera, checkpointów, czy lazy-writera (wtedy “internal”).

Za:

  • w końcu można kontrolować, co jest najważniejsze w naszym biznesie
  • jeden użytkownik nie ubije nam całego serwera dzięki “runaway” query

Braki:

  • jest to tylko własność Database Engine’u (czyli nici z zarządzaniem Analysis Services, Reporting Services, Integration Services…)
  • działa w obrębie jednej instancji (jeśli na jednej maszynie chodzi ich więcej, to o ile z pamięcią można próbować skonfigurować, to czasem procesora możemy zarządzać tylko przez opcje affinity, co nie jest dość optymalnym rozwiązaniem)
  • ograniczenie pamięci działa tylko na Query Execution Memory (nie pamięć cache), czyli podlegać mu będą jedynie zapytania alokujące pamięć (tj.: wymagające sortowania, łączenia tabel…)
  • brak restrykcji na operacje I/O
  • połączenie jest klasyfikowane tylko raz, podczas łączenia i później nie może być przeniesione do innej grupy, bez wcześniejszego rozłączenia (choć zasoby grupy mogą być zmieniane dynamicznie).