WSUS Server – Hoge CPU belasting

Wanneer je een WSUS Server draait kan het op een gegeven moment voorkomen dat de CPU belasting toeneemt tot continue tegen de 100%.
Mogelijk moet er dan onderhoud uitgevoerd worden omdat de database te groot geworden is.
WSUS kent in de console het opruimen van overbodige updates, maar vaak is dat niet genoeg en soms lukt dit niet eens omdat de console steeds crasht.

WSUS Onderhoud uitvoeren

Het uitvoeren van onderhoud bestaat uit een aantal zaken :

  1. Het op DB niveau opruimen van overbodige updates
  2. Het herindexeren van de DB
  3. Het shrinken van de DB bestanden

Voorbereiding :

Om het onderhoud uit te kunnen voeren hebben we de MS SQL Management Studio nodig.
Deze is hier te downloaden. Na het downloaden kan deze eenvoudig geinstalleerd worden.

Eenmaal geinstalleerd, kunnen we verder met het onderhoud.

Onderhoud uitvoeren

Stap 1 : Op DB niveau opruimen van overbodige updates

Start de SQL Manager Studio als Administrator en bij connection voer je het volgende server adres in :

np:\\.\pipe\MICROSOFT##WID\tsql\query

Gebruik de Domain administrator credentials om in te loggen

Wanneer de connectie opgebouwd is vouw je de map Databases uit en selecteer je de database SUSDB

Open een nieuwe query en kopieer/plak het volgende script :

DECLARE @var1 INT
DECLARE @msg nvarchar(100)

CREATE TABLE #results (Col1 INT)
INSERT INTO #results(Col1) EXEC spGetObsoleteUpdatesToCleanup

DECLARE WC Cursor
FOR
SELECT Col1 FROM #results

OPEN WC
FETCH NEXT FROM WC
INTO @var1
WHILE (@@FETCH_STATUS > -1)
BEGIN SET @msg = ‘Deleting ‘ + CONVERT(varchar(10), @var1)
RAISERROR(@msg,0,1) WITH NOWAIT EXEC spDeleteUpdate @localUpdateID=@var1
FETCH NEXT FROM WC INTO @var1 END
CLOSE WC
DEALLOCATE WC
DROP TABLE #results

Druk dan op Execute waarna dit script gaat lopen.
Let op ! Afhankelijk van hoe groot de database is kan dit ontzettend lang duren !

Wanneer dit klaar is, zijn alle overbodige updates opgeruimd.

Vervolgens kun je nogmaals de updates gaan opruimen via de WSUS Management Console. Deze verwijderd dan ook de updates van de schijf.
Als dat klaar is, kun je de SUSDB gaan herindexeren.

Gebruik hiervoor weer de SQL Management Studio (als Administrator uitvoeren!)

Dan gaan we het volgende script uitvoeren :

USE SUSDB;
GO
SET NOCOUNT ON;

— Rebuild or reorganize indexes based on their fragmentation levels
DECLARE @work_to_do TABLE (
objectid int
, indexid int
, pagedensity float
, fragmentation float
, numrows int
)

DECLARE @objectid int;
DECLARE @indexid int;
DECLARE @schemaname nvarchar(130);
DECLARE @objectname nvarchar(130);
DECLARE @indexname nvarchar(130);
DECLARE @numrows int
DECLARE @density float;
DECLARE @fragmentation float;
DECLARE @command nvarchar(4000);
DECLARE @fillfactorset bit
DECLARE @numpages int

— Select indexes that need to be defragmented based on the following
— * Page density is low
— * External fragmentation is high in relation to index size
PRINT ‘Estimating fragmentation: Begin. ‘ + convert(nvarchar, getdate(), 121)
INSERT @work_to_do
SELECT
f.object_id
, index_id
, avg_page_space_used_in_percent
, avg_fragmentation_in_percent
, record_count
FROM
sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL , NULL, ‘SAMPLED’) AS f
WHERE
(f.avg_page_space_used_in_percent < 85.0 and f.avg_page_space_used_in_percent/100.0 * page_count < page_count – 1)
or (f.page_count > 50 and f.avg_fragmentation_in_percent > 15.0)
or (f.page_count > 10 and f.avg_fragmentation_in_percent > 80.0)

