it-swarm.com.de

Erkennen der SQL Server-Auslastung anhand einer Abfrage

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.

7

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

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 den physischen Speicher im Vergleich zum gesamten Systemspeicher verwenden möchten, schauen Sie in beiden sys.dm_os_process_memory und 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 nicht Resource Governor 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
11
Paul Williams

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]
5
StrayCatDBA

Innerhalb einer gespeicherten Prozedur? Sobald die Abfrage, die dazu geführt hat, dass die CPU zu 100% ausgelastet ist, abgeschlossen 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.

4
mrdenny