Problembehandlung bei der Ressourcenkontrolle

Dieses Thema enthält Informationen zur Behandlung von Problemen, die bei der Verwendung der Ressourcenkontrolle auftreten können. Das Thema ist in die folgenden Kategorien gegliedert:

  • Fehler

  • Unerwartete Ergebnisse

  • Fehler und Probleme im Zusammenhang mit der Leistung

Fehler in der Ressourcenkontrolle

Die Fehlermeldungen der Ressourcenkontrolle umfassen alle Aktionen im Zusammenhang mit der Konfiguration und Verwendung der Ressourcenkontrolle.

Die folgende Tabelle enthält einige Beispiele für Fehlermeldungen der Ressourcenkontrolle sowie Informationen zur Behebung des in der Fehlermeldung beschriebenen Problems.

Fehlernummer

Fehlermeldung

Lösung

8645

Timeout beim Warten auf die Arbeitsspeicherressourcen für die Abfrageausführung im Ressourcenpool 'myTestPool' (257). Führen Sie die Abfrage erneut aus.

Konfigurieren Sie einen höheren Timeoutwert, oder reduzieren Sie die Abfragelast auf dem Server.

8651

Der Vorgang konnte nicht ausgeführt werden, da die angeforderte Arbeitsspeicherzuweisung nicht im Ressourcenpool 'myTestPool' (257) verfügbar war. Führen Sie die Abfrage erneut aus, verringern Sie die Abfragelast, oder überprüfen Sie die Konfigurationseinstellung der Ressourcenkontrolle.

Führen Sie die Abfrage zu einem späteren Zeitpunkt erneut aus. Verringern Sie die Abfragelast auf dem Server. Bitten Sie den Administrator, die Konfigurationseinstellung der Ressourcenkontrolle zu überprüfen.

8657

Die Arbeitsspeicherzuweisung von 1024 KB konnte nicht abgerufen werden, weil sie die maximale Konfigurationsgrenze in Arbeitsauslastungsgruppe 'myTestGroup' (267) und Ressourcenpool 'myTestPool' (257) übersteigt. Bitten Sie den Serveradministrator, die Grenze für die Speicherauslastung zu erhöhen.

Ändern Sie die Abfrage, um arbeitsspeicherintensive Vorgänge zu reduzieren, z. B. Sortierung und Hashverknüpfung. Bitten Sie den Systemadministrator, eine höhere Grenze für die Speicherauslastung zuzulassen.

Ein Administrator kann einen oder beide der folgenden Parameter anpassen:

  • max_memory_percent für Ressourcenpools, wodurch die maximale Zuweisung von physischem Arbeitsspeicher für alle Abfragen festgelegt wird.

  • request_max_memory_grant_percent für Arbeitsauslastungsgruppen, wodurch die Grenze pro Abfrage festgelegt wird.

Ein Administrator kann die tatsächliche physische Grenze anhand der Spalte max_target_memory_kb aus sys.dm_exec_query_resource_semaphores abrufen.

Die Grenze pro Abfrage kann mithilfe von max_target_memory_kb * request_max_memory_grant_percent berechnet werden.

HinweisHinweis
Der Administrator muss sicherstellen, dass der in der Fehlermeldung angegebene erforderliche Speicherplatz geringer ist als die weiter oben berechnete Grenze pro Abfrage. Beachten Sie jedoch, dass durch eine Erhöhung von request_max_memory_grant_percent weniger große Abfragen gleichzeitig ausgeführt werden können. Bei der Standardeinstellung von 25 Prozent können Benutzer beispielsweise drei große Abfragen ausführen, während bei einer Einstellung von 40 Prozent nur zwei große Abfragen möglich sind.

10900

Fehler beim Konfigurieren der Ressourcenkontrolle während des Starts. Überprüfen Sie die spezifischen Fehlermeldungen im SQL Server-Fehlerprotokoll, oder überprüfen Sie die Konsistenz der Masterdatenbank, indem Sie DBCC CHECKCATALOG('master') ausführen.

Führen Sie "DBCC CHECKCATALOG('master')" aus.

10901

Der Benutzer ist nicht berechtigt, die Konfiguration der Ressourcenkontrolle zu ändern.

Erteilen Sie dem Benutzer die Berechtigung, die Konfiguration der Ressourcenkontrolle zu ändern, und wiederholen Sie den Vorgang.

10902

Die benutzerdefinierte 'dbo.rgclassifier_v1'-Funktion ist nicht in der Masterdatenbank vorhanden, oder der Benutzer ist nicht berechtigt, auf die Funktion zuzugreifen.

Erstellen Sie eine benutzerdefinierte Klassifizierungsfunktion (User-Defined Function, UDF) in der master-Datenbank, oder erteilen Sie die erforderlichen Berechtigungen für die vorhandene benutzerdefinierte Klassifizierungsfunktion.

10903

Der angegebene Schemaname 'dbo' für die benutzerdefinierte Klassifizierungsfunktion ist nicht vorhanden, oder der Benutzer ist nicht berechtigt, auf die Funktion zuzugreifen.

Verwenden Sie einen anderen Schemanamen, oder fordern Sie die korrekten Berechtigungen für dieses Schema an.

10904

Fehler bei der Konfiguration der Ressourcenkontrolle. Aktive Sitzungen in Arbeitsauslastungsgruppen werden gelöscht oder in andere Ressourcenpools verschoben. Trennen Sie die Verbindung aller aktiven Sitzungen in den betroffenen Arbeitsauslastungsgruppen, und wiederholen Sie den Vorgang.

