Warum wird meine Azure SQL-Datenbank (SQL Server) für bestimmte Zeiträume mit Daten-E / A überlastet? [geschlossen]

9

Ich verwende eine Azure SQL-Datenbank unter der S2-Edition (50 DTUs). Die normale Nutzung des Servers hängt normalerweise bei 10% DTU. Dieser Server gerät jedoch regelmäßig in einen Zustand, in dem die DTU-Nutzung der Datenbank stundenlang an 85-90% gesendet wird. Dann geht es plötzlich wieder auf den normalen Verbrauch von 10% zurück.

Geben Sie hier die Bildbeschreibung ein

Abfragen der Anwendung an den Server scheinen in diesem überlasteten Zustand immer noch schnell zu funktionieren.

Ich kann den Server von S2 => irgendetwas skalieren (z. B. S3) => S2 und es scheint zu löschen, in welchem ​​Zustand er hängt. Einige Stunden später wiederholt er jedoch wieder denselben überlasteten Zustandszyklus. Eine andere seltsame Sache, die mir aufgefallen ist, ist, dass ich dieses Verhalten nicht beobachtet habe, wenn ich diesen Server rund um die Uhr auf einem S3-Plan (100 DTU) laufen lasse. Es scheint nur aufzutreten, wenn ich die Datenbank auf einen S2-Plan (50 DTU) verkleinert habe. Auf dem S3-Plan sitze ich immer bei 5-10% DTU-Auslastung. Offensichtlich nicht ausgelastet.

Ich habe in Azure SQL-Abfrageberichten nach unerwünschten Abfragen gesucht, sehe jedoch nichts Ungewöhnliches und zeige, dass meine Abfragen Ressourcen verwenden, wie ich es erwarten würde.

Geben Sie hier die Bildbeschreibung ein

Wie wir hier sehen können, stammt die Verwendung ausschließlich von Data IO. Wenn ich den Leistungsbericht hier ändere, um die wichtigsten Daten-E / A-Abfragen von MAX anzuzeigen, sehen wir Folgendes:

Geben Sie hier die Bildbeschreibung ein

Ein Blick auf diese lang anhaltenden Anforderungen scheint auf statistische Aktualisierungen hinzudeuten. Von meiner Anwendung läuft eigentlich nichts. Beispielsweise zeigt die Abfrage 16302 dort:

SELECT StatMan([SC0], [SC1], [SC2], [SB0000]) FROM (SELECT TOP 100 PERCENT [SC0], [SC1], [SC2], step_direction([SC0]) over (order by NULL) AS [SB0000]  FROM (SELECT [UserId] AS [SC0], [OrganizationId] AS [SC1], [Id] AS [SC2] FROM [dbo].[Cipher] TABLESAMPLE SYSTEM (1.250395e+000 PERCENT) WITH (READUNCOMMITTED) ) AS _MS_UPDSTATS_TBL_HELPER ORDER BY [SC0], [SC1], [SC2], [SB0000] ) AS _MS_UPDSTATS_TBL  OPTION (MAXDOP 16)

Andererseits zeigt der Bericht auch, dass diese Abfragen nur einen kleinen Prozentsatz der Daten-E / A-Nutzung auf dem Server verwenden (<4%). Im Rahmen der regelmäßigen Wartung führe ich wöchentlich Statistikaktualisierungen (und Indexwiederherstellungen) für die gesamte Datenbank durch.

In diesem weiteren Bericht werden MAX-Daten-E / A-Abfragen für einen Zeitraum angezeigt, der nur mehrere Stunden während des Vorfalls mit hoher Ressourcennutzung umfasst.

Geben Sie hier die Bildbeschreibung ein

Wie wir sehen können, gibt es eigentlich keine Abfragen, die eine signifikante E / A-Nutzung von Daten melden.

Ich bin auch gelaufen sp_who2und sp_whoisacivein der Datenbank und sehe nicht wirklich, dass etwas auf mich herausspringt (obwohl ich zugeben werde, dass ich kein Experte mit diesen Tools bin).

Wie finde ich heraus, was hier los ist? Ich glaube nicht, dass eine meiner Anwendungsabfragen für diese Ressourcennutzung verantwortlich ist, und ich habe das Gefühl, dass im Hintergrund auf dem Server ein interner Prozess ausgeführt wird, der ihn beendet.

