Hiermit werden blockierte Sitzungen für eine SQL-Instanz unter Linux überwacht. Hinweis: Dieser Monitor ist standardmäßig deaktiviert. Verwenden Sie bei Bedarf Außerkraftsetzungen, um ihn zu aktivieren.
Der Monitor für blockierende Sitzungen erkennt, ob eine Blockierungssituation besteht.
Eine Blockierung tritt auf, wenn eine Sitzung eine bestimmte Ressource sperrt und eine zweite Sitzung versucht, für dieselbe Ressource einen in Konflikt stehenden Sperrtyp anzufordern. Die Blockierung ist ein unvermeidbares Merkmal von Managementsystemen für relationale Datenbanken (RDBMS) mit sperrbasierter Parallelität. Zu viele Blockierungen können jedoch zu Leistungsproblemen führen.
Wenn die Anzahl von Sperr- und Blockierungsvorgängen so stark zunimmt, dass die Systemleistung erheblich beeinträchtigt wird, ist dies normalerweise auf eine der folgenden Ursachen zurückzuführen:
Eine Sitzung sperrt eine Reihe von Ressourcen und gibt sie nie frei. Dies wird normalerweise verursacht durch:
Abgebrochene Abfragen, für die kein Rollback durchgeführt wird
Verwaiste Transaktionen
Eine (durch eine session_id oder SPID identifizierte) Sitzung sperrt eine Reihe von Ressourcen für einen längeren Zeitraum, bevor die Sperren freigegeben werden. Dies wird normalerweise verursacht durch:
Transaktionen mit langer Ausführungszeit
Keine geeigneten Indizes
Nicht ordnungsgemäße Verwendung von Sperrhinweisen
Andere Probleme in Bezug auf unzureichenden Anwendungsentwurf
Beenden der Sitzung zu Beginn der Blockierungskette
Verkürzen der Transaktionszeiten
Erstellen geeigneter Indizes
Verwenden von Sperrhinweisen. Siehe SQL Server-Onlinedokumentation
Verwenden von auf der Zeilenversionsverwaltung basierenden Isolationsstufen
Konfigurieren von SQL Server-Einstellungen (Speichereinstellungen, Sperrtimeouts usw.)
Ändern der Schwellenwerte des Monitors für diese Datenbank oder für alle Datenbanken
Wenn blockierte Sitzungen für die Datenbank nicht relevant sind, haben Sie zudem folgende Möglichkeiten:
Deaktivieren des Monitors für diese Datenbank oder für alle Datenbanken
Name | Beschreibung | Standardwert |
Warnungspriorität | Definiert die Warnungspriorität. | Hoch |
Warnungsschweregrad | Definiert den Warnungsschweregrad. | Fehler |
Aktiviert | Aktiviert oder deaktiviert den Workflow. | Ja |
Generiert Warnungen | Definiert, ob der Workflow eine Warnung generiert. | Ja |
Intervall (Sekunden) | Gibt das Wiederholungsintervall in Sekunden für die Ausführung des Workflows an. | 300 |
Anzahl blockierter Sitzungen | Die maximal erlaubte Anzahl blockierter Sitzungen. | 1 |
Synchronisierungszeit | Die Synchronisierungszeit, angegeben im 24-Stunden-Format. Dieser Wert kann ausgelassen werden. |
|
Timeout (Sekunden) | Gibt die Zeit an, zu der der Workflow ausgeführt werden dann, bevor er geschlossen und als fehlerhaft markiert wird. | 200 |
Timeout für Datenbankverbindung (Sekunden) | Es tritt ein Fehler beim Workflow auf, und ein Ereignis wird registriert, wenn der Workflow nicht innerhalb des angegebenen Zeitraums auf die Datenbank zugreifen kann. | 15 |
Wartezeit (Minuten) | Die Mindestdauer der Prozessausführung, bevor eine Analyse auf blockierte SPIDs in Betracht gezogen wird. | 1 |
Target | Microsoft.SQLServer.Linux.DBEngine | ||
Parent Monitor | System.Health.PerformanceState | ||
Category | PerformanceHealth | ||
Enabled | False | ||
Alert Generate | True | ||
Alert Severity | Error | ||
Alert Priority | High | ||
Alert Auto Resolve | True | ||
Monitor Type | Microsoft.SQLServer.Linux.MonitorType.DBEngine.BlockingSessions | ||
Remotable | True | ||
Accessibility | Public | ||
Alert Message |
| ||
RunAs | Default |
<UnitMonitor ID="Microsoft.SQLServer.Linux.Monitor.DBEngine.BlockingSessions" Accessibility="Public" Enabled="false" Target="SqlDiscL!Microsoft.SQLServer.Linux.DBEngine" ParentMonitorID="Health!System.Health.PerformanceState" Remotable="true" Priority="Normal" TypeID="Microsoft.SQLServer.Linux.MonitorType.DBEngine.BlockingSessions" ConfirmDelivery="false">
<Category>PerformanceHealth</Category>
<AlertSettings AlertMessage="Microsoft.SQLServer.Linux.Monitor.DBEngine.BlockingSessions.AlertMessage">
<AlertOnState>Error</AlertOnState>
<AutoResolve>true</AutoResolve>
<AlertPriority>High</AlertPriority>
<AlertSeverity>Error</AlertSeverity>
<AlertParameters>
<AlertParameter1>$Data/Context/Property[@Name='BlockedSPIDList']$</AlertParameter1>
<AlertParameter2>$Target/Property[Type="SqlCoreLib!Microsoft.SQLServer.Core.DBEngine"]/InstanceName$</AlertParameter2>
<AlertParameter3>$Target/Property[Type="SqlCoreLib!Microsoft.SQLServer.Core.DBEngine"]/MachineName$</AlertParameter3>
</AlertParameters>
</AlertSettings>
<OperationalStates>
<OperationalState ID="Blocked" MonitorTypeStateID="Blocked" HealthState="Error"/>
<OperationalState ID="NotBlocked" MonitorTypeStateID="NotBlocked" HealthState="Success"/>
</OperationalStates>
<Configuration>
<MachineName>$Target/Property[Type="SqlCoreLib!Microsoft.SQLServer.Core.DBEngine"]/MachineName$</MachineName>
<NetbiosComputerName>$Target/Property[Type="SqlCoreLib!Microsoft.SQLServer.Core.DBEngine"]/NetbiosComputerName$</NetbiosComputerName>
<InstanceName>$Target/Property[Type="SqlCoreLib!Microsoft.SQLServer.Core.DBEngine"]/InstanceName$</InstanceName>
<ConnectionString>$Target/Property[Type="SqlCoreLib!Microsoft.SQLServer.Core.DBEngine"]/ConnectionString$</ConnectionString>
<InstanceVersion>$Target/Property[Type="SqlCoreLib!Microsoft.SQLServer.Core.DBEngine"]/Version$</InstanceVersion>
<InstanceEdition>$Target/Property[Type="SqlCoreLib!Microsoft.SQLServer.Core.DBEngine"]/Edition$</InstanceEdition>
<IntervalSeconds>300</IntervalSeconds>
<SyncTime/>
<WaitMinutes>1</WaitMinutes>
<NumberBlockedSPIDs>1</NumberBlockedSPIDs>
<TimeoutSeconds>200</TimeoutSeconds>
<SqlTimeoutSeconds>15</SqlTimeoutSeconds>
</Configuration>
</UnitMonitor>