Trennen Sie die Verbindung aller aktiven Sitzungen in den betroffenen Gruppen, und wiederholen Sie den Vorgang.

HinweisHinweis
In dieser Version der Ressourcenkontrolle können Gruppen nicht zwischen Pools verschoben werden, wenn sie offene Sitzungen enthalten.

10905

Die Konfiguration der Ressourcenkontrolle konnte nicht abgeschlossen werden, weil nicht genügend Arbeitsspeicher verfügbar ist. Reduzieren Sie die Serverlast, oder wiederholen Sie den Vorgang auf einer dedizierten Administratorverbindung.

Reduzieren Sie die Serverlast, oder führen Sie die Konfiguration auf einer dedizierten Administratorverbindung aus.

10906

Das 'dbo'.'rgclassifier_v1'-Objekt ist keine gültige benutzerdefinierte Klassifizierungsfunktion für die Ressourcenkontrolle. Eine gültige benutzerdefinierte Klassifizierungsfunktion muss schemagebunden sein, sie muss einen sysname-Wert zurückgeben und darf keine Parameter enthalten.

Geben Sie eine gültige benutzerdefinierte Klassifizierungsfunktion an. Eine gültige benutzerdefinierte Klassifizierungsfunktion muss folgende Voraussetzungen erfüllen:

  • Sie muss einen sysname-Wert zurückgeben.

  • Sie enthält keine Parameter.

  • Sie wurde mit der SCHEMABINDING-Option erstellt.

10907

Das 'MIN_CPU_PERCENT'-Attribut mit dem Wert 50 ist größer als das 'MAX_CPU_PERCENT'-Attribut mit dem Wert 40.

Geben Sie einen minimalen Wert an, der kleiner oder gleich dem maximalen Wert ist.

10908

Das 'MAX_MEMORY_PERCENT'-Attribut mit dem Wert 40 ist kleiner als das 'MIN_MEMORY_PERCENT'-Attribut mit dem Wert 60.

Geben Sie einen maximalen Wert an, der größer oder gleich dem minimalen Attributwert ist.

10909

Der Ressourcenpool kann nicht erstellt werden. Die maximale Anzahl von Ressourcenpools darf die aktuelle Grenze von 20 einschließlich vordefinierter Ressourcenpools nicht überschreiten.

Löschen Sie Ressourcenpools, die nicht benötigt werden.

10910

Der Vorgang konnte nicht abgeschlossen werden. Der angegebene 'MIN_CPU_PERCENT'-Wert 25 führt dazu, dass die Summe der Mindestwerte aller Ressourcenpools 100 Prozent übersteigt. Verringern Sie den Wert, oder ändern Sie andere Ressourcenpools, sodass die Summe kleiner als 100 ist.

Reduzieren Sie den Wert für MIN_CPU_PERCENT.

10911

Der angeforderte Vorgang kann nicht ausgeführt werden, weil der Ressourcenpool 'myTestPool2' nicht vorhanden ist.

Fragen Sie die sys.resource_governor_resource_pools-Katalogsicht ab, um zu ermitteln, welche Ressourcenpools momentan definiert sind. Wählen Sie einen vorhandenen Pool aus, oder erstellen Sie einen neuen Pool.

10912

Der Vorgang konnte nicht abgeschlossen werden. Das Löschen einer vordefinierten Arbeitsauslastungsgruppe ist nicht zulässig.

Wählen Sie eine benutzerdefinierte Arbeitsauslastungsgruppe für den Löschvorgang aus.

10913

Benutzer sind nicht zum Löschen der Arbeitsauslastungsgruppe 'internal' im Ressourcenpool 'internal' berechtigt.

Erstellen Sie die Arbeitsauslastungsgruppe in einem benutzerdefinierten Pool oder im Standardpool.

10914

Der Name von Arbeitsauslastungsgruppe '#mygroup' kann nicht mit # von ## beginnen.

Verwenden Sie beim Erstellen einer Gruppe oder eines Pools nicht #oder ##.

10915

Der Vorgang konnte nicht abgeschlossen werden. Das Ändern der Arbeitsauslastungsgruppe 'internal' ist nicht zulässig.

Wählen Sie einen benutzerdefinierten Pool oder eine benutzerdefinierte Gruppe für den Änderungsvorgang aus.

Hinweis   Die Konfiguration der Standardgruppe oder des Standardressourcenpools kann geändert werden.

10916

Der Ressourcenpool 'myTestPool' kann nicht gelöscht werden, da er die Arbeitsauslastungsgruppe 'myTestGroup' enthält. Löschen oder entfernen Sie alle Arbeitsauslastungsgruppen, die diesen Ressourcenpool verwenden, bevor sie den Pool löschen.

Löschen oder entfernen Sie alle Arbeitsauslastungsgruppen, die diesen Pool verwenden, und löschen Sie anschließend den Pool.

10917

Fehler bei ALTER WORKLOAD GROUP. Es muss eine 'WITH'- oder 'USING'-Klausel angegeben werden.

Verwenden Sie entweder die 'WITH'- oder die 'USING'-Klausel in der ALTER WORKLOAD GROUP-Anweisung.

10918

Ressourcenpool 'myTestPool' ist bereits vorhanden und kann daher nicht erstellt werden.

Wählen Sie einen anderen Ressourcenpoolnamen aus.

10919

