Verwandte Themen : Aktuelle Informationen zu SQL Server und Hyperthreading
Kürzlich haben wir unseren Windows 2008 R2-Datenbankserver von einem X5470 auf einen X5560 aktualisiert . Die Theorie ist, dass beide CPUs eine sehr ähnliche Leistung haben, wenn überhaupt, ist der X5560 etwas schneller.
Die Leistung von SQL Server 2008 R2 war am letzten Tag jedoch ziemlich schlecht, und die CPU-Auslastung war ziemlich hoch.
Die Lebenserwartung der Seiten ist enorm. Wir erhalten fast 100% Cachetreffer für die Seiten, daher ist der Speicher kein Problem.
Als ich lief:
SELECT * FROM sys.dm_os_wait_stats
order by signal_wait_time_ms desc
Ich habe:
wait_type waiting_tasks_count wait_time_ms max_wait_time_ms signal_wait_time_ms -------------------------------------------------- ---------- -------------------- -------------------- -------------------- -------------------- XE_TIMER_EVENT 115166 2799125790 30165 2799125065 REQUEST_FOR_DEADLOCK_SEARCH 559393 2799053973 5180 2799053973 SOS_SCHEDULER_YIELD 152289883 189948844 960 189756877 CXPACKET 234638389 2383701040 141334 118796827 SLEEP_TASK 170743505 1525669557 1406 76485386 LATCH_EX 97301008 810738519 1107 55093884 LOGMGR_QUEUE 16525384 2798527632 20751319 4083713 WRITELOG 16850119 18328365 1193 2367880 PAGELATCH_EX 13254618 8524515 11263 1670113 ASYNC_NETWORK_IO 23954146 6981220 7110 1475699 (10 Zeile (n) betroffen)
Ich bin auch gelaufen
-- Isolate top waits for server instance since last restart or statistics clear
WITH Waits AS (
SELECT
wait_type,
wait_time_ms / 1000. AS [wait_time_s],
100. * wait_time_ms / SUM(wait_time_ms) OVER() AS [pct],
ROW_NUMBER() OVER(ORDER BY wait_time_ms DESC) AS [rn]
FROM sys.dm_os_wait_stats
WHERE wait_type NOT IN ('CLR_SEMAPHORE','LAZYWRITER_SLEEP','RESOURCE_QUEUE',
'SLEEP_TASK','SLEEP_SYSTEMTASK','SQLTRACE_BUFFER_FLUSH','WAITFOR','LOGMGR_QUEUE',
'CHECKPOINT_QUEUE','REQUEST_FOR_DEADLOCK_SEARCH','XE_TIMER_EVENT','BROKER_TO_FLUSH',
'BROKER_TASK_STOP','CLR_MANUAL_EVENT','CLR_AUTO_EVENT','DISPATCHER_QUEUE_SEMAPHORE',
'FT_IFTS_SCHEDULER_IDLE_WAIT','XE_DISPATCHER_WAIT', 'XE_DISPATCHER_JOIN'))
SELECT W1.wait_type,
CAST(W1.wait_time_s AS DECIMAL(12, 2)) AS wait_time_s,
CAST(W1.pct AS DECIMAL(12, 2)) AS pct,
CAST(SUM(W2.pct) AS DECIMAL(12, 2)) AS running_pct
FROM Waits AS W1
INNER JOIN Waits AS W2 ON W2.rn <= W1.rn
GROUP BY W1.rn, W1.wait_type, W1.wait_time_s, W1.pct
HAVING SUM(W2.pct) - W1.pct < 95; -- percentage threshold
Und bekam
wait_type wait_time_s pct running_pct CXPACKET 554821.66 65.82 65.82 LATCH_EX 184123.16 21.84 87.66 SOS_SCHEDULER_YIELD 37541.17 4.45 92.11 PAGEIOLATCH_SH 19018.53 2.26 94.37 FT_IFTSHC_MUTEX 14306.05 1.70 96.07
Dies zeigt eine enorme Menge an zeitsynchronisierenden Abfragen, die Parallelität beinhalten (hohes CXPACKET). Darüber hinaus werden vereinzelt viele dieser Problemabfragen auf mehreren Kernen ausgeführt (wir haben nirgendwo in unserem Code MAXDOP-Hinweise).
Der Server ist seit ungefähr einem Tag nicht mehr ausgelastet. Bei der Ausführung von Abfragen treten große Abweichungen auf. In der Regel scheinen viele Abfragen langsamer zu sein als auf unserem vorherigen DB-Server, und die CPU ist sehr hoch.
Wird das Deaktivieren von Hyperthreading dazu beitragen, die CPU-Auslastung zu verringern und den Durchsatz zu erhöhen?
quelle
Antworten:
Ich bin immer noch der Meinung, dass das Testen Ihrer spezifischen Arbeitslast gemäß der ursprünglichen Antwort der einzige Weg ist, um sicher zu sein. Es ist keine ideale Antwort, wenn Sie versuchen, ein Produktionssystem zu optimieren (daher würde ich fragen, ob es möglich ist, ein identisches Testfeld in Systemen zu erhalten, in denen Leistung und Verfügbarkeit wirklich wichtig sind), aber es ist die einzige, die mir wirklich zusagt mit.
Wir können über die Theorie sprechen, ob Hyperthreading die Dinge im Allgemeinen verletzen oder verbessern sollte (ich finde, es ist wahrscheinlicher als Hilfe auf Servern, also würde ich es für eine "generische" Bereitstellung wahrscheinlich deaktivieren), aber es gibt sie Nur ein Weg, um sicher zu gehen, ob es in Ihrem speziellen Fall einen Unterschied macht, und das ist, versuchen Sie es und sehen Sie.
quelle
I stimme zu
Es sieht so aus, als ob wir zwei Dinge abstimmen sollten:
MAXDOP (Maximale Parallelitätsgrade). Alles, was ich lese, deutet darauf hin, dass es wahrscheinlich eine schlechte Idee ist, dies uneingeschränkt zu tun. In der Microsoft-Dokumentation heißt es:
etwas höheres als
8
wird generell nicht empfohlen .. also setze ich es4
erstmal auf. Es war anfangs Null (unbegrenzt).Kostenschwelle für Parallelität. Anscheinend wird der Standardwert von
5
hier nach einigen von mir gefundenen SQL MVP-Beiträgen als ziemlich niedriger Standardwert angesehen. Wir können ihn optimieren, um zu reduzieren, wie viel Parallelität der Scheduler überhaupt versucht.Aber ehrlich gesagt fühlen sich diese als Workarounds an. Ich denke, die wahre Lösung für unsere Arbeitslast (Volltextindexlast) ist die Deaktivierung von HT.
quelle
Anandtech stellte fest, dass es mit der reinen Leselast ein wenig weh tat und mit einer hohen Schreiblast ein bisschen wie ein Gewinn war. Ich habe nichts gesehen, was mich glauben lassen würde, dass es Ihnen einen viel schlechteren Treffer als -5% oder einen viel besseren Gewinn als 15% bescheren würde. Beachten Sie, was mit einem Atom ein großer Gewinn ist, aber das ist eine sehr merkwürdige CPU.
Alles, was Sie geändert haben, war die CPU? Sie haben von 12 MB Cache und 4 Threads, also 3 MB Cache pro Thread, auf 8 MB Cache und 8 Threads, also 1 MB pro Thread, gewechselt. Nun, das ist zu einfach, aber ich wette, das ist es, was Sie umbringt. Früher haben Sie Abfragen im Cache ausgeführt und jetzt werden sie aus dem RAM ausgeführt, da sie mehr als 1 MB, aber weniger als 3 MB benötigen. Das Ausschalten von HT wird wahrscheinlich helfen, aber ich würde auf die alte CPU zurückgreifen. Deaktivieren Sie HT, und Sie erhalten 2 MB pro Thread, aber wenn Ihre Arbeitslast so stark ausfällt, hilft dies nicht. Es kann durchaus sein, dass die alte 12-MB-Cache-CPU für Ihre Arbeitslast erheblich schneller ist.
Ich würde versuchen, HT auszuschalten und zu prüfen, ob dies eine Verbesserung darstellt, aber ich vermute, dass der Cache für Ihre Arbeitslast von größter Bedeutung ist und Sie möglicherweise wieder auf den 12-MB-Chip zurückgreifen müssen.
quelle
Hyperthreading ist im besten Fall nur eine Methode, um das Wechseln von Aufgaben vom Betriebssystem weg zu abstrahieren und auf den Würfel zu setzen, und zwar mit direktem Zugriff auf den L1- und L2-Cache, wodurch das Wechseln von Aufgaben zu einem Crapload schneller wird.
Tests mit VMWare haben ergeben, dass das Deaktivieren von HT unter Standardlast keinen erkennbaren Unterschied und unter hoher Last einen Anstieg um 5% zur Folge hat, da ESXi intelligent genug ist, um den Unterschied zwischen dem "echten" Thread und dem "falschen" Thread zu kennen (Es gibt viel mehr als das, aber das ist in Laien ausgedrückt). SQL Server 2005 ist nicht ganz so schlau, aber in Kombination mit einem aktuellen Betriebssystem sollte die Deaktivierung von HT kaum von Vorteil sein.
Trotzdem stimme ich Ronald zu, dass es höchstwahrscheinlich Ihr L2-Cache sein wird. Ein Rückgang der Cache-Größe um 33% ist erheblich, und wenn wir unsere SQL Server spezifizieren, streben wir jedes Mal einen Cache über die reine Taktrate an.
quelle
Aufgrund meiner Erfahrung ließ HT E / A-Vorgänge auf meinen aktiven Knoten in einem Windows 2008 R2-Cluster (auf dem SQL Server 2008 R2 ausgeführt wird) für immer dauern. Interessanterweise spiegelte sich dies weder in den Wartestatistiken noch in dem PSS-Tag wider, den ich für den Microsoft-Support ausgeführt habe.
Die Art und Weise, wie ich niedrige E / A bemerkte, bestand nur darin, die Zähler des Betriebssystems für die physische Festplatte zu überwachen. Wie Sam betonte, schrieb ich hier und hier darüber
Wenn Sie KEINE E / A-Probleme haben und CPU-gebunden sind, sollten Sie folgendermaßen beginnen:
Stellen Sie fest, welche Prozesse und T-SQL-Blöcke die meiste CPU-Auslastung verursachen. Nach unserer Erfahrung haben wir, nachdem wir das Problem mit E / A behoben hatten (indem wir HT deaktiviert haben), Code identifiziert, der 2008 R2 eine fürchterliche Leistung erbrachte und 2005 einwandfrei lief. Ich habe hier darüber geschrieben .
Führen Sie unter hoher Last Adam Machanics sp_whoisactive aus. Sie können es hier herunterladen . Wir hatten eine sehr hohe CPU-Auslastung aufgrund der übermäßigen Anzahl logischer Lesevorgänge (20 Millionen pro Abfrage) aufgrund eines wirklich schlechten Plans. Unsere Prozesse führten Anti-Semi-Joins mit partitionierten Tabellen durch.
Meine nächste Empfehlung lautet, Profiler auszuführen, um eine Reihe von T-SQL-Code zu identifizieren, die sowohl hohe CPU- als auch E / A-Werte aufweisen.
Mit den oben genannten Schritten konnten wir die anstößigen Prozesse optimieren und von einer zu 85% anhaltenden CPU-Auslastung auf fast null wechseln.
Viel Glück und bitte zögern Sie nicht, mir eine Nachricht zu schicken, wenn Sie eine Lösung finden, da ich den Fall meinem Blog hinzufügen möchte.
Vielen Dank
Oscar
quelle
Ob HT gut oder schlecht ist, ist schwer zu sagen.
Es hängt wirklich vom Serverlastmuster ab, das auf Erfahrung und Lesen basiert. Das heißt, wenn es die Leistung beeinträchtigt, ist es so schlimm : sonst merkt man es nicht.
Die Theorie, die ich gelesen habe, war, dass die Threads den Cache teilen, was bedeutet, dass unter widrigen Umständen jeder Thread den Cache des anderen Threads überschreiben kann. Wenn Sie nicht viel Parallelität haben oder Ihre Last viele kurze Abfragen enthält, hat dies möglicherweise keine Auswirkungen auf Sie.
Ich habe es mit MAXDOP und Prozessoraffinität versucht (damals in meiner letzten echten DBA-Rolle in SQL Server 2000), konnte aber nie etwas aussagekräftiges finden: sondern nur für meinen Shop zu dieser Zeit.
Als schnellen Test können Sie die Prozessoraffinität so einstellen, dass nur physische Kerne (die niedrigeren Zahlen) verwendet werden, und sehen, was passiert.
Sie verlieren jedoch höchstens die Hälfte Ihrer Kerne. Heutzutage ist das vielleicht egal im Vergleich zu dem, mit dem ich vor ein paar Jahren gespielt habe, als es 2 gegen 4 oder 4 gegen 8 war. Jetzt ist es 8 gegen 16 oder 16 gegen 32.
Edit: Ein Test von Slava Oks
quelle
Leider glaube ich nicht, dass Sie eine definitivere Antwort bekommen werden als "Schalten Sie das Hyperthreading aus und sehen Sie, ob das hilft".
Trotz der hilfreichen Antwort von Jonathan in meinem Original-Thread (den Sie in Ihrer Frage verlinkt haben) konnte ich keine endgültigen Beweise für die Auswirkungen von HT auf die von mir untersuchten Server erhalten. In meinem Fall waren die Server bereits für den Austausch vorgesehen, daher überlassen wir diesen Austausch sozusagen der "Behebung des Problems".
Mein Rat:
Versuchen Sie es mit einer Einstellung für den maximalen Parallelitätsgrad auf Serverebene von 1 . Parallelität in SQL ist ohnehin am nützlichsten für größere, länger laufende Abfragen, und Ihre Last (ich nehme an) besteht ohnehin aus einer enorm hohen Anzahl kleinerer Abfragen. Dies sollte das Warten auf CXPACKET vollständig verhindern. Dies könnte dazu führen, dass bestimmte einzelne Abfragen etwas länger ausgeführt werden, sollte jedoch einen höheren "Durchsatz" aller Abfragen auf dem Server ermöglichen.
Ich habe gute Ergebnisse auf OLTP-Servern erzielt. Für andere Arten von Servern (Berichtsserver, Verarbeitungsserver, Data Warehousing) muss MAXDOP auf jeden Fall höher eingestellt werden.
Und um es klar zu machen, diese Einstellung würde es SQL weiterhin ermöglichen, mehrere Threads für jede einzelne Tabelle in einem JOIN zu verwenden, sodass Sie die Parallelität nicht wirklich vollständig beseitigen.
Zumindest einen Versuch wert, da diese Einstellungsänderung sofort wirksam wird und Sie nicht einmal den SQL-Dienst neu starten müssen: http://msdn.microsoft.com/en-us/library/ms181007.aspx
Dies bedeutet, dass Sie wechseln könnten es sofort zurück, wenn die Dinge zur Hölle gingen.
Das Deaktivieren von Hyperthreading im BIOS würde einen vollständigen Neustart des Servers erfordern, ist also etwas riskanter.
quelle
Im Grunde hatten wir auch eine unerwartet schlechte Leistung nach einem Server-Upgrade. Es stellte sich heraus, dass es Probleme mit dem BIOS und der CPU-Energieeinsparung gab. Die Standardeinstellung auf dem Server (HP) war, die Steuerung der CPU-Geschwindigkeit durch das Betriebssystem zu ignorieren und einen eigenen Algorithmus zu verwenden. Die Umstellung auf die Betriebssystemsteuerung und die Aktualisierung des BIOS führten zu erheblichen Verbesserungen. Es gab einige Versionshinweise (die jetzt nicht gefunden werden können), dass ein BIOS-Fehler aufgetreten ist, der die CPU auf den niedrigsten Leistungsstatus gesperrt hat.
https://serverfault.com/a/196329/6390
quelle