Disk at 100% in Task Manager and the machine is unusable
Either something is genuinely reading and writing constantly, or the drive is failing and every operation is being retried.
What you see
Task Manager shows the disk at 100% with a low transfer rate. The machine is slow to the point of unusable, particularly after a restart.
What is actually wrong
On a healthy machine the honest causes are Windows Search indexing, an antivirus scan, an update installing in the background, or a page file on a slow drive. On an unhealthy one it is a failing drive retrying reads, which shows as 100% active time with a transfer rate near zero.
Codes and articles
Fixes (2)
Check the drive is not failing before optimising anything
The rate is near zero, or the machine freezes for seconds at a time. Do this before any tuning — tuning a failing drive wastes the time you have to copy the data off.
Read the drive's own reliability counters.
Get-PhysicalDisk | Format-Table FriendlyName,MediaType,HealthStatus,OperationalStatus,SizeGet-PhysicalDisk | Get-StorageReliabilityCounter | Format-List DeviceId,Wear,ReadErrorsTotal,ReadErrorsUncorrected,PowerOnHours
ReadErrorsUncorrected above zero means the drive is losing data it cannot recover. That changes the job from performance tuning to getting the data off, immediately.
Look for the storage errors that accompany a failing drive.
Get-WinEvent -LogName System -MaxEvents 400 | Where-Object { $_.Id -in 7,9,11,51,129,153 } | Format-Table TimeCreated,Id,ProviderName,Message -WrapEvent 129 from storahci means the controller reset the drive — a strong signal of a failing disk or cable. Event 153 is an I/O retry.
If any of the above are present, back up now and replace the drive. Do not run chkdsk on a physically failing disk before the data is copied off.
Get-PhysicalDisk | Format-Table FriendlyName,HealthStatus,OperationalStatusName the process rather than guessing at it
The drive is healthy and a real transfer rate is showing.
Sort by actual disk bytes rather than trusting the Task Manager percentage.
Get-Process | Sort-Object -Property @{Expression={$_.ReadOperationCount + $_.WriteOperationCount}} -Descending | Select-Object -First 10 Name,Id,@{n='MB';e={[math]::Round(($_.WorkingSet64/1MB),0)}}Use Resource Monitor's Disk tab for the file-level view, which shows exactly which file is being hammered.
resmon.exeIf it is SearchIndexer, rebuild the index rather than disabling search.
Stop-Service WSearch -ForceRemove-Item "$env:ProgramData\Microsoft\Search\Data\Applications\Windows\Windows.edb" -Force -ErrorAction SilentlyContinueStart-Service WSearch
A corrupt index makes the indexer restart the same crawl forever. Deleting the database forces a clean rebuild, which is heavy for a few hours and then quiet — disabling the service instead breaks Outlook and Start menu search permanently.
If it is MsMpEng, add the genuinely safe exclusions for the workload rather than turning Defender off, and check no second antivirus is installed alongside it.
If the machine has a mechanical drive, moving to an SSD is the fix. On a 5400rpm laptop drive, a modern Windows install is at its limit before any application starts.
Get-Counter '\PhysicalDisk(_Total)\% Idle Time' -SampleInterval 2 -MaxSamples 5Related 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.