Fehler beim Lesen der Konfiguration der Ressourcenkontrolle aus der Masterdatenbank. Überprüfen Sie die Integrität der Masterdatenbank, oder wenden Sie sich an den Systemadministrator.

Führen Sie "DBCC CHECKCATALOG('master')" aus.

10920

Das Löschen der benutzerdefinierten 'dbo.myclassifer'-Funktion ist nicht möglich. Sie wird als Klassifizierungsfunktion der Ressourcenkontrolle verwendet.

Keine.

10921

'default'-Arbeitsauslastungsgruppe kann nicht aus 'default'-Ressourcenpool verschoben werden.

Nicht zutreffend.

10981

Die erneute Konfiguration der Ressourcenkontrolle wurde erfolgreich ausgeführt.

Diese Meldung wird in das SQL Server-Ereignisprotokoll geschrieben.

10982

Fehler beim Ausführen der benutzerdefinierten Klassifizierungsfunktion für die Ressourcenkontrolle. Details können Sie den vorhergehenden Fehlern im SQL Server-Fehlerprotokoll von Sitzungs-ID 58 entnehmen. Verstrichene Zeit für die Klassifizierung: 800 ms.

Diese Meldung wird in das SQL Server-Fehlerprotokoll geschrieben.

Hinweis   Vorherige Meldungen im SQL Server-Fehlerprotokoll mit dem gleichen Serverprozessbezeichner (SPID) enthalten möglicherweise spezifische Informationen zur Fehlerursache. Eine Klassifizierungsfunktion mit langer Ausführungszeit kann einen Timeout der Benutzeranmeldung zur Folge haben. Überprüfen Sie, ob die von der Klassifizierungsfunktion beanspruchte Zeit den Timeoutwert für die Clientanmeldung überschreitet.

10983

Die Konfiguration der Ressourcenkontrolle wurde vom Benutzer abgebrochen.

Nicht zutreffend.

10984

Fehler bei der erneuten Konfiguration der Ressourcenkontrolle.

Nicht zutreffend.

Unerwartete Ergebnisse

Unerwartete Ergebnisse sind Situationen, in denen die verschiedenen Elemente der Ressourcenkontrolle zwar funktionsfähig sind, die Ergebnisse jedoch nicht Ihren Erwartungen entsprechen. Beispiel: Die Klassifizierung wird nicht ordnungsgemäß ausgeführt, oder beim Löschen bzw. Erstellen von Arbeitsauslastungsgruppen sind Probleme aufgetreten.

Klassifizierung von Sitzungen

Sitzungen werden der standardmäßigen Arbeitsauslastungsgruppe zugeordnet, wenn die folgenden Bedingungen erfüllt sind:

  • Die benutzerdefinierte Klassifizierungsfunktion ist nicht vorhanden oder nicht aktiviert.

  • Sie wurden durch die benutzerdefinierte Klassifizierungsfunktion dieser Gruppe zugeordnet. Dies deutet auf einen Fehler in der Funktionslogik hin.

Grundlegende Problembehandlung

Wenn für die Klassifizierung keine benutzerdefinierte Klassifizierungsfunktion verfügbar ist, werden alle Sitzungen automatisch der standardmäßigen Arbeitsauslastungsgruppe zugeordnet. Nachdem Sie eine benutzerdefinierte Klassifizierungsfunktion erstellt haben, müssen Sie sicherstellen, dass diese in der Ressourcenkontrolle registriert ist und dass die Konfiguration im Arbeitsspeicher aktualisiert wird.

Das Erstellen, Registrieren und Aktivieren einer benutzerdefinierten Klassifizierungsfunktion erfolgt in drei Schritten:

  • Im ersten Schritt erstellen Sie die Funktion.

    CREATE FUNCTION function_name() RETURNS <something> 
    WITH SCHEMABINDING
    
  • Im zweiten Schritt registrieren Sie die Funktion in der Ressourcenkontrolle.

    ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION=schema_name.function_name)
    
  • Im dritten Schritt aktualisieren Sie die Konfiguration im Arbeitsspeicher der Ressourcenkontrolle.

    ALTER RESOURCE GOVERNOR RECONFIGURE
    

Bei der Problembehandlung von Klassifizierungen sollten Sie zunächst überprüfen, ob die erstellte Funktion in der Ressourcenkontrolle registriert ist und ob die Konfiguration aktualisiert wurde. Rufen Sie mithilfe der folgenden Abfrage den Namen des Schemas (schema_name) und der Klassifizierungsfunktion (function_name) für die derzeit von der Ressourcenkontrolle verwendete benutzerdefinierte Klassifizierungsfunktion ab.

USE master
SELECT 
      object_schema_name(classifier_function_id) AS [schema_name],
      object_name(classifier_function_id) AS [function_name]
FROM sys.dm_resource_governor_configuration

Die zuvor genannte Methode eignet sich zur Problembehandlung in Szenarios, in denen Sie die benutzerdefinierte Klassifizierungsfunktion geändert haben, die Ressourcenkontrolle jedoch noch die vorhergehende Funktionslogik zum Klassifizieren von Sitzungen verwendet. Dieses Verhalten deutet darauf hin, dass die von Ihnen vorgenommenen Änderungen nicht auf die Konfiguration im Arbeitsspeicher angewendet wurden.

Erweiterte Problembehandlung

Sie können komplexe Klassifizierungsfunktionen erstellen, die entweder nicht die erwarteten Ergebnisse liefern oder ressourcenintensiv sind. Nachdem Sie die Schritte der grundlegenden Problembehandlung durchgeführt haben, müssen Sie die Leistungsfähigkeit der Funktionslogik überprüfen. Im schlimmsten Fall führt der Codierungsfehler zu einer Endlosschleife oder Endlosabfrage.