kspearrin
quelle
Sie sehen also, dass Update-Statistiken ausgeführt werden, die natürlich mit angemessenen E / A-Kosten verbunden sind, oder? Wenn diese Abfrage über einen Zeitraum von 24 Stunden 4% des gesamten E / A ausmacht, könnte sie Ihrer Meinung nach immer noch zu den Spitzen beitragen, die Sie in der Grafik sehen? Ich würde zögern, das Wort "überladen" zu verwenden, wenn Sie Ihre DTU nicht voll ausschöpfen und Ihre Abfrageleistung ebenfalls noch akzeptabel ist. Warum ist es ein Problem, dass der Server seine Ressourcen im Laufe der Zeit unterschiedlich nutzt?
LowlyDBA
@ LowlyDBA Ich bin nicht sicher, wie ich überprüfen kann, ob die Abfrage dies verursacht. Wenn es nur 4% Auslastung anzeigt, würde ich nicht denken, dass dies zu einer nahezu 100% igen Auslastung des gesamten DTU-Schwellenwerts führen würde. Es gibt eine Menge Nutzung, die hier nicht berücksichtigt wird. Grundsätzlich versuche ich herauszufinden, warum dies geschieht. Die konstanten stundenlangen Spitzen bringen den Server sehr nahe an 100%, und wie bereits erwähnt, scheint dies überhaupt nicht zu passieren, wenn ich die verfügbaren DTU-Ressourcen verdopple (S3-Plan).
Kspearrin
Denken Sie daran, DTU ist nicht nur E / A, sondern auch CPU und Speicher . Ein Vergleich der beiden ist also wahrscheinlich keine hilfreiche Metrik. Was bietet Ihnen das Tool zur Einsicht in die Abfrageleistung für eine visuelle Aufschlüsselung der Ressourcen in einem kleineren Fenster (nur die Stunden, in denen Sie die Spitze sehen)?
LowlyDBA
@LowlyDBA Die oben veröffentlichten Berichts-Screenshots scheinen deutlich zu machen, dass die Ressourcen alle von Data IO stammen. CPU und Log IO spielen keine große Rolle. Wenn Sie beispielsweise Abfragen von Max CPU% betrachten, zeigt dies nur auf den größten Täter, der über mehrere Stunden hinweg nur 2% verwendet, während das Problem auftritt. Screenshot: imgur.com/rxyMLc9
kspearrin
1
@DirkBoer In unserem Fall scheint dies mit aggregierten Statistikabfragen auf dem Server zu tun zu haben. Wir haben die automatische Statistik für bestimmte Tabellen deaktiviert, um das Problem zu beheben.
Kspearrin

Antworten:

1

Angesichts der Tatsache, dass Ihre Protokollaktivität während der Spitze (n) minimal ist, können wir davon ausgehen, dass kein (oder viel) DUI stattfindet.

Sie erwähnen an einer Stelle, dass die Spitze die Leistung nicht beeinträchtigt, und an einer anderen, dass dies der Fall ist. Welches ist es?

Sie erwähnen auch, dass dies nach einer Skalenoperation verschwindet. Dies ist sinnvoll, da es einem lokalen Neustart entspricht, bei dem alle Prozesse usw. effektiv abgebrochen werden.

Gehe ich richtig davon aus, dass auf diese Datenbank von der Anwendungsebene aus zugegriffen wird? Wenn ja, vermute ich, dass Ihre Verbindungen nicht ordnungsgemäß geschlossen werden . Der Garbage Collector soll sich letztendlich um diese kümmern (worauf man sich nicht verlassen sollte), aber ich habe gesehen, dass genau diese Situation aufgrund nicht geschlossener Verbindungen von der App-Ebene auftritt. In unserem Fall war die Anwendung so ausgelastet, dass wir schließlich gleichzeitig Verbindungsfehler erhielten, was uns zu dem Problem führte.

Versuchen Sie die folgende Abfrage während des Spikes:

SELECT
    c.session_id, c.net_transport, c.encrypt_option,
    s.status,
    c.auth_scheme, s.host_name, s.program_name,
    s.client_interface_name, s.login_name, s.nt_domain,
    s.nt_user_name, s.original_login_name, c.connect_time,
    s.login_time
FROM sys.dm_exec_connections AS c
JOIN sys.dm_exec_sessions AS s
    ON c.session_id = s.session_id
ORDER BY c.connect_time ASC

Wenn ich richtig liege, finden Sie eine ganze Reihe von Datensätzen, die mit dem Status Sleepingoder schlechter zurückgegeben wurden Running. Wenn dies der Fall ist, haben Sie noch größere Probleme in der App-Ebene.

Wir können dies weiter debuggen, indem wir die Datenbank kopieren, die folgende Abfrage verwenden (Basisstufe verwenden, um übermäßige Kosten zu vermeiden) und dieses Verhalten überwachen.

CREATE DATABASE Database1_copy AS COPY OF Database1 ( EDITION = 'basic' );
Zuhälter
quelle
1
Ja, auf die Datenbank wird von einer Anwendungsebene aus zugegriffen, aber soweit ich das beurteilen kann, sind alle Verbindungen ordnungsgemäß in usingAnweisungen eingeschlossen. Die Informationen, die ich in der ursprünglichen Frage gepostet habe, scheinen darauf hinzudeuten, dass die Daten-E / A für die Spitzen verantwortlich sind.
Kspearrin
1
@pimbrouwers: Kannst du genau erklären, warum eine Verbindung im Schlaf- / Laufzustand schlecht ist? Mein Verständnis von Verbindungspooling war, dass sich die Verbindungen im Rahmen des normalen Betriebs in einem solchen Zustand befinden könnten.
Obaylis