Workaround pentru optimizarea spatiului pe un server windows

Configurare noua (How To)

Situatie

Identificarea problemei, unde se duce spatiul.

In powershell ca admin:

Vedere rapidă — top foldere mari (PowerShell)

# Top 20 foldere pe C:\ sortate dupa dimensiune
Get-ChildItem C:\ -Recurse -ErrorAction SilentlyContinue |
  Where-Object { -not $_.PSIsContainer } |
  Group-Object DirectoryName |
  Select-Object Name, @{N='MB';E={[math]::Round(($_.Group | Measure-Object Length -Sum).Sum/1MB,1)}} |
  Sort-Object MB -Descending |
  Select-Object -First 20 |
  Format-Table -AutoSize

Verifică rapid fișierele sistem mari ascunse
# Fisiere sistem mari: pagefile, hiberfil, swapfile
Get-Item -Path C:\pagefile.sys, C:\hiberfil.sys, C:\swapfile.sys `
  -Force -ErrorAction SilentlyContinue |
  Select-Object Name, @{N='GB';E={[math]::Round($_.Length/1GB,2)}}

# Dimensiune WinSxS (raportata — include hardlink-uri, nu e exacta)
"{0:N2} GB" -f ((Get-ChildItem C:\Windows\WinSxS -Recurse -Force `
  -ErrorAction SilentlyContinue | Measure-Object Length -Sum).Sum / 1GB)
Foldere de loguri și alte spatii cunoscute ca mari

1C:\Windows\Logs\CBS\ — loguri Component-Based Servicing (update-uri)

2C:\ProgramData\Microsoft\Windows\WER\ReportQueue\ — crash reports în așteptare

3C:\ProgramData\Microsoft\Windows\WER\ReportArchive\ — rapoarte arhivate

4C:\Windows\SoftwareDistribution\Download\ — update-uri descărcate de Windows Update

5C:\Windows\Temp\ și %TEMP% — fișiere temporare sistem și utilizator

6C:\inetpub\logs\LogFiles\ — loguri IIS (pot ajunge la zeci de GB pe servere web)

7C:\Windows\memory.dmp — kernel memory dump complet (egal cu RAM-ul serverului)

Pagefile tipic
8–64 GB
Hiberfil.sys
= RAM
WinSxS tipic
5–25 GB
Kernel dump
= RAM

Solutie

Pasi de urmat

Pagefile.sys este memoria virtuală a sistemului. Pe serverele cu RAM mare, poate ocupa zeci de GB inutil. Regula veche “1.5× RAM” nu se mai aplică pe sisteme moderne cu 32+ GB RAM.

Verifică dimensiunea curentă (PowerShell)

# Dimensiune pagefile curent
Get-WmiObject Win32_PageFileUsage |
  Select-Object Name, AllocatedBaseSize, CurrentUsage, PeakUsage |
  Format-Table -AutoSize

# Configuratie setata (System managed sau custom)
Get-WmiObject Win32_PageFileSetting |
  Select-Object Name, InitialSize, MaximumSize

Strategie recomandata pe server

Evita Autogestionat de Windows — poate creste la infinit și stă pe C:\

Recomandat Dimensiune fixă (initial = maxim), pe un disc separat față de OS

Server SQL Dezactivează autogestionarea, setează manual pe disc de date, nu pe C:\

Setare manuală pagefile prin PowerShell (ca Administrator)

# Pas 1: dezactiveaza autogestionarea pentru toate discurile
$cs = Get-WmiObject Win32_ComputerSystem -EnableAllPrivileges
$cs.AutomaticManagedPagefile = $false
$cs.Put()

# Pas 2: sterge configuratia existenta de pe C:
$existing = Get-WmiObject Win32_PageFileSetting | Where-Object { $_.Name -like "C:\*" }
if ($existing) { $existing.Delete() }