Sie können für die Problembehandlung bei einer fehlerhaft geschriebenen Klassifizierungsfunktion eine dedizierte Administratorverbindung (Dedicated Administrator Connection, DAC) verwenden, da eine DAC der Klassifizierung nicht unterliegt und verwendet werden kann, während die Ressourcenkontrolle ausgeführt wird und eingehende Sitzungen klassifiziert. Weitere Informationen finden Sie unter Verwenden einer dedizierten Administratorverbindung.

HinweisHinweis

Wenn keine DAC für die Problembehandlung verfügbar ist, können Sie das System im Einzelbenutzermodus neu starten. Obwohl der Einzelbenutzermodus nicht der Klassifizierung unterliegt, können Sie die Klassifizierung der Ressourcenkontrolle während der Ausführung nicht diagnostizieren.

Rufen Sie Informationen zur Klassifizierungsfunktion mithilfe der folgenden Abfrage ab:

  • sys.dm_exec_query_stats. (enthält die Anweisungsinformationen, jedoch nicht die Funktion selbst)

  • sys.dm_exec_sql_text (verwenden Sie dies zusammen mit sql_handle aus sys.dm_exec_query_stats)

  • PreConnect:Starting-Ereignisklasse (gibt ID und Name der Klassifizierungsfunktion an)

Fehler bei der Neukonfiguration

Die Ressourcenkontrolle trennt Metadatenänderungen von aktuell ausgeführten Sitzungen, bis die ALTER RESOURCE GOVERNOR RECONFIGURE-Anweisung abgeschlossen ist. Wenn Sie versuchen, eine Gruppe mit aktiven bzw. offenen Sitzungen oder einen Ressourcenpool mit Arbeitsauslastungsgruppen zu löschen, wird die ALTER RESOURCE GOVERNOR RECONFIGURE-Anweisung nicht erfolgreich ausgeführt.

Fragen Sie zum Ermitteln der Konfiguration im Arbeitsspeicher und der gespeicherten Konfiguration sys.dm_resource_governor_configuration bzw. sys.resource_governor_configuration ab. Der Wert 1 für is_reconfiguration_pending (sys.dm_resource_governor_configuration) gibt an, dass die Sitzungskonfiguration nicht aktualisiert wurde. Sie haben in diesem Fall die folgenden Möglichkeiten:

  • Warten Sie, bis die Sitzungen abgeschlossen sind, oder löschen Sie deren Verbindung.

  • Beenden Sie die aktive Sitzung explizit, oder löschen Sie die Sitzungsverbindung.

  • Erstellen Sie die gelöschte Gruppe bzw. den gelöschten Pool neu, passen Sie die Einstellungen an, und führen Sie die ALTER RESOURCE GOVERNOR RECONFIGURE-Anweisung erneut aus.

Fehler und Probleme im Zusammenhang mit der Leistung

Wenn bei der Verwendung der Ressourcenkontrolle Leistungsprobleme auftreten, müssen Sie ermitteln, ob diese durch die Konfiguration der Ressourcenkontrolle verursacht werden. Die in diesem Abschnitt bereitgestellten Informationen zur Problembehandlung gliedern sich in zwei Kategorien:

  • Klassifizierung von Sitzungen

  • Abfrageausführung

Klassifizierung von Sitzungen

Ein Logon-Trigger oder eine benutzerdefinierte Klassifizierungsfunktion mit langer Ausführungszeit kann sich auf die Serverleistung auswirken. Wenn der Logon-Trigger oder die benutzerdefinierte Klassifizierungsfunktion zu viel Zeit in Anspruch nimmt, tritt für die Verbindung ein Timeout ein. Der Trigger bzw. die Funktion wird jedoch weiter ausgeführt und nimmt weiterhin Serverressourcen in Anspruch.

Wenn Sie vermuten, dass Sitzungen in einem Vorverbindungsstatus ausgeführt werden, sollten Sie sich mit der dedizierten Administratorverbindung anmelden und die PreConnect:Starting (Ereignisklasse) auf mehrere Anforderungen oder Sitzungen überprüfen, die gestartet, aber nicht beendet wurden.

So beheben Sie dieses Problem und vermeiden eine Wiederholung

  • Beenden Sie die Sitzungen.

  • Ermitteln Sie die wahrscheinlichste Ursache für die lange Ausführungszeit der Funktion oder des Logon-Triggers.

  • Entfernen und ersetzen Sie den Trigger bzw. die Funktion, der/die das Problem verursacht.

Abfrageausführung

Nach dem Klassifizieren und Ausführen einer Abfrage kann es vorkommen, dass diese nicht mehr reagiert oder zu einem Fehler führt. Sie vermuten, dass dies auf die aktuellen Einstellungen der Ressourcenkontrolle zurückzuführen ist. Analysieren Sie in diesem Fall die folgenden Aspekte in der Konfiguration der Ressourcenkontrolle:

  • Einschränkung der Anforderungsanzahl

  • Maximaler CPU-Grenzwert

  • Einschränkung der CPU-Bandbreite

  • Größe der Arbeitsspeicherzuweisung

  • Timeoutfehler bei der Arbeitsspeicherzuweisung

  • Fehler aufgrund von nicht genügend Arbeitsspeicher

  • Suboptimaler Abfrageplan

