Fragensteller
MSSQL$MICROSOFT##SSEE Dienst verbraucht dauerhaft min. 25% CPU-Auslastung SBS2011

Frage
-
Hallo zusammen,
ich habe bei einem Kunden folgendes Problem:
der Prozess sqlservr.exe hat dauerhaft eine CPU-Auslastung von 25% oder mehr!
Sobald ich den Dienst MSSQL$MICROSOFT##SSEE beende, geht die Auslastung runter und der Server läuft flüssig. Wenn ich dann den Dienst wieder starte, bleibt für ein paar Stunden die sqlservr-CPU-Auslastung normal, aber geht dann wieder dauerhaft auf 25% hoch.
Bei dieser Auslastung dauert dann das anmelden ewig, die Netzwerkverbindungen brechen öfters ab und per remote kommt man nicht mehr auf den Server.
Ich habe schon ewig gegoogelt, aber noch keine Lösung für das Problem gefunden.
Infos zum Server:
SBS2011 virtualisiert
16GB RAM
Wäre sehr dankbar für eure Hilfe!
Gruß
Hennes88
Alle Antworten
-
Was sagt denn der Task Manager, wieviel RAM noch verfügbar bzw. frei ist, wenn die CPU so hoch geht? Was sagt der Ressourcenmonitor, wer wieviel CPU-Zeit und DiskIO macht?
Bodo Michael Danitz - MCT, MCITP - free consultant - performance specialist - www.sql-server.de
- Bearbeitet Bodo Michael Danitz Mittwoch, 20. August 2014 15:39
-
ich habe den Dienst heute morgen nochmals gestartet. bis jetzt läuft der Server aber noch normal.
Durch den Exchange ist der RAM natürlich sehr ausgelastet. 15,3GB werden gebraucht! Die CPU-Auslastung steigt nicht wirklich hoch! Läuft noch alles normal!
CPU-Zeit fällt im normalen Betrieb nichts großes auf und der Prozess sqlservr.exe ändert extrem seine Werte beim Lesen und Schreiben auf den Datenträger.
Ich melde mich nochmals sobald, der Prozess wieder die extreme Auslastung aufweist und gebe die dann aktuellen Werte durch
-
15,3 GB !!! ???
Das ist natürlich übel, denn SQL Server und das OS möchten ja auch was haben. Umso wahrscheinlicher ist es, dass da was ins Pagefile geht und die Büchse so lahm wird.
Möglicherweise sollte man den SQL Server mit "Lock Pages in Memory" an physikalischen Speicher binden, so dass Buffer Cache nicht ausgelagert werden kann. Besser noch der VM zusätzliches RAM zuweisen. Wie groß sind die Datenbanken auf SQL Server?
Bodo Michael Danitz - MCT, MCITP - free consultant - performance specialist - www.sql-server.de
-
Ich habe mal bei unseren anderen SBS-Kunden nachgeschaut. Der RAM ist immer so hoch belastet!
Wir haben Kunden mit weniger als 16GB RAM und bei diesen läuft der Server normal! Mehr RAM können wir der SBS-VM auch nicht zuweisen, mehr gibt's aktuell nicht.
Seid dem Neustart des mssql$Microsoft##SSEE-Dienstes läuft der Server aber noch rund! Der Prozess sqlservr.exe hat noch eine normale Auslastung.
WSUS-DB ist 7GB groß
sbsmonitoring-DB: 3GB
SharePoint-DB: 400MB
-
Sind Werte für "min/max server memory (MB)" eingetragen oder steht alles auf Standardwerten?
Ich würde folgende Werte vorschlagen:
min server memory (MB): 500 MB - 1 GB
max server memory (MB): 1500 MB - 2GB
So kann Exchange sich immer noch gut ausbreiten, und SQL Server bekommt sein Minimum. Ohne Begrenzung nach oben könnte sich SQL Server unnötig viel RAM ziehen, besonders um die Patch-Days :-)
Bodo Michael Danitz - MCT, MCITP - free consultant - performance specialist - www.sql-server.de
-
Tja... dann bleibt wohl nur das Monitoring aller Ressourcen, wenn es nochmals passiert... und dann per DAC von einer Workstation mit dem SQL Server verbinden. Hierzu muss "remote admin connections" = 1 sein.
Bodo Michael Danitz - MCT, MCITP - free consultant - performance specialist - www.sql-server.de
-
Hallo Hennes,
wieviele Cores hast Du in der VM?
welche Version von SQL Server (32 / 64bit)>Max Server Memory bei 1024
Das ist nicht Dein Ernst, oder :)
Da darfst Du dich nicht wundern, dass das System "überlastet"...
Führe doch bitte mal das folgende Script aus... - mich würde interessieren, welche "Bottlenecks" das System bei Dir hat. Das Ergebnis mal in einer lesbaren Form hier posten ...
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 WITH (NOLOCK) WHERE wait_type NOT IN (N'CLR_SEMAPHORE',N'LAZYWRITER_SLEEP',N'RESOURCE_QUEUE',N'SLEEP_TASK', N'SLEEP_SYSTEMTASK',N'SQLTRACE_BUFFER_FLUSH',N'WAITFOR', N'LOGMGR_QUEUE',N'CHECKPOINT_QUEUE', N'REQUEST_FOR_DEADLOCK_SEARCH',N'XE_TIMER_EVENT',N'BROKER_TO_FLUSH',N'BROKER_TASK_STOP',N'CLR_MANUAL_EVENT', N'CLR_AUTO_EVENT',N'DISPATCHER_QUEUE_SEMAPHORE', N'FT_IFTS_SCHEDULER_IDLE_WAIT', N'XE_DISPATCHER_WAIT', N'XE_DISPATCHER_JOIN', N'SQLTRACE_INCREMENTAL_FLUSH_SLEEP', N'ONDEMAND_TASK_QUEUE', N'BROKER_EVENTHANDLER', N'SLEEP_BPOOL_FLUSH')) 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 < 99.5 OPTION (RECOMPILE);
Weiterhin würde mich mal interessieren, welche Datenbanken die höchste CPU-Last erzeugen:
WITH DB_CPU_Stats AS (SELECT DatabaseID, DB_Name(DatabaseID) AS [Database Name], SUM(total_worker_time) AS [CPU_Time_Ms] FROM sys.dm_exec_query_stats AS qs CROSS APPLY (SELECT CONVERT(int, value) AS [DatabaseID] FROM sys.dm_exec_plan_attributes(qs.plan_handle) WHERE attribute = N'dbid') AS F_DB GROUP BY DatabaseID) SELECT ROW_NUMBER() OVER(ORDER BY [CPU_Time_Ms] DESC) AS [CPU Rank], [Database Name], [CPU_Time_Ms] AS [CPU Time (ms)], CAST([CPU_Time_Ms] * 1.0 / SUM([CPU_Time_Ms]) OVER() * 100.0 AS DECIMAL(5, 2)) AS [CPU Percent] FROM DB_CPU_Stats WHERE DatabaseID <> 32767 -- ResourceDB ORDER BY [CPU Rank] OPTION (RECOMPILE);
Und last but not least bitte noch die Liste der Abfragen, die sehr "teuer" sind:
SELECT TOP (100) qs.execution_count, qs.total_rows, qs.last_rows, qs.min_rows, qs.max_rows, qs.last_elapsed_time, qs.min_elapsed_time, qs.max_elapsed_time, total_worker_time, total_logical_reads, SUBSTRING(qt.TEXT,qs.statement_start_offset/2 +1, (CASE WHEN qs.statement_end_offset = -1 THEN LEN(CONVERT(NVARCHAR(MAX), qt.TEXT)) * 2 ELSE qs.statement_end_offset END - qs.statement_start_offset)/2) AS query_text FROM sys.dm_exec_query_stats AS qs WITH (NOLOCK) CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt ORDER BY qs.execution_count DESC OPTION (RECOMPILE);
Dann kann man sich - hoffentlich - ein Bild von der Situation IM SQL Server machen.
Das Du dich nicht mehr mit dem SQL Server verbinden kannst, hört sich für mich ein wenig nach Threadpool-Starvation an. Daher auch meine Frage nach der Anzahl der Cores in Deiner Umgebung.
Details zu den "Worker Threads" findest Du hier:
http://technet.microsoft.com/de-de/library/ms187024(v=sql.105).aspx
Um Threadpool-Starvation zu verstehen, hat Klaus Aschenbrenner ein schönes Beispiel verwendet:
http://www.sqlpassion.at/archive/2011/10/25/troubleshooting-threadpool-waits/
MCM - SQL Server 2008
MCSE - SQL Server 2012
db Berater GmbH
SQL Server Blog (german only) -
Hi Uwe,
das ist ein SBS2011 mit
"WSUS-DB ist 7GB groß, sbsmonitoring-DB: 3GB, SharePoint-DB: 400MB"
also ca. 10GB Datenbanken. Dann läuft da ein RAM-hungriges Exchange drauf... eine ohnehin unglückliche Konstellation, aber so ist das bei SBS ja schon immer gewesen. Da sollte man den SQL Server wohl "klein halten", denn seine Hauptanwendung scheint mir WSUS zu sein, der ja nur um die Patchdays richtig Arbeit bekommt, dann aber auch richtig fies zu SQL Server ist. Man sollte also den Buffer Pool nach oben begrenzen, etwa mit 10-20% der zu verwaltenden Datenbankgröße. Ich würde da aber auch ein unteres Limit empfehlen, damit Exchange den SQL Server nicht vollends aushungern kann. So kam ich auf min 1GB und max 2 GB.
Ungeachtet dessen muss man natürlich die Ressourcen im Auge behalten, auch den Threadpool, der unter Stress mit hoher Wahrscheinlichkeit Wartezeiten hat, was aber noch keine Aussage über die Ursache dieser gestattet. Hier kämen evntuell auch IO-Bottlenecks in Betracht (gerade auch wegen der Virtualisierung), oder der immer wieder mal zuschlagende TokenAndPermUserStore, oder überforderte CPUs oder sonst was. Irgendeine Ressource wird schon zu knapp sein... was aber schon "by Design" des SBS vorprogrammiert ist.
Da muss man mal gucken, wenn's wieder passiert....
Bodo Michael Danitz - MCT, MCITP - free consultant - performance specialist - www.sql-server.de