PRINT ‘Number of indexes to rebuild: ‘ + cast(@@ROWCOUNT as nvarchar(20))

PRINT ‘Estimating fragmentation: End. ‘ + convert(nvarchar, getdate(), 121)

SELECT @numpages = sum(ps.used_page_count)
FROM
@work_to_do AS fi
INNER JOIN sys.indexes AS i ON fi.objectid = i.object_id and fi.indexid = i.index_id
INNER JOIN sys.dm_db_partition_stats AS ps on i.object_id = ps.object_id and i.index_id = ps.index_id

— Declare the cursor for the list of indexes to be processed.
DECLARE curIndexes CURSOR FOR SELECT * FROM @work_to_do

— Open the cursor.
OPEN curIndexes

— Loop through the indexes
WHILE (1=1)
BEGIN
FETCH NEXT FROM curIndexes
INTO @objectid, @indexid, @density, @fragmentation, @numrows;
IF @@FETCH_STATUS < 0 BREAK;

SELECT
@objectname = QUOTENAME(o.name)
, @schemaname = QUOTENAME(s.name)
FROM
sys.objects AS o
INNER JOIN sys.schemas as s ON s.schema_id = o.schema_id
WHERE
o.object_id = @objectid;

SELECT
@indexname = QUOTENAME(name)
, @fillfactorset = CASE fill_factor WHEN 0 THEN 0 ELSE 1 END
FROM
sys.indexes
WHERE
object_id = @objectid AND index_id = @indexid;

IF ((@density BETWEEN 75.0 AND 85.0) AND @fillfactorset = 1) OR (@fragmentation < 30.0)
SET @command = N’ALTER INDEX ‘ + @indexname + N’ ON ‘ + @schemaname + N’.’ + @objectname + N’ REORGANIZE’;
ELSE IF @numrows >= 5000 AND @fillfactorset = 0
SET @command = N’ALTER INDEX ‘ + @indexname + N’ ON ‘ + @schemaname + N’.’ + @objectname + N’ REBUILD WITH (FILLFACTOR = 90)’;
ELSE
SET @command = N’ALTER INDEX ‘ + @indexname + N’ ON ‘ + @schemaname + N’.’ + @objectname + N’ REBUILD’;
PRINT convert(nvarchar, getdate(), 121) + N’ Executing: ‘ + @command;
EXEC (@command);
PRINT convert(nvarchar, getdate(), 121) + N’ Done.’;
END

— Close and deallocate the cursor.
CLOSE curIndexes;
DEALLOCATE curIndexes;

IF EXISTS (SELECT * FROM @work_to_do)
BEGIN
PRINT ‘Estimated number of pages in fragmented indexes: ‘ + cast(@numpages as nvarchar(20))
SELECT @numpages = @numpages – sum(ps.used_page_count)
FROM
@work_to_do AS fi
INNER JOIN sys.indexes AS i ON fi.objectid = i.object_id and fi.indexid = i.index_id
INNER JOIN sys.dm_db_partition_stats AS ps on i.object_id = ps.object_id and i.index_id = ps.index_id

PRINT ‘Estimated number of pages freed: ‘ + cast(@numpages as nvarchar(20))
END
GO

–Update all statistics
PRINT ‘Updating all statistics.’ + convert(nvarchar, getdate(), 121)
EXEC sp_updatestats
PRINT ‘Done updating statistics.’ + convert(nvarchar, getdate(), 121)
GO

De laatste stap die we kunnen doen is het shrinken van de database.
Klik hiervoor op de SUSDB met de rechter muisknop en kies “Shrink”
Kies dan de optie om de Database te shrinken.

In ons geval was onze database zo’n 17 GB groot.
Na het schrinken was deze zo’n 9 GB !

Als dit klaar is, is het onderhoud gereed. WSUS Zal nu sneller zijn en de MMC zal nu niet meer vastlopen of crashen.
Start de server voor alle zekerheid even opnieuw op. Als het goed is zal de CPU belasting nu enorm afgenomen moeten zijn !

Deel dit:
Scroll naar boven