Einschränkung der Anforderungsanzahl

In diesem Szenario berichtet ein Benutzer von Leistungseinbußen. Sie vermuten, dass die Anzahl von Anforderungen eingeschränkt ist.

Ermitteln Sie zunächst, ob die Einschränkung der Anforderungsanzahl für die Gruppe des Benutzers explizit konfiguriert wurde. Überprüfen Sie hierzu die Gruppenmitgliedschaft des Benutzers, und stellen Sie fest, ob die GROUP_MAX_REQUESTS-Einstellung aktiviert ist. Wenn GROUP_MAX_REQUESTS nicht aktiviert ist, besteht keine explizite Einschränkung der Anforderungsanzahl. In diesem Fall sollten Sie die Ursache mithilfe der folgenden Schritte analysieren.

  • Fragen Sie sys.dm_os_waiting_tasks ab, um zu ermitteln, ob Anforderungen im RESMGR_THROTTLED-Wartetyp warten. Wenn dieser Wartetyp vorhanden ist, deutet dies auf eine Einschränkung der Anforderungsanzahl hin.

  • Starten Sie den Systemmonitor, und erfassen Sie Daten mithilfe der Indikatoren Anforderungen in der Warteschlange und Aktive Anforderungen. Wenn die Anzahl von Anforderungen in der Warteschlange ungleich Null ist, deutet dies auf eine Einschränkung der Anforderungsanzahl hin.

  • Überprüfen Sie, ob der Wert für Aktive Anforderungen mit der GROUP_MAX_REQUESTS-Einstellung übereinstimmt. Wenn der Wert für Aktive Anforderungen höher ist als die GROUP_MAX_REQUESTS-Einstellung, enthält die Gruppe möglicherweise Anforderungen, die nicht eingeschränkt werden können (z. B. offene Transaktionen).

  • Wenn der Wert für Anforderungen in der Warteschlange Null beträgt, sollten Sie den Wert für Aktive Anforderungen von allen Arbeitsauslastungsgruppen überprüfen, die den gleichen Ressourcenpool verwenden. Möglicherweise ist der Pool aufgrund zu vieler Anforderungen überlastet.

Maximaler CPU-Grenzwert

Wenn Sie eine Richtlinie verwenden, die durch die Generierung von Ereignissen in der Ressourcenkontrolle gesteuert wird, können Sie das beim Erreichen des maximalen CPU-Grenzwerts generierte Ereignis nutzen.

In diesem Szenario ermitteln Sie, ob der maximale CPU-Grenzwert (REQUEST_MAX_CPU_TIME_SEC) zu niedrig ist, den Sie zum Erkennen von Abfragen mit zu hoher CPU-Auslastung konfiguriert haben.

Die folgenden Aktionen helfen Ihnen, die CPU-Grenzwerteinstellung zu überprüfen.

  • Starten Sie eine SQL-Ablaufverfolgungssitzung, und erfassen Sie das Ereignis CPU Threshold Exceeded. Wenn eine Benutzeranforderung den maximalen CPU-Nutzungsgrenzwert erreicht, generiert der Server automatisch ein SQL-Ablaufverfolgungsereignis. Wenn die Einstellung zu niedrig ist, wird eine große Anzahl dieser Ereignisse generiert.
HinweisHinweis

Dieses Ereignis wird auch als Serverereignisbenachrichtigung bereitgestellt. Sie können somit ein Skript schreiben, das auf dieses Ereignis reagiert.

  • Starten Sie den Systemmonitor, und erfassen Sie Daten mithilfe des Indikators Maximale CPU-Zeit für Anforderungen (ms). Sie können den Wert dieses Indikators auch als Anhaltspunkt verwenden, um einen geeigneten Grenzwert für die Arbeitsauslastungsgruppe einzustellen.

Einschränkung der CPU-Bandbreite

In diesem Szenario vermuten Sie eine Einschränkung der CPU-Bandbreite, da der Leistungsindikator CPU-Verwendung in % den gleichen oder nahezu den gleichen Wert wie die MAX_CPU_PERCENT-Einstellung der Ressourcenkontrolle aufweist. Die folgende Abfrage gibt den Wert der CPU-Verwendung in Prozent für alle Arbeitsauslastungsgruppen und Ressourcenpools einer SQL Server-Instanz zurück.

select * from sys.dm_os_performance_counters where counter_name = 'cpu usage %'

Weitere Informationen finden Sie unter sys.dm_os_performance_counters (Transact-SQL).

