The WSUS console crashes, or clients stop reporting
The application pool has run out of memory, or the database has grown past the point where the console can query it.
What you see
The console shows "Reset Server Node" repeatedly, or clients stop appearing. It is usually worse straight after a synchronisation.
What is actually wrong
The WsusPool application pool's private memory limit is far too low for a database that has never been cleaned up, so it recycles mid-query.
Codes and articles
Fixes (2)
Raise the pool limit, then clean up the database
The console crashes. Do both parts — the limit alone only postpones it.
Check the current private memory limit.
Import-Module WebAdministrationGet-ItemProperty 'IIS:\AppPools\WsusPool' -Name recycling.periodicRestart.privateMemory
Raise it substantially, or set it to zero for unlimited on a dedicated server.
Set-ItemProperty 'IIS:\AppPools\WsusPool' -Name recycling.periodicRestart.privateMemory -Value 0Set-ItemProperty 'IIS:\AppPools\WsusPool' -Name queueLength -Value 25000Restart-WebAppPool WsusPool
The default of around 1.8GB was chosen for a small deployment and is exceeded by any WSUS server that has been running for a year. The pool recycles mid-query and the console reports a connection failure that has nothing to do with the network.
Decline superseded and expired updates, which is where the size comes from.
$wsus = Get-WsusServer$wsus.GetUpdates() | Where-Object { $_.IsSuperseded -and -not $_.IsDeclined } | ForEach-Object { $_.Decline() }
Run the cleanup wizard's operations from the command line, one at a time — running them all together on a neglected server can take days.
Invoke-WsusServerCleanup -DeclineSupersededUpdatesInvoke-WsusServerCleanup -DeclineExpiredUpdatesInvoke-WsusServerCleanup -CleanupObsoleteUpdatesInvoke-WsusServerCleanup -CleanupUnneededContentFiles
Reindex the database afterwards. This makes more difference than anything else and is not done automatically.
sqlcmd -S \\.\pipe\MICROSOFT##WID\tsql\query -i C:\WsusDBMaintenance.sqlThe WSUS database has no maintenance plan by default. On the internal Windows Database, indexes are never rebuilt, and query times grow until the console times out — reindexing routinely takes a query from minutes back to seconds.
Schedule the cleanup and reindex monthly so it never gets to this state again.
Get-WsusServer | Format-List Name,Version,ServerProtocolVersion(Get-WsusServer).GetUpdateCount()
Get clients reporting again
The console is healthy but computers are missing or stale.
Check what the client is configured to use.
Get-ItemProperty 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate' | Format-List WUServer,WUStatusServer,TargetGroupRead the client's own log for the failure.
Get-WindowsUpdateLog -LogPath $env:USERPROFILE\Desktop\wu.logGet-Content $env:USERPROFILE\Desktop\wu.log -Tail 60
Look for duplicate SusClientIDs, which happens when machines are cloned from an image without generalising. Every clone reports as the same computer.
Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate' | Format-List SusClientId,SusClientIDValidationThis is the classic cause of a WSUS console showing three machines for a fleet of forty. It cannot be diagnosed from the server, only from the clients, and the fix has to run on each one.
Reset the client identity on an affected machine.
Stop-Service wuauserv,bits -ForceRemove-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate' -Name SusClientId,SusClientIDValidation -ErrorAction SilentlyContinueRemove-Item 'C:\Windows\SoftwareDistribution' -Recurse -Force -ErrorAction SilentlyContinueStart-Service wuauserv,bitswuauclt /resetauthorization /detectnow(New-Object -ComObject Microsoft.Update.AutoUpdate).DetectNow()
Confirm the client can reach the server on the right port — 8530 and 8531 by default, not 80 and 443.
Test-NetConnection wsus.example.local -Port 8530 -InformationLevel DetailedFor images, remove the SusClientId as part of the sysprep process so this cannot recur.
(Get-WsusServer).GetComputerTargets() | Sort-Object LastReportedStatusTime -Descending | Select-Object -First 10 FullDomainName,LastReportedStatusTimeRelated faults
Where this stops. This write-up was written and checked by hand. It says what each step changes, how to confirm it worked and how to reverse it, and anything destructive is flagged before you reach it. If it does not match what your machine is doing, search the Support Centre for the exact code or message — and when something needs a person, get in touch.