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

  • 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

    Mittwoch, 20. August 2014 15:14

Alle Antworten

  • Hi,

    klingt nach Paging....

    Ist Memory für SQL Server vielleicht nicht sinnvoll limitiert?


    Bodo Michael Danitz - MCT, MCITP - free consultant - performance specialist - www.sql-server.de

    Mittwoch, 20. August 2014 15:20
  • Hey,

    habe die SharePoint-DB, SSEE-DB und SBSMonitoring-DB auf 1GB begrenzt...

    Mittwoch, 20. August 2014 15:26
  • 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


    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

    Donnerstag, 21. August 2014 12:47
  • 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

    Donnerstag, 21. August 2014 13:35
  • 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

    Freitag, 22. August 2014 08:37
  • 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

    Freitag, 22. August 2014 12:48
  • habe jetzt nochmal nachgeschaut.

    Min Server Memory liegt auf 0

    Max Server Memory bei 1024

    Also daran sollte es nicht liegen.

    SharePoint-DB und sbsmonitoring-DB liegt der max Wert ebenfalls bei 1024 MB

    Freitag, 22. August 2014 14:16
  • 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

    Freitag, 22. August 2014 14:51
  • 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)

    Donnerstag, 28. August 2014 07:51
  • 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

    Donnerstag, 28. August 2014 08:57