Sie ermitteln, ob die CPU-Bandbreite eingeschränkt ist, indem Sie in Ihrem System die folgenden Überprüfungen durchführen.

  • Überprüfen Sie die CPU-Gesamtauslastung des Servers. Wenn eine andere Last als SQL Server aktiv ist, kann sich dies auf die Abfrage auswirken, für die Sie die Problembehandlung ausführen.

  • Überprüfen Sie die Verteilung der CPU-Verwendung unter den Ressourcenpools. Ein Ressourcenpool kann eingeschränkt sein, wenn in einem anderen Pool ein hoher Mindestwert für die CPU-Verwendung konfiguriert ist. Vergleichen Sie den Indikator für die erwartete (berechnete) CPU-Auslastung mit dem für die tatsächliche CPU-Auslastung.

  • Überprüfen Sie die dem betreffenden Ressourcenpool zugewiesenen Arbeitsauslastungsgruppen. Last von anderen Arbeitsauslastungsgruppen kann für Benutzer, die den gleichen Pool verwenden, Auswirkungen haben.

  • Überprüfen Sie die Verteilung der CPU-Verwendung unter den Zeitplanungsmodulen. Die analysierte Abfrage wurde möglicherweise einem Zeitplanungsmodul zugeordnet, das Abfragen mit langer Ausführungszeit enthält. In diesem Fall kann es den Anschein erwecken, als wäre die Abfrage eingeschränkt. Das eigentliche Problem liegt jedoch in einer ungleichmäßigen Verteilung der Last unter den Zeitplanungsmodulen.

  • Überprüfen Sie, ob die Arbeitsauslastung möglicherweise nicht durch die Einstellungen der Ressourcenkontrolle eingeschränkt, sondern durch andere Sitzungen blockiert wurde.

  • Ermitteln Sie, wie viele Sitzungen aktuell Abfragen in dem System ausführen. Wenn viele Anforderungen gleichzeitig ausgeführt werden, versucht SQL Server, allen Anforderungen einen gewissen Anteil an der CPU-Zeit zuzuweisen. So soll sichergestellt werden, dass weiterhin auf die CPU zugegriffen werden kann.

Größe der Arbeitsspeicherzuweisung

In diesem Szenario vermuten Sie, dass eine Abfrage aufgrund der Größe des zugewiesenen Arbeitsspeichers zu langsam ausgeführt wird.

Die Ressourcenkontrolle erzwingt den maximalen Arbeitsspeichergrenzwert für Abfragen, indem die Arbeitsspeicherzuweisung reduziert wird. So erfüllen auch umfangreiche Abfragen den Grenzwert. Wenn eine Abfrage weniger als 100 % der Arbeitsspeicherzuweisung erhält, müssen die temporären Daten ggf. ausgelagert ("Überlauf") und auf einen Datenträger geschrieben werden. Dies wirkt sich spürbar auf die Leistung aus.

Sie müssen ermitteln, wie groß der Anteil umfangreicher Abfragen ist, um einen geeigneten Grenzwert für die maximale Abfragegröße festzulegen. Die folgenden Aktionen helfen Ihnen, die besten Einstellungen zu bestimmen:

  • Fragen Sie sys.dm_exec_query_memory_grants ab, um den aktuellen Status der Arbeitsspeicherzuweisungen zu ermitteln. In der ideal_memory_kb-Spalte wird die ideale Menge auf Grundlage der Kardinalitätsschätzung angezeigt. Die requested_memory_kb-Spalte enthält die angefragte Menge. Diese wurde ggf. nach dem Erreichen des maximalen Abfragegrenzwerts reduziert. Wenn der Wert für requested_memory_kb deutlich niedriger ist als für ideal_memory_kb, kann es zu einem Überlauf der Abfrage kommen (vorausgesetzt die Kardinalitätsschätzung ist korrekt).

  • Starten Sie den Systemmonitor, und erfassen Sie Daten mithilfe des Indikators Reduzierte Arbeitsspeicherzuweisungen/Sekunde. Der Wert dieses Indikators gibt die Anzahl der Arbeitsspeicherzuweisungen an, die weniger als die ideale Menge erhalten haben, nachdem der Grenzwert für die maximale Anforderungsgröße erreicht wurde. Große Abfragen werden deutlich langsamer ausgeführt als Abfragen mit der idealen Menge, da für sie ein Überlauf auf den Datenträger erfolgen muss, damit die Arbeitsspeichergrenzwerte eingehalten werden.

Zum Beheben eines Problems bei der Arbeitsspeicherzuweisung müssen Sie ggf. den Grenzwert für die Poolgröße oder den Grenzwert für die maximale Arbeitsspeichergröße erhöhen.

HinweisHinweis

Wenn Sie nur die maximale Arbeitsspeichergröße erhöhen, können möglicherweise weniger große Abfragen gleichzeitig ausgeführt werden.

Timeoutfehler bei der Arbeitsspeicherzuweisung

In diesem Szenario führt eine Abfrage aufgrund eines Timeoutfehlers bei der Arbeitsspeicherzuweisung zu einem Fehler.

Sowohl die Gesamtzahl der aktiven Anforderungen von Arbeitsspeicherzuweisungen als auch die Arbeitsspeichergrenzwerte, die in der Arbeitsauslastungsgruppe und im Ressourcenpool definiert sind, können zu einem Timeout der Arbeitsspeicherzuweisung führen. Wenn ein Ressourcenpool von mehreren Ressourcengruppen gemeinsam verwendet wird, kann sich die Anzahl gleichzeitiger Abfragen in anderen Gruppen ebenfalls auf die Timeouts bei der Arbeitsspeicherzuweisung auswirken.

Die folgenden Aktionen helfen Ihnen, die optimalen Einstellungen für den Ressourcenpool zu bestimmen:

  • Fragen Sie sys.dm_exec_query_memory_grants ab, um die Anzahl von Arbeitsspeicherzuweisungen und Abfragen in der Warteschlange für diese Gruppe und diesen Pool zu ermitteln.

  • Fragen Sie sys.dm_exec_query_resource_semaphores ab, um den insgesamt zugewiesenen Arbeitsspeicher und die Zielwerte anzuzeigen.

Wenn die zugewiesene Arbeitsspeicherauslastung größer als der verfügbare Arbeitsspeicher ist, können Sie den Grenzwert für die Ressourcenpoolgröße erhöhen.

Fehler aufgrund von nicht genügend Arbeitsspeicher