# Pas 3: creeaza pagefile pe D:\ cu dimensiune fixa (ex. 8192 MB = 8 GB)
# Ajusteaza litera discului si dimensiunea dupa RAM
$pf = ([WMIClass]"Win32_PageFileSetting").CreateInstance()
$pf.Name = "D:\pagefile.sys"
$pf.InitialSize = 8192    # MB
$pf.MaximumSize = 8192    # MB — aceeasi = fara fluctuatie
$pf.Put()

Write-Host "Repornire necesara pentru aplicarea modificarilor."
Setare prin interfata grafica (alternativa)

1Click dreapta pe This PC → Properties → Advanced system settings

2Performance → Settings → Advanced → Virtual memory → Change

3Debifează “Automatically manage paging file size for all drives”

4Selectează C:\ → No paging file → Set

5Selectează D:\ → Custom size, Initial = Max = valoarea dorită → Set → OK

6Repornire obligatorie pentru a elibera pagefile.sys vechi de pe C:\

Nu elimina complet pagefile-ul chiar dacă ai RAM mare. Unele aplicații și crash dump-urile de tip kernel au nevoie de el. Minim 4–8 GB este recomandat chiar și pe sisteme cu 64+ GB RAM.

Cleanmgr.exe este utilitarul nativ de curățare Windows. Pe Windows Server 2016+ este disponibil implicit. Pe versiunile mai vechi necesită instalarea componentei “Desktop Experience”.

Activare pe Windows Server 2012 R2 / 2008 R2 (dacă lipsește)
# Copiere binare de pe un sistem Windows 10/11 sau instalare Desktop Experience
# Alternativa rapida prin copiere manuala:
# Copiaza cleanmgr.exe si cleanmgr.exe.mui din C:\Windows\System32\
# de pe un PC Windows 10 pe serverul tau in aceleasi locatii

# Sau instaleaza Desktop Experience (necesita restart):
Install-WindowsFeature Desktop-Experience

Mod interactiv — selectie manuala categorii

# Deschide interfata grafica pentru drive C:
cleanmgr.exe /d C

# Cu optiunea "Clean up system files" inclusa
# (necesita rulare ca Administrator)
cleanmgr.exe /d C /sageset:0

Mod automat complet — fara interfata grafica (recomandat pentru servere)
# Pas 1: configureaza setarile (se salveaza in registry)
# Numarul 99 e un identificator arbitrar — poate fi orice intre 0-9999
cleanmgr.exe /sageset:99

# Se deschide interfata — bifeaza TOT ce vrei sters, apoi OK
# (Windows Error Reporting, Temp Files, Old Chkdsk Files, etc.)

# Pas 2: ruleaza cu setarile salvate, fara GUI
cleanmgr.exe /sagerun:99

