2013-02-08 24 views
11

Mój obecny projekt będzie wysyłał zapytania do serwera sql bez przerwy i może wykorzystywać 100% pamięci lub procesora.Wykrywanie wykorzystania SQL Server za pomocą zapytania

  • Jak mogę sprawdzić, czy serwer jest bliski pełnego wykorzystania w procedurze przechowywanej tak, że mogę się zdecydować czy wykonać zapytania, czy nie lub zapisać niektóre ustawienia w tabeli tak, że poniższe pytania może wiedzieć obciążenie jest wysoki i zdecydować, co zrobić, aby

  • Jeśli nie, w jaki sposób mogę zapobiec pełnego wykorzystania serwera SQL?

Więcej informacji na temat postępowania: Teraz wiem, że nasz obecny serwer testowy może przetwarzać 40-50 zapytań na sekundę (jeden szczególnej procedury przechowywane). A teraz zdecydujemy, ile zapytań zostanie wysłanych na serwer co sekundę. Jeśli ustawimy kwotę nawet o 1 wyższą niż oczekiwana, na dłuższą metę zapytania ostatecznie wypełnią pamięć wirtualną, a klient będzie musiał okresowo restartować swoją instancję serwera sql.

oczekiwanych rezultatów (dla łowców nagród):

@memory_usage float, @cpu_usage float; /* in percentage */ 

Wszelkie pomysły są mile widziane. Dzięki.

+9

Przedwczesna optymalizacja jest źródłem wszelkiego zła. – Andomar

+1

Na podstawie twojego pytania, myślę, że cofnę się i spojrzę na alternatywne podejście. –

+1

Po pierwsze, jeśli używasz pamięci wirtualnej na serwerze, upewnij się, że instancja ma ustawiony maksymalny rozmiar pamięci. SQL Server jest dość dobry w zarządzaniu pamięcią podręczną, więc nie powinieneś nigdy ponownie uruchamiać instancji (dla tego konkretnego problemu), chyba że bierzesz pamięć, że system operacyjny musi działać. Istnieje wiele artykułów na temat ilości pamięci opuszczającej system operacyjny, ale można zacząć od obejrzenia BOL tutaj: http://msdn.microsoft.com/en-us/library/ms178067.aspx. Jest rok 2012, ale nie jestem pewien, jakiej wersji używasz. –

Odpowiedz

5

Dla każdego takiego intensywnego użytkowania SQL Server i wysiłku, aby dostroić, ja przyjąć, że (wirtualny) maszyna jest przeznaczona do SQL Server.

Mimo to, coraz urzādzenia aktualnych procenty procesora i pamięci używane powinno załatwić sprawę:

CREATE PROCEDURE dbo.p_GetSystemUsage 
    @cpuUsage float out, -- % CPU usage 
    @memoryUsage float out -- % memory usage 
AS 
BEGIN 
    SET NOCOUNT ON; 

    /* 
    * % CPU usage 
    */ 

    SELECT TOP 1 
     @cpuUsage = 100 - r.SystemIdle 
    FROM (
     SELECT 
      rx.record.value('(./Record/@id)[1]', 'int') AS record_id, 
      rx.record.value('(./Record/SchedulerMonitorEvent/SystemHealth/SystemIdle)[1]', 'int') AS SystemIdle 
     FROM (
      SELECT CONVERT(XML, record) AS record 
      FROM sys.dm_os_ring_buffers 
      WHERE 
       ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR' AND 
       record LIKE '%<SystemHealth>%') AS rx 
     ) AS r 
    ORDER BY r.record_id DESC 

    /* 
    * % memory usage 
    */ 

    SELECT 
     @memoryUsage = 
      (((m.total_physical_memory_kb - m.available_physical_memory_kb)/
       convert(float, m.total_physical_memory_kb)) * 
      100) 
    FROM sys.dm_os_sys_memory m 
END 

Kilka rzeczy do uwaga:

  • sys.dm_os_sys_memory jest dobrym źródłem dla urządzenia wykorzystanie pamięci fizycznej. Zawiera podobne informacje na temat użycia pliku stronicowania urządzenia. Z mojego doświadczenia wynika, że ​​jego informacje zmieniają się często - wiele zapytań przeciwko niemu w ciągu sekundy przynosi różne wyniki.
  • sys.dm_os_ring_buffers jest dobrym źródłem dla użycia procesora przez komputer, ale nie jest aktualizowana tak często - co minutę z tego, co widziałem. Być może możesz to zmienić, jeśli potrzebujesz więcej informacji w czasie rzeczywistym.
  • Wartość użycia procesora w sys.dm_os_ring_buffers jest liczbą całkowitą, ale wykonałem @cpuUsage a float według specyfikacji. Ponieważ przechowywany proces używa dwóch paramerów float, można zmienić determinację użycia CPU, aby zapewnić ułamkową część bez zmiany jej wywołujących.
+2

Używanie procesora nie działa - sys.dm_os_sys_memory jest przydatne –

+0

Cieszę się, że sprawdzenie użycia pamięci pomaga, @ Uğur Gümüşhan. W jaki sposób sprawdzanie użycia procesora nie działa? Czy to błąd? Może potrzebne jest proste dostosowanie, aby działało w twoim środowisku. Poza tym to przypomina mi - z jakich wersji SQL Server i systemów operacyjnych korzystasz? (Zgodnie z "@@ VERSION", sprawdziłem zapisany proces na Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (Intel X86) 17 czerwca 2011 00:57:23 Copyright (c) Microsoft Corporation Express Edition z usługami zaawansowanymi na Windows NT 6.1 (Build 7601: Service Pack 1).) – J0e3gan

+2

Mamy serwer sql 2008r2 w firmie .. cpuusage zwraca 1 za każdym razem –