Eine Abfrage schlägt mit einem Fehler aufgrund von nicht genügend Arbeitsspeicher fehl.

Grundlegende Problembehandlung

Die folgenden Aktionen helfen Ihnen, die optimalen Einstellungen für die Arbeitsauslastungsgruppe zu bestimmen:

  • Fragen Sie sys.dm_os_memory_brokers ab, um die relative Arbeitsspeicherverteilung und den Verlauf innerhalb des Ressourcenpools zu überprüfen. Wenn bei zu geringem Arbeitsspeicher zu viele Anforderungn gestellt werden, kann dies eine Überladung der Arbeitsauslastungsgruppe bzw. des Ressourcenpools zur Folge haben und Fehler aufgrund von nicht genügend Arbeitsspeicher verursachen.

  • Starten Sie den Systemmonitor, und ermitteln Sie mithilfe der arbeitsspeicherbezogenen Indikatoren des Ressourcenpools den Zielwert und den aktuellen Wert der Arbeitsspeicherauslastung für die Arbeitsspeicherzuweisungen, den Cachearbeitsspeicher und den Kompilierungs-/Optimiererspeicher. Wenn die aktuellen Werte höher als die Zielwerte sind, ist der Ressourcenpool überladen. Ändern Sie ggf. die Grenzwerte für den Poolarbeitsspeicher.

  • Starten Sie den Systemmonitor, und erfassen Sie Daten mithilfe des Indikators Maximaler Prozentsatz der Arbeitsspeicherzuweisung der Anforderung. Wenn der Indikatorwert höher als der durch die REQUEST_MAX_MEMORY_GRANT_PERCENT-Einstellung in der Arbeitsauslastungsgruppe ermittelte Wert ist, ist die Abfrage mit großer Wahrscheinlichkeit nicht erfolgreich. Ändern Sie ggf. den Grenzwert für die Arbeitsauslastungsgruppe.

Erweiterte Problembehandlung

Der Fehler Nicht genügend Arbeitsspeicher (701) ist ein allgemeiner Fehler. Er wird zurückgegeben, wenn Tasks versuchen, einen Speicherblock aus dem Speicher-Manager zuzuordnen und dieser Versuch nicht erfolgreich ist. Weitere Informationen finden Sie unter MSSQLSERVER_701.

Dieser Fehler wird durch die folgenden Bedingungen verursacht:

  • Der Speicherpool hat den Gesamtgrenzwert erreicht.
HinweisHinweis

Die Ressourcenkontrolle ist möglicherweise nicht die einzige Ursache dieser Bedingung. Auf dem Server werden ggf. weitere Anwendungen mit Speicherbedarf ausgeführt, die ebenfalls zu dieser Bedingung beitragen.

  • Die Zuweisung von mehreren Seiten oder einem virtuellen Adressraum führt zu einem Fehler, da der virtuelle Adressraum über keinen freien Block verfügt, der für die erforderliche Reservierung groß genug ist. Dieser Fehler tritt vor allem in 32-Bit-Architekturen auf. In 64-Bit-Architekturen ist er eher unwahrscheinlich.

  • Die Zuweisung von mehreren Seiten oder einem virtuellen Adressraum führt zu einem Fehler, da die Gesamtzahl der Commits die Commitgrenze erreicht hat. Dies gilt sowohl für 32-Bit- als auch für 64-Bit-Architekturen.

Wenn eine Fehlermeldung aufgrund von unzureichendem Arbeitsspeicher angezeigt wird, sollten Sie bei der Fehleranalyse mit dem Fehlerprotokoll beginnen. Das Protokoll enthält ähnliche Informationen wie im folgenden Beispiel:

2006-01-28 04:27:15.43 spid51 Failed allocate pages: FAIL_PAGE_ALLOCATION 1

Folgende Fehler können im Fehlerprotokoll aufgezeichnet werden:

  • FAIL_PAGE_ALLOCATION, gefolgt von der Anzahl von Seiten, die zugeordnet werden sollten

  • FAIL_VIRTUAL_RESERVE, gefolgt von der Anzahl an Byte, die reserviert werden sollten

  • FAIL_VIRTUAL_COMMIT, gefolgt von der Anzahl an Byte, für die ein Commit durchgeführt werden sollte

Beachten Sie, dass der Task, der den Fehler wegen unzureichendem Arbeitsspeicher ausgelöst hat, häufig nicht die Ursache des Fehlers ist. Sofern kein Endlostask vorliegt, ist der Fehler wegen unzureichendem Arbeitsspeicher häufig das Ergebnis mehrerer ausgeführter Tasks. Sie müssen daher bei der Fehleranalyse die Systemaktivität im Allgemeinen berücksichtigen, z. B. bei dem häufig auftretenden FAIL_PAGE_ALLOCATION-Fehler.