# Alternativa: curatare automata totala fara nicio configuratie prealabila
cleanmgr.exe /verylowdisk
Automatizare prin Task Scheduler (lunar)
# Creeaza task programat lunar, la ora 02:00, ca SYSTEM
schtasks /create /tn "DiskCleanup_Monthly" /tr "cleanmgr.exe /sagerun:99" `
  /sc monthly /d 1 /st 02:00 /ru SYSTEM /f

# Verifica task-ul creat
schtasks /query /tn "DiskCleanup_Monthly" /fo LIST

Categorii importante de selectat în cleanmgr

Sigur Temporary Files — fișiere temp din %TEMP% și C:\Windows\Temp

Sigur Windows Error Reporting — rapoarte crash trimise sau în așteptare

Sigur Delivery Optimization Files — cache Windows Update pentru alte PC-uri

Sigur Recycle Bin — coșul de gunoi

Sigur Thumbnails — cache miniaturi Explorer

Atenție Windows Update Cleanup — șterge versiunile vechi ale update-urilor (nu mai poți face rollback)

Atenție System Error Dump Files — șterge crash dump-urile (păstrează-le dacă investighezi erori)

Evita Downloads — folderul Downloads al utilizatorilor, verifică înainte.

WinSxS (Component Store) poate ajunge la 15–25 GB după update-uri acumulate. DISM este singurul mod sigur și suportat de Microsoft pentru a-l reduce — nu șterge manual din el.

Pas 1 — Analiză (fără modificări)
# Analiza dimensiunii reale a WinSxS (ruleaza ca Administrator)
Dism.exe /Online /Cleanup-Image /AnalyzeComponentStore

# Output relevant:
# Windows Explorer Reported Size : X.XX GB  (cu hardlink-uri — supraestimat)
# Actual Size of Component Store  : X.XX GB  (dimensiunea reala)
# Backups and Disabled Features   : X.XX GB  (recuperabil)
# Cache and Temporary Data        : X.XX MB  (recuperabil)
# Component Store Cleanup Recommended: Yes/No

Pas 2 — Curățare standard (sigur, reversibil)
# Elimina componentele superseded mai vechi de 30 zile
Dism.exe /Online /Cleanup-Image /StartComponentCleanup

# Varianta agresiva: elimina imediat, fara asteptarea de 30 zile
Dism.exe /Online /Cleanup-Image /StartComponentCleanup /ResetBase

 /ResetBase este ireversibil — după aceea nu mai poți face rollback la versiunile de update anterioare. Fă un snapshot/backup înainte pe VM-uri.

Pas 3 — Curățare update-uri de serviciu (Service Pack)
# Elimina fisierele de backup ale Service Pack-ului (SP1, SP2 etc.)
# Dupa asta SP-ul nu mai poate fi dezinstalat
Dism.exe /Online /Cleanup-Image /SPSuperseded

Elimina roluri și funcționalități neutilizate (eliberează WinSxS)
# Listeaza toate rolurile instalate
Get-WindowsFeature | Where-Object { $_.Installed -eq $true } | Format-Table Name, DisplayName

# Dezinstaleaza un rol si sterge binarele din WinSxS (ex: Telnet-Client)
Uninstall-WindowsFeature -Name Telnet-Client -Remove

# Alternativa DISM pentru roluri neinstalate — sterge binarele din store
Dism.exe /Online /Disable-Feature /FeatureName:TelnetClient /Remove

# Verifica spatiul recuperat
Dism.exe /Online /Cleanup-Image /AnalyzeComponentStore
Mutare SoftwareDistribution (cache Windows Update)
# Opreste Windows Update
Stop-Service wuauserv, bits, cryptsvc -Force

# Redenumeste folderul vechi (backup sigur)
Rename-Item "C:\Windows\SoftwareDistribution" `
            "C:\Windows\SoftwareDistribution.bak"

# Reporneste serviciile — Windows Update va recrea folderul gol
Start-Service wuauserv, bits, cryptsvc

# Dupa ce verifici ca update-urile functioneaza, sterge backup-ul:
# Remove-Item "C:\Windows\SoftwareDistribution.bak" -Recurse -Force
 SoftwareDistribution\Download poate acumula GB de update-uri descărcate dar neinstalate. Este sigur de șters — Windows le va re-descărca la nevoie.

Crash dump-urile și log-urile de sistem sunt printre cele mai mari consumatoare de spațiu pe serverele de producție. Unele nu sunt vizibile în Explorer fără a afișa fișierele ascunse.

Identificare și ștergere crash dumps
# Dump complet kernel (egal cu RAM-ul serverului!)
# Locatie implicita: C:\Windows\memory.dmp
Test-Path "C:\Windows\memory.dmp"
(Get-Item "C:\Windows\memory.dmp" -ErrorAction SilentlyContinue).Length / 1GB

# Mini dump-uri (mici, utile pentru diagnosticare)
Get-ChildItem "C:\Windows\Minidump" -ErrorAction SilentlyContinue |
  Select-Object Name, @{N='KB';E={[math]::Round($_.Length/1KB,0)}} |
  Sort-Object KB -Descending

