Erkennen der SQL Server-Auslastung anhand einer Abfrage

7

Mein aktuelles Projekt sendet ständig Anfragen an einen SQL Server und verwendet möglicherweise 100% des Speichers oder der CPU.

  • Wie kann ich überprüfen, ob der Server in einer gespeicherten Prozedur fast voll ausgelastet ist, damit ich entscheiden kann, ob die Abfragen ausgeführt werden sollen oder nicht, oder einige Einstellungen in einer Tabelle speichern kann, damit die folgenden Abfragen wissen, dass die Arbeitslast hoch ist, und entscheiden, was zu tun ist

  • Wenn nicht, wie kann ich verhindern, dass SQL Server die volle Auslastung erreicht?

Weitere Informationen zum Fall: Derzeit weiß ich, dass unser aktueller Testserver 40-50 Abfragen pro Sekunde verarbeiten kann (eine bestimmte gespeicherte Prozedur). Und jetzt entscheiden wir, wie viele Anfragen pro Sekunde an den Server gesendet werden. Wenn wir den Betrag sogar um 1 höher als erwartet festlegen, füllen die Abfragen auf lange Sicht den virtuellen Speicher und unser Client muss seine SQL Server-Instanz regelmäßig neu starten.

Erwartete Ergebnisse (für Kopfgeldjäger):

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

Ideen sind willkommen. Vielen Dank.

Uğur Gümüşhan
quelle
4
Welche Version und Edition von SQL Server bitte?
Jon Seigel
@ JonSeigel 2008+
Uğur Gümüşhan
3
Das beantwortet die Editionsfrage nicht. Resource Governor ist nur Enterprise Edition.
Martin Smith
1
Dieser Teil Ihrer Frage scheint ein völliges Missverständnis zu sein. "Wenn wir den Betrag sogar um 1 höher als erwartet einstellen, füllen die Abfragen auf lange Sicht den virtuellen Speicher und unser Client muss seine SQL Server-Instanz regelmäßig neu starten." Wenn Sie nicht möchten, dass SQL Server mehr als X Speicher verwendet, legen Sie einfach den maximalen Serverspeicher fest.
Martin Smith

Antworten:

11

Wenn Sie den SQL Server-Speicher wirklich einschränken möchten, sehen Sie sich die Option Maximaler Serverspeicher an.

Das Speichern ist möglich, hängt jedoch davon ab, was Sie wirklich wollen. Möchten Sie die Speichernutzung als Prozentsatz der Option "Maximaler Serverspeicher" anzeigen? Wenn ja, schauen Sie sich sys.dm_os_process_memory an :

select convert(float, memory_utilization_percentage) / 100 as memory_usage
from sys.dm_os_process_memory

Wenn Sie physische Speicher gegen die gesamten Systemspeicher mögen, Blick in beide sys.dm_os_process_memoryund sys.dm_os_sys_info :

select * from sys.dm_os_sys_info

declare @physicalMemoryInUseKB bigint
declare @totalSystemMemoryBytes bigint

select @physicalMemoryInUseKB = physical_memory_in_use_kb from sys.dm_os_process_memory
select @totalSystemMemoryBytes = physical_memory_in_bytes from sys.dm_os_sys_info
select convert(float, @physicalMemoryInUseKB) * 1024
       / convert(float, @totalSystemMemoryBytes) as memory_usage

Ich glaube nicht, dass Sie die CPU-Auslastung erhalten können, wenn Sie den Resource Governor nicht aktiviert haben. Wenn Sie dies tun, schauen Sie sich sys.dm_os_performance_counters an:

select
    case CPUUsageBase
        when 0 then 0
        else convert(float, CPUUsage) / convert(float, CPUUsageBase)
    end as 'cpu_usage'
from
(select cntr_value as [CPUUsage]
from sys.dm_os_performance_counters
where counter_name like 'CPU usage%'
and object_name like '%Workload Group Stats%'
and cntr_type = 537003264) Usage
cross join
(select cntr_value as [CPUUsageBase]
 from sys.dm_os_performance_counters
 where counter_name like 'CPU usage %'
 and object_name like '%Workload Group Stats%'
 and cntr_type = 1073939712) UsageBase
Paul Williams
quelle
5

DMVs bieten sowohl Informationen zur CPU- als auch zur Speichernutzung. Für diese Abfragen ist die Berechtigung VIEW_SERVER_STATE erforderlich.

DECLARE @memory_usage FLOAT
    , @cpu_usage FLOAT

SET @memory_usage = ( SELECT    1.0 - ( available_physical_memory_kb / ( total_physical_memory_kb * 1.0 ) ) memory_usage
                        FROM      sys.dm_os_sys_memory
                    )

SET @cpu_usage = ( SELECT TOP ( 1 )
                            [CPU] / 100.0 AS [CPU_usage]
                    FROM     ( SELECT    record.value('(./Record/@id)[1]', 'int') AS record_id
                                        , record.value('(./Record/SchedulerMonitorEvent/SystemHealth/ProcessUtilization)[1]', 'int') AS [CPU]
                                FROM      ( SELECT    [timestamp]
                                                    , CONVERT(XML, record) AS [record]
                                            FROM      sys.dm_os_ring_buffers WITH ( NOLOCK )
                                            WHERE     ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR'
                                                    AND record LIKE N'%<SystemHealth>%'
                                        ) AS x
                            ) AS y
                    ORDER BY record_id DESC
                    )


SELECT  @memory_usage [memory_usage]
        , @cpu_usage [cpu_usage]
StrayCatDBA
quelle
gibt die CPU-Nutzung nicht zurück. irgendwelche Ideen?
Uğur Gümüşhan
@StrayCatDBA Ist die CPU-Auslastung im Ringpuffer eine diskrete Messung (dh gerade) oder ein Durchschnitt seit der letzten Messung (dh in den letzten X Sekunden)?
Paul Williams
Mein Verständnis ist, dass es diskret ist.
StrayCatDBA
für die CPU-Nutzung scheint es einen Mittelwert jede volle Minute der letzten Minute zu liefern
greg121
4

Innerhalb einer gespeicherten Prozedur? Sobald die Abfrage, die dazu geführt hat, dass die CPU zu 100% ausgelastet ist, beendet ist, können Sie nicht mehr nach dieser Metrik suchen, die bei der nächsten Abfrage in der gespeicherten Prozedur ausgeführt wird.

Wenn Sie SQL Server 2008 oder höher (und Enterprise Edition) verwenden, können Sie den Ressourcen-Governor verwenden, um sicherzustellen, dass anderen Prozessen CPU-Leistung und Arbeitsspeicher zur Verfügung stehen.

mrdenny
quelle