2013-02-08 10 views
11

Mein aktuelles Projekt sendet ständig Abfragen an einen SQL Server und es kann 100% des Arbeitsspeichers oder der CPU verwenden.Ermitteln der SQL Server-Auslastung mit einer Abfrage

  • Wie kann ich überprüfen, ob der Server in einer gespeicherten Prozedur Vollauslastung nähert, damit ich entscheiden kann, ob die Abfragen oder nicht ausführen oder einige Einstellungen in einer Tabelle speichern, so dass die folgenden Abfragen, um die Arbeitsbelastung wissen können, ist hoch und entscheiden, was zu tun ist

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

Weitere Informationen über den Fall: Im Moment weiß ich, in unserem aktuellen Testserver 40-50 Abfragen pro Sekunde (eine bestimmte Stored Procedure) verarbeiten kann. Und jetzt entscheiden wir, wie viele Abfragen jede Sekunde an den Server gesendet werden. Wenn wir die Menge sogar um 1 höher als erwartet einstellen, werden die Abfragen langfristig den virtuellen Speicher füllen und der Client muss seine SQL Server-Instanz regelmäßig neu starten.

Strebte Ergebnisse (für Kopfgeldjäger):

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

Alle Ideen sind willkommen. Vielen Dank.

+9

Vorzeitige Optimierung ist die Wurzel allen Übels. – Andomar

+1

Basierend auf Ihrer Frage, denke ich, würde ich zurücktreten und einen alternativen Ansatz betrachten. –

+1

Zuerst, wenn Sie den virtuellen Speicher auf Ihrem Server verwenden, stellen Sie sicher, dass Ihre Instanz die Einstellung für den maximalen Speicher hat. SQL Server ist ziemlich gut darin, den Cache-Speicher zu verwalten, so dass Sie die Instanz (für dieses spezielle Problem) nie neu starten müssen, es sei denn, Sie nehmen Speicher, der vom Betriebssystem benötigt wird. Es gibt viele Artikel darüber, wie viel Speicher das Betriebssystem zu verlassen, aber Sie könnten beginnen, indem Sie auf BOL hier: http://msdn.microsoft.com/en-us/library/ms178067.aspx. Es ist 2012, aber ich bin mir nicht sicher, welche Version Sie verwenden. –

Antwort

5

Für eine solche intensive Nutzung von SQL Server und Mühe, um die Feinabstimmung es, gehe ich davon aus, dass die (virtuellen) Maschine auf SQL Server zugeordnet ist.

Nachdem dies gesagt ist, der sollte den Trick verwendet aktuellen Prozentsatz der CPU und Speicher der Maschine bekommen:

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 

Ein paar Dinge zu beachten:

  • sys.dm_os_sys_memory eine gute Quelle für die Maschine ist physische Speicherbelegung. Es enthält ähnliche Informationen zur Verwendung der Seitendatei des Geräts. Meiner Erfahrung nach ändern sich die Informationen häufig - mehrere Abfragen dagegen innerhalb einer Sekunde ergeben andere Ergebnisse.
  • sys.dm_os_ring_buffers ist eine gute Quelle für die CPU-Auslastung der Maschine, aber es wird nicht so häufig aktualisiert - jede Minute von dem, was ich gesehen habe. Vielleicht können Sie dies beeinflussen, wenn Sie mehr Echtzeitinformationen benötigen.
  • Der CPU-Verbrauchswert in sys.dm_os_ring_buffers ist eine ganze Zahl, aber ich machte @cpuUsage eine float pro Ihre Spezifikation. Da der gespeicherte Proc zwei float Parameter verwendet, können Sie die Ermittlung der CPU-Auslastung so umgestalten, dass ein Bruchteil ohne Änderung der Aufrufer bereitgestellt wird.
+2

CPU-Nutzung hat nicht funktioniert - sys.dm_os_sys_memory ist nützlich –

+0

Gut zu hören, dass die Speicher-Usage-Check hilft, @ Uğur Gümüşhan. Wie hat die CPU-Auslastungsprüfung nicht funktioniert? War es ein Fehler? Möglicherweise ist eine einfache Anpassung erforderlich, damit es in Ihrer Umgebung funktioniert. Das erinnert mich auch daran - welche SQL Server und Betriebssystemversionen verwenden Sie? (Laut '@@ VERSION' habe ich den gespeicherten Prozess auf Microsoft SQL Server 2008 R2 (SP1) überprüft - 10.50.2500.0 (Intel X86) 17. Juni 2011 00:57:23 Copyright (c) Microsoft Corporation Express Edition mit erweiterten Diensten unter Windows NT 6.1 (Build 7601: Service Pack 1).) – J0e3gan

+2

haben wir SQL Server 2008r2 in der Firma .. cpuusage gibt 1 jedes Mal –