WSUSの高速化







数年の操作の後、新しくインストールされたWSUS更新サーバーは、動きの遅いモンスターに変わります。 クライアントの更新はゆっくりで、更新を長時間探します。WindowsUpdate.logログにはHTTPエラーがいっぱいであり、管理者は意気消沈しています。

多くの場合、サーバーを大幅に高速化できるヒントをいくつか紹介します。



1. IISを構成する

2.ベースのクリーニング

3.インデックスの再作成

4. TempDBの構成



インターネットインフォメーションサーバーを構成する



既定の構成では、WsusPoolアプリケーションプールからメモリが不適切に奪われています。 これは、クライアントログのサーバーHTTPエラーの主な原因です。



プロセスにメモリを追加するには、IISスナップインを起動し、詳細設定を開きます。











制限を0に設定します。







ベースクリーニング



WSUSコンソールで、「サーバークリーンアップウィザード」を実行できます。 主な秘密は、少なくとも月に一度は定期的に実行する必要があるということです。









更新の新しいパックを承認しました-サーバーをクリーニングします。 これが行われない場合、ウィザードは正常に動作しなくなります。 起動後、数時間ハングし、その後コンソールがエラーでクラッシュします。



まず、各項目を上から下に個別に実行してみてください:







これで解決しない場合は、データベースで直接クリーンアップを実行する必要があります。 これを行うには、Management Studioを使用してSQL Serverのインスタンスに接続する必要があります。 Management Studioはスタンドアロン製品になりました。 このリンクからダウンロードできます。



Windows Internal Databaseを使用している場合は、WSUSを備えたサーバーにManagement Studioをインストールする必要があります。 インスタンスに接続するには、次の行を使用します。



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









ベースをクリアするには、4つのマジックコマンドを実行します。



 EXEC SUSDB.dbo.spDeclineExpiredUpdates;1
      
      





 EXEC SUSDB.dbo.spDeclineSupersededUpdates;1
      
      





spCompressUpdateコマンドには、 ラッパーが使用されます。



 USE SUSDB DECLARE @var1 INT, @curitem INT, @totaltodelete INT DECLARE @msg nvarchar(200) CREATE TABLE #results (Col1 INT) INSERT INTO #results(Col1) EXEC spGetUpdatesToCompress SET @totaltodelete = (SELECT COUNT(*) FROM #results) SELECT @curitem=1 DECLARE WC Cursor FOR SELECT Col1 FROM #results OPEN WC FETCH NEXT FROM WC INTO @var1 WHILE (@@FETCH_STATUS > -1) BEGIN SET @msg = cast(@curitem as varchar(5)) + '/' + cast(@totaltodelete as varchar(5)) + ': Compressing ' + CONVERT(varchar(10), @var1) + ' ' + cast(getdate() as varchar(30)) RAISERROR(@msg,0,1) WITH NOWAIT EXEC spCompressUpdate @localUpdateID=@var1 SET @curitem = @curitem +1 FETCH NEXT FROM WC INTO @var1 END CLOSE WC DEALLOCATE WC DROP TABLE #results
      
      





spDeleteUpdateの同じラッパー:



 USE SUSDB DECLARE @var1 INT, @curitem INT, @totaltodelete INT DECLARE @msg nvarchar(200) CREATE TABLE #results (Col1 INT) INSERT INTO #results(Col1) EXEC spGetObsoleteUpdatesToCleanup SET @totaltodelete = (SELECT COUNT(*) FROM #results) SELECT @curitem=1 DECLARE WC Cursor FOR SELECT Col1 FROM #results OPEN WC FETCH NEXT FROM WC INTO @var1 WHILE (@@FETCH_STATUS > -1) BEGIN SET @msg = cast(@curitem as varchar(5)) + '/' + cast(@totaltodelete as varchar(5)) + ': Deleting ' + CONVERT(varchar(10), @var1) + ' ' + cast(getdate() as varchar(30)) RAISERROR(@msg,0,1) WITH NOWAIT EXEC spDeleteUpdate @localUpdateID=@var1 SET @curitem = @curitem +1 FETCH NEXT FROM WC INTO @var1 END CLOSE WC DEALLOCATE WC DROP TABLE #results
      
      





「ラッパー」の間、クライアントは更新の受信を停止します。 進行を失うことなく、いつでもスクリプトの実行を中断できます。 プロセスを続行するには、一時テーブルを削除することを忘れないでください。



 DROP TABLE #results
      
      





5チームをクリーニングするウィザードで、4チームを完了しました。 「サーバーに接続していないコンピューターの削除」コマンドは、ウィザードから実行する必要があります



ベースの再インデックス付け



データベースのインデックスを再作成するには、次のスクリプトを使用します。



再索引付けスクリプト
 /****************************************************************************** This sample T-SQL script performs basic maintenance tasks on SUSDB 1. Identifies indexes that are fragmented and defragments them. For certain tables, a fill-factor is set in order to improve insert performance. Based on MSDN sample at http://msdn2.microsoft.com/en-us/library/ms188917.aspx and tailored for SUSDB requirements 2. Updates potentially out-of-date table statistics. ******************************************************************************/ 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
      
      







TempDBを構成する



マイクロソフトの推奨事項

原則として、論理プロセッサの数が8以下の場合、論理プロセッサと同じ数のデータファイルを使用します。 論理プロセッサの数が8を超える場合、8個のデータファイルを使用し、競合が続く場合は、競合が許容レベルに下がるか、またはワークロード/コードの変更。






この推奨事項は無視しないでください。 私は4つのファイルに専念しています。 初期ファイルサイズは同じでなければなりません。 この後、期待は消える傾向があります。



ご清聴ありがとうございました。 これ以上のチップを知っていますか?それを共有してください!



All Articles