Eine weitere wichtige Information im Fehlerprotokoll sind die Angaben zum Arbeitsspeicherstatus. Je nach Fehler sollten Sie die Zahlen für einzelne Seiten, mehrere Seiten, virtuell reservierten Speicherplatz oder per Commit übergebenen Speicherplatz für individuelle Speicherclerks beachten. Die Identifizierung der wichtigsten Arbeitsspeicherconsumer ist ein wichtiger Schritt bei der Analyse der Fehlerursache. Die größten Arbeitsspeicherconsumer sind normalerweise die Folgenden:

  • MEMORYCLERK_ * bedeutet, dass die Serverkonfiguration oder die Arbeitsauslastung eine bestimmte Arbeitsspeicherbelegung erfordert. Es sind entsprechende Arbeitsspeicherclerks für SQL Server-Komponenten vorhanden, und einzelne Komponenten können mehrere Arbeitsspeicherclerks aufweisen. Weitere Informationen finden Sie unter sys.dm_os_memory_clerks (Transact-SQL). Sie können die Arbeitsauslastung, die das Problem verursacht hat, teilweise anhand der Arbeitsspeicherclerks identifizieren. Zumeist müssen Sie jedoch die den Arbeitsspeicherclerks zugeordneten Arbeitsspeicherobjekte analysieren, um die Ursache der hohen Arbeitsspeicherauslastung zu ermitteln.

  • CACHESTORE_*, USERSTORE_*, OBJECTSTORE_* sind die Typen von Caches. Eine hohe Arbeitsspeicherauslastung durch einen Cache kann folgende Ursachen haben:

    • Arbeitsspeicher wird aus dem Cache zugewiesen, ist jedoch noch nicht als Eintrag eingefügt, der entfernt werden kann. Dies ist mit dem MEMORYCLERK-Fall weiter oben vergleichbar.

    • Alle Cacheeinträge sind in Gebrauch, sodass sie nicht entfernt werden können. Sie können dies überprüfen, indem Sie den Wert für sys.dm_os_memory_cache_counters anzeigen und die Werte in der Spalte entries_count mit denen in der Spalte entries_in_use_count vergleichen.

  • MEMORYCLERK_SQLQERESERVATIONS zeigt an, wie viel Arbeitsspeicher von der Abfrageausführung (Query Execution, QE) reserviert wurde, um Abfragen mit Sortierungen/Verknüpfungen auszuführen. Wenn bei einer großen Anzahl von Reservierungen ein Fehler wegen unzureichendem Arbeitsspeicher ausgelöst wird, deutet dies zumeist auf einen Serverfehler hin.

Die Arbeitsspeicherstatusausgabe im Fehlerprotokoll zeigt zudem an, welcher Speicherpool verbraucht ist. Die Speicherbroker für jeden Pool geben die Speicherverteilung zwischen entnommenem (Kompilierung), zwischengespeichertem und reserviertem (zugewiesenem) Arbeitsspeicher an. Die Zahlen für die drei Broker entsprechen den vorausgehenden Arbeitsspeicherobjekten, die den Arbeitsspeicherclerks zugeordnet sind. Sie ermitteln, wie viel Arbeitsspeicher einem Pool von einem bestimmten Clerk oder Arbeitsspeicherobjekt zugewiesen ist, indem Sie die Informationen mithilfe eines benutzerdefinierten Skripts aus einem vollständigen Dump extrahieren. Die dynamische Verwaltungssicht sys.dm_os_memory_cache_entries zeigt die Pool-ID an, die jedem Eintrag zugeordnet ist.

Wenn Sie Microsoft Support Services in Anspruch nehmen möchten, halten Sie bitte die folgenden Informationen für unsere Supportmitarbeiter bereit:

  • Das Fehlerprotokoll, in dem der Fehler wegen unzureichendem Arbeitsspeicher und der Arbeitsspeicherstatus zum Zeitpunkt des Fehlers aufgezeichnet wurden.

  • Die Ausgabe der folgenden Anweisungen:

    dbcc memorystatus
    dbcc sqlperf(spinlockstats)
    select * from sys.dm_os_memory_clerks
    select * from sys.dm_os_wait_stats order by wait_type
    select * from sys.dm_os_waiting_tasks
    select * from sys.dm_os_ring_buffers where ring_buffer_type='RING_BUFFER_OOM'
    select * from sys.dm_os_ring_buffers where ring_buffer_type='RING_BUFFER_RESOURCE_MONITOR'
    select * from sys.dm_os_ring_buffers where ring_buffer_type='RING_BUFFER_MEMORY_BROKER'
    select * from sys.dm_os_memory_cache_clock_hands
    
  • Ein mit T8004 erfasster Dump für den unzureichenden Arbeitsspeicher (optional). Dieser Minidump enthält wichtige Informationen, z. B. die Ringpuffer und den Spinlock-/Wartestatus. Der Dumpindikator für T8004 kann ohne Neustart des Servers zurückgesetzt werden, indem Sie T8004 deaktivieren und wieder aktivieren.

Suboptimaler Abfrageplan

In diesem Szenario vermuten Sie, dass eine Abfrage aufgrund eines suboptimalen Abfrageplans zu langsam ausgeführt wird. Wenn dem Abfrageoptimierer aufgrund einer zu niedrigen Grenzwerteinstellung für einen Ressourcenpool nicht genügend Arbeitsspeicher zur Verfügung steht, generiert er ggf. einen suboptimalen Abfrageplan.

Die folgenden Aktionen helfen Ihnen, die optimalen Einstellungen für den Ressourcenpool zu bestimmen:

  • Rufen Sie Daten aus dem Indikator Abfrageoptimierungen/Sekunde ab, und ermitteln Sie, ob die Arbeitsauslastungsgruppe eine hohe Anzahl von Abfragekompilierungen aufweist.

  • Rufen Sie Daten aus dem Indikator Suboptimale Pläne/Sekunde ab, und ermitteln Sie, ob der Abfrageoptimierer häufig suboptimale Pläne erzeugt.

Wenn eine der zuvor genannten Bedingungen gegeben ist, sollten Sie den Arbeitsspeichergrenzwert des Ressourcenpools erhöhen.