# Sterge dump-ul complet (DUPA ce l-ai analizat sau nu mai ai nevoie)
Remove-Item "C:\Windows\memory.dmp" -Force -ErrorAction SilentlyContinue

# Sterge toate mini dump-urile
Remove-Item "C:\Windows\Minidump\*.dmp" -Force -ErrorAction SilentlyContinue
Configureaza tipul de dump (micșorează dimensiunea viitoare)
# Verifica configuratia curenta de dump
Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\CrashControl" |
  Select-Object CrashDumpEnabled, DumpFile, MiniDumpDir

# Valori CrashDumpEnabled:
# 0 = Niciun dump (nu recomandat pe server de productie)
# 1 = Complete memory dump (= tot RAM-ul — cel mai mare)
# 2 = Kernel memory dump (recomandat — compromis bun)
# 3 = Small memory dump / Minidump (cel mai mic, ~256 KB)
# 7 = Automatic memory dump (Windows decide)

# Seteaza Kernel memory dump (recomandat pentru servere)
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\CrashControl" `
  -Name "CrashDumpEnabled" -Value 2 -Type DWord
Curățare Windows Error Reporting (WER)
# Sterge rapoartele in asteptare si arhivele WER
Remove-Item "C:\ProgramData\Microsoft\Windows\WER\ReportQueue\*" `
  -Recurse -Force -ErrorAction SilentlyContinue

Remove-Item "C:\ProgramData\Microsoft\Windows\WER\ReportArchive\*" `
  -Recurse -Force -ErrorAction SilentlyContinue

