みなさま、こんにちは。WSUS サポート チームです。
今日はよくお問い合わせいただく事象の 1 つである WSUS クリーンアップ ウィザードがタイムアウトで失敗してしまう事象について紹介いたします。
クリーンアップ ウィザードの詳細については、以下のブログで紹介しているので、クリーンアップ ウィザードの詳細について、まずは知りたいという方は以下を先にご覧ください。
https://blogs.technet.microsoft.com/jpwsus/2017/12/05/43/
事象の詳細
クリーンアップ ウィザードの 1 番上の項目「不要な更新プログラムと更新プログラムのリビジョン」は、クリーンアップの各項目の中でも、特に処理対象のデータ量が多くなりやすい項目です。弊社での実績上では、運用を開始してから数年経過した環境で初めて実行すると、数十時間 ~ 1 日を要することもあるような項目です。
このため、処理の途中でタイムアウトが発生してし、エラーで途中停止してまうことも、しばしばあります。
対処方法
定期的にクリーンアップ ウィザードを実行していただくのが、一番の対策とはなるのですが、もしこの事象陥ってしまった場合には、対処方法として、以下の 3 つがあります。
対処 1. WSUS データ ベースのインデックス再構成を実施する
対処 2. Powershell より処理を分割して実行する
対処 3. 繰り返しクリーンアップを実行する
対処 1. WSUS データ ベースのインデックス再構成を実施する
以下の記事で紹介しているインデックスの再構築を実施すると、WSUS の処理が効率化されるため、クリーンアップ ウィザードの処理をより効率的に進めることが出来るようになります。インデックスの再構成を定期的に実施していない環境では、まずインデックスの再構成を実施して事象に改善が見られないか確認をします。
https://blogs.technet.microsoft.com/jpwsus/2014/03/05/wsus-db/
上記の手順を実施しても、まだ事象が改善されない場合には続けて以下の手順を実施します。
対処 2. Powershell より処理を分割して実行する
実はクリーンアップ ウィザードの 「不要な更新プログラムと更新プログラムのリビジョン」項目は、内部的には 2 つの処理を同時に実行しています。このため、Powershell から 2 つの処理を分けて実行することで、タイムアウトを回避出来ることがあります。
Windows Server 2012 以降の WSUS では、Powershell で以下の 2 つのコマンドを上から順に実行することで、2 つの処理を同時ではなく、それぞれ実行することが出来ます。
・ Windows Server 2012 以降の WSUS の場合
Invoke-WsusServerCleanup -CompressUpdates
Invoke-WsusServerCleanup -CleanupObsoleteUpdates
WSUS 3.0 SP2 の環境の場合には、少し行数が多くなってしまいますが、以下の 2 つのスクリプトで Powershell から処理を実行可能です。そのまま Powershell のコンソールに貼り付けて実行していただくことも可能です。
・ WSUS 3.0 SP2 の場合 : その 1
[System.Reflection.Assembly]::LoadWithPartialName('microsoft.updateservices.administration')
$wsus=new-object 'Microsoft.UpdateServices.Administration.AdminProxy'
$wsusrv=$wsus.GetUpdateServerInstance()
$cm=$Wsusrv.GetCleanupManager()
$cs=new-object 'Microsoft.UpdateServices.Administration.CleanupScope'
$cs.CompressUpdates = $True
$cm.PerformCleanup($cs)
・ WSUS 3.0 SP2 の場合 : その 2
[System.Reflection.Assembly]::LoadWithPartialName('microsoft.updateservices.administration')
$wsus=new-object 'Microsoft.UpdateServices.Administration.AdminProxy'
$wsusrv=$wsus.GetUpdateServerInstance()
$cm=$Wsusrv.GetCleanupManager()
$cs=new-object 'Microsoft.UpdateServices.Administration.CleanupScope'
$cs.CleanupObsoleteUpdates = $True
$cm.PerformCleanup($cs)
対処 3. 繰り返しクリーンアップを実行する
さて上記の 2 つの対処を実施して、それでも事象が改善されない場合には、あとは繰り返し実行するしかありません。「不要な更新プログラムと更新プログラムのリビジョン」は、開始した直後にエラーとなるような状況でなけば、途中まで処理は進んでいます。繰り返し何度も対処 2 の Powershell を実行することで、処理を完了させましょう。
一度「不要な更新プログラムと更新プログラムのリビジョン」を完了出来れば、あとは定期的に実行すれば、いちいちこれらの対処をする必要はなくなります。対処が完了したら、タスク スケジューラ等からクリーンアップを自動的に定期実行するようにしておくと、この事象が再発することを未然に防ぐことが出来るので是非検討ください。