# Verifica spatiul eliberat
$wer = "C:\ProgramData\Microsoft\Windows\WER"
"{0:N0} MB total WER" -f ((Get-ChildItem $wer -Recurse -Force `
  -ErrorAction SilentlyContinue | Measure-Object Length -Sum).Sum / 1MB)
Curățare loguri CBS și DISM
# Loguri Component-Based Servicing (pot depasi 1 GB!)
Get-ChildItem "C:\Windows\Logs\CBS" | Measure-Object Length -Sum |
  Select-Object @{N='MB';E={[math]::Round($_.Sum/1MB,1)}}

# Comprima log-ul curent si sterge arhivele vechi
Compress-Archive "C:\Windows\Logs\CBS\CBS.log" `
  "C:\Windows\Logs\CBS\CBS_$(Get-Date -f yyyyMMdd).zip" -Force
Remove-Item "C:\Windows\Logs\CBS\CBS.log" -Force

# Sterge log-urile DISM
Remove-Item "C:\Windows\Logs\DISM\*" -Force -ErrorAction SilentlyContinue
Curățare loguri IIS (dacă serverul are IIS)
# Gaseste toate log-urile IIS mai vechi de 30 zile si calculeaza spatiul
$cutoff = (Get-Date).AddDays(-30)
$iisLogs = Get-ChildItem "C:\inetpub\logs" -Recurse -File |
  Where-Object { $_.LastWriteTime -lt $cutoff }

"Fisiere: $($iisLogs.Count) | Spatiu: {0:N0} MB" -f `
  (($iisLogs | Measure-Object Length -Sum).Sum / 1MB)

# Sterge log-urile IIS mai vechi de 30 zile
$iisLogs | Remove-Item -Force

# Redirectioneaza log-urile IIS pe alt disc (recomandat pe termen lung)
# IIS Manager → Sites → selecteaza site → Logging → Log File → Directory: D:\IISLogs

Workarounduri suplimentare care recuperează spațiu rapid, fiecare cu risc scăzut pe un server de producție.

1 — Dezactivare hibernare (hiberfil.sys = dimensiunea RAM)
# Dezactiveaza hibernarea si sterge hiberfil.sys automat
# Pe serverele Windows nu ai nevoie de hibernate
powercfg -h off

# Verifica: daca comanda a reusit, fisierul nu mai exista
Test-Path "C:\hiberfil.sys"   # trebuie sa returneze False

# Re-activa daca schimbi parerea (ex: pe un laptop/workstation)
powercfg -h on

Pe un server cu 32 GB RAM, hiberfil.sys ocupa 25–32 GB. Dezactivarea este instantanee și fără riscuri pe servere
 (nu au nevoie de hibernate).
2 — Curățare fișiere temporare sistem și utilizator
# Sterge continutul din Windows\Temp
Remove-Item "C:\Windows\Temp\*" -Recurse -Force -ErrorAction SilentlyContinue

# Sterge continutul din Temp-ul utilizatorului curent
Remove-Item "$env:TEMP\*" -Recurse -Force -ErrorAction SilentlyContinue

# Sterge Temp pentru TOTI utilizatorii de pe server
Get-ChildItem "C:\Users" -Directory | ForEach-Object {
  $tempPath = Join-Path $_.FullName "AppData\Local\Temp"
  if (Test-Path $tempPath) {
    Remove-Item "$tempPath\*" -Recurse -Force -ErrorAction SilentlyContinue
    Write-Host "Curatat: $tempPath"
  }
}
3 — Golire Recycle Bin pentru toți utilizatorii
# PowerShell 5.0+
Clear-RecycleBin -Force -ErrorAction SilentlyContinue

# Alternativa CMD (functioneaza pe orice versiune Windows Server)
rd /s /q C:\$Recycle.Bin 2>nul
4 — Dezactivare System Restore pe serverele unde nu e necesar
# Verifica starea curenta
vssadmin list shadowstorage

# Dezactiveaza System Restore pe C: (pe servere de productie nu e util)
Disable-ComputerRestore -Drive "C:\"

# Sterge toate shadow copies existente (elibereaza spatiu imediat)
# ATENTIE: ireversibil — nu mai poti face rollback la stari anterioare
vssadmin delete shadows /all /quiet
 Nu sterge shadow copies dacă ai backup incremental bazat pe VSS (ex: Windows Server Backup, Veeam). Verifică înainte cu vssadmin list shadows.
5 — Compresie NTFS pe foldere rar accesate
# Activeaza compresia NTFS pe un folder specific (ex: log-uri arhivate)
# Nu afecteaza performanta pe fisiere rar accesate
compact /c /s:"C:\ArchivedLogs"

# Verifica rata de compresie
compact "C:\ArchivedLogs\*" | Select-String "total"

# Dezactiveaza compresia
compact /u /s:"C:\ArchivedLogs"
6 — Audit rapid complet printr-un singur script
# Script de raportare spatiu — ruleaza ca Administrator si salveaza raportul
$report = @()
$items = @(
  @{N="pagefile.sys";   P="C:\pagefile.sys"},
  @{N="hiberfil.sys";   P="C:\hiberfil.sys"},
  @{N="memory.dmp";     P="C:\Windows\memory.dmp"},
  @{N="WER ReportQueue";P="C:\ProgramData\Microsoft\Windows\WER\ReportQueue"},
  @{N="Windows\Temp";   P="C:\Windows\Temp"},
  @{N="CBS Logs";        P="C:\Windows\Logs\CBS"},
  @{N="SoftwareDistrib";P="C:\Windows\SoftwareDistribution\Download"},
  @{N="IIS Logs";        P="C:\inetpub\logs"}
)
foreach ($i in $items) {
  if (Test-Path $i.P) {
    $sz = (Get-ChildItem $i.P -Recurse -Force -ErrorAction SilentlyContinue |
           Measure-Object Length -Sum).Sum
    $report += [PSCustomObject]@{
      Locatie = $i.N
      "Dimensiune MB" = [math]::Round($sz / 1MB, 1)
    }
  }

Tip solutie

Permanent

Voteaza

(22 din 38 persoane apreciaza acest articol)

Despre Autor

Leave A Comment?