Windows bulut sunucu kaç GB RAM yeter? PowerShell ile CPU, RAM ve disk yükünü 7 gün ölçüp doğru boyutu seçme
Windows bulut sunucu için kaç GB RAM ve kaç vCPU gerektiğini tahminle değil ölçümle bulun. PowerShell betiğiyle CPU, bellek, disk gecikmesi ve süreç bazlı bellek kullanımını 7 gün CSV'ye yazın, yüzde 95'lik değerlerle paket seçin.
Batuhan Çelikel15 dk okuma
Windows bulut sunucu alırken ya da mevcut sunucuyu büyütürken sorulan ilk soru genelde "kaç GB RAM yeter?" olur. Doğru yanıt, sunucunun bugünkü yükünü bir hafta boyunca ölçmekten geçer. Bu rehber Logo, Mikro, Netsis ya da SQL Server çalıştıran sistem yöneticileri ve KOBİ sahipleri için hazırlandı. Rehberdeki PowerShell betikleri CPU, bellek, disk ve ağ yükünü 7 gün boyunca CSV'ye yazar. Ardından yüzde 95'lik değerleri çıkarır ve size gereken boyutu sayıyla gösterir.
Neden tahminle değil ölçümle boyut seçmeli
"10 kullanıcıya 16 GB yeter" gibi kurallar başlangıç için işe yarar. Ama iki şirketin aynı kullanıcı sayısıyla çok farklı yük üretmesi olağan bir durum. Veritabanı boyutu, raporların ağırlığı, aynı anda açık kalan program sayısı ve ay sonu kapanışları sonucu değiştirir.
Tahminle seçim iki yönde hata yaptırır:
- Küçük seçim: Kullanıcılar ay sonunda donma yaşar, SQL Server diske taşar, uzak masaüstü oturumları yavaşlar.
- Büyük seçim: Her ay kullanılmayan kaynağa ödeme yaparsınız.
Kullanıcı sayısına göre başlangıç tablosu isterseniz Logo, Mikro ve Netsis için Windows bulut sunucu seçimi yazısına bakabilirsiniz. Bu rehber ise o tahmini kendi ölçümünüzle doğrulamanızı sağlar. Linux sunucular için aynı yöntemin bash sürümü VPS sunucu kaç GB RAM yeter yazısında anlatılıyor.
Hangi sayaçlar ölçülmeli
Windows'un performans sayaçları, Görev Yöneticisi'nin anlık grafiklerinden daha fazla bilgi verir. Betik şu dokuz değeri toplar:
| Sütun | Sayaç | Ne anlatır |
|---|---|---|
| CpuYuzde | Processor(_Total)% Processor Time | Toplam işlemci kullanımı |
| IslemciKuyrugu | System\Processor Queue Length | İşlemci bekleyen iş parçacığı sayısı |
| BosBellekMB | Memory\Available MBytes | Hemen kullanılabilir bellek |
| CommitYuzde | Memory% Committed Bytes In Use | Taahhüt edilen belleğin sınıra oranı |
| SayfaGirisSn | Memory\Pages Input/sec | Diskten belleğe geri okunan sayfa sayısı |
| DiskOkumaMs | LogicalDisk(_Total)\Avg. Disk sec/Read | Ortalama okuma gecikmesi |
| DiskYazmaMs | LogicalDisk(_Total)\Avg. Disk sec/Write | Ortalama yazma gecikmesi |
| DiskKuyrugu | LogicalDisk(_Total)\Current Disk Queue Length | Bekleyen disk isteği |
| AgMbps | Network Interface(*)\Bytes Total/sec | Tüm ağ kartlarındaki toplam trafik |
Bunlara ek olarak her çalışmada en çok bellek kullanan 10 süreç ayrı bir dosyaya yazılır. Böylece SQL Server'ın, Logo ya da Mikro istemcilerinin ve uzak masaüstü oturumlarının payını ayrı ayrı görebilirsiniz.
Burada sık karşılaşılan bir tuzak var. Get-Counter sayaç adlarını sistem dilinde ister. Türkçe Windows'ta \Processor(_Total)\% Processor Time yazdığınızda "sayaç bulunamadı" hatası alabilirsiniz. Betik bu sorunu çözmek için İngilizce adı kayıt defterindeki sayaç numarası üzerinden sistem diline çevirir. İngilizce sistemlerde çeviri adımı adları olduğu gibi bırakır. Cmdlet'in ayrıntıları için Microsoft'un Get-Counter belgesine bakabilirsiniz.
Ön koşullar
- Windows Server 2016, 2019, 2022 ya da 2025 (Windows 10 ve 11'de de çalışır).
- Windows PowerShell 5.1. PowerShell 7 gerekmez.
- Yönetici yetkisiyle açılmış bir PowerShell penceresi.
C:\Olcumklasörü için birkaç MB boş alan. Betik günde birkaç yüz KB veri yazar.
Ölçümü taşımak istediğiniz mevcut sunucuda yapın. Ofisteki fiziksel sunucu da olabilir, başka bir sağlayıcıdaki sanal sunucu da.
Adım 1: Ölçüm betiğini oluşturun
Aşağıdaki betik her çalıştığında 10 saniye arayla 6 örnek alır (toplam 1 dakika). Bu örnekleri olcum-YYYYMMDD.csv dosyasına, en çok bellek kullanan 10 süreci de surec-YYYYMMDD.csv dosyasına ekler. Sayılar kültür ayarından bağımsız (ondalık ayırıcı nokta) yazılır, alan ayırıcı olarak noktalı virgül kullanılır. Böylece Türkçe bölge ayarında sütunlar kaymaz.
Windows Server 2016 ile 2025 arası ve Windows PowerShell 5.1 için hazırlandı. Betik sistemde hiçbir ayarı değiştirmez, yalnız dosya yazar. Geri almak için C:\Olcum klasörünü silmeniz yeterlidir.
Dosyayı C:\Olcum\Olcum-Topla.ps1 olarak kaydedin:
<#
Olcum-Topla.ps1
CPU, bellek, disk ve ağ sayaçlarını örnekler, günlük CSV dosyasına ekler.
Bellek kullanan ilk 10 süreci ayrı bir CSV dosyasına yazar.
Windows Server 2016-2025 ve Windows PowerShell 5.1 için hazırlandı.
#>
param(
[string]$Klasor = 'C:\Olcum', # CSV dosyalarının yazılacağı klasör
[int]$AralikSaniye = 10, # iki örnek arasındaki süre (saniye)
[int]$OrnekSayisi = 6 # her çalışmada alınacak örnek sayısı
)
$ErrorActionPreference = 'Stop'
$ci = [System.Globalization.CultureInfo]::InvariantCulture
$gun = Get-Date -Format 'yyyyMMdd'
if (-not (Test-Path $Klasor)) { New-Item -ItemType Directory -Path $Klasor | Out-Null }
# --- 1) İngilizce sayaç adlarını sistem diline çevirmek için eşleme tabloları ---
$perflib = 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib'
$enIndeks = @{} # İngilizce ad -> sayaç numarası
$yerelAd = @{} # sayaç numarası -> sistem dilindeki ad
try {
$en = (Get-ItemProperty "$perflib\009" -Name Counter).Counter
$yr = (Get-ItemProperty "$perflib\CurrentLanguage" -Name Counter).Counter
for ($i = 0; $i -lt $en.Count - 1; $i += 2) {
if (-not $enIndeks.ContainsKey($en[$i + 1])) { $enIndeks[$en[$i + 1]] = $en[$i] }
}
for ($i = 0; $i -lt $yr.Count - 1; $i += 2) { $yerelAd[$yr[$i]] = $yr[$i + 1] }
} catch {
# Okunamazsa İngilizce adlarla devam edilir
}
function Get-YerelAd([string]$Ad) {
$no = $enIndeks[$Ad]
if ($no -and $yerelAd.ContainsKey($no)) { return $yerelAd[$no] }
return $Ad
}
function Convert-SayacYolu([string]$Yol) {
# '\Nesne(Ornek)\Sayac' biçimini parçalara ayır
if ($Yol -notmatch '^\\([^\\(]+)(\([^)]*\))?\\(.+)$') { return $Yol }
$nesne = $Matches[1]; $ornek = $Matches[2]; $sayac = $Matches[3]
return '\' + (Get-YerelAd $nesne) + $ornek + '\' + (Get-YerelAd $sayac)
}
# --- 2) Ölçülecek sayaçlar (İngilizce adlarla tanımlanır) ---
$tanim = [ordered]@{
CpuYuzde = '\Processor(_Total)\% Processor Time'
IslemciKuyrugu = '\System\Processor Queue Length'
BosBellekMB = '\Memory\Available MBytes'
CommitYuzde = '\Memory\% Committed Bytes In Use'
SayfaGirisSn = '\Memory\Pages Input/sec'
DiskOkumaMs = '\LogicalDisk(_Total)\Avg. Disk sec/Read'
DiskYazmaMs = '\LogicalDisk(_Total)\Avg. Disk sec/Write'
DiskKuyrugu = '\LogicalDisk(_Total)\Current Disk Queue Length'
AgMbps = '\Network Interface(*)\Bytes Total/sec'
}
$yol = [ordered]@{}
foreach ($k in $tanim.Keys) { $yol[$k] = Convert-SayacYolu $tanim[$k] }
$ornekler = Get-Counter -Counter @($yol.Values) -SampleInterval $AralikSaniye `
-MaxSamples $OrnekSayisi -ErrorAction SilentlyContinue
$satirlar = foreach ($o in $ornekler) {
$s = [ordered]@{ Zaman = $o.Timestamp.ToString('yyyy-MM-dd HH:mm:ss') }
foreach ($k in $yol.Keys) {
$desen = '*' + $yol[$k] # yol, bilgisayar adından sonra gelir
$deger = ($o.CounterSamples | Where-Object { $_.Path -like $desen } |
Measure-Object -Property CookedValue -Sum).Sum
if ($null -eq $deger) { $deger = 0 }
switch -Wildcard ($k) {
'Disk*Ms' { $deger = $deger * 1000 } # saniye -> milisaniye
'AgMbps' { $deger = $deger * 8 / 1000000 } # bayt/sn -> Mbit/sn
}
$s[$k] = [math]::Round($deger, 2).ToString($ci)
}
[pscustomobject]$s
}
if ($satirlar) {
$satirlar | Export-Csv -Path (Join-Path $Klasor "olcum-$gun.csv") -Append `
-NoTypeInformation -Delimiter ';' -Encoding UTF8
}
# --- 3) Bellek kullanan ilk 10 süreç (aynı adlı süreçler toplanır) ---
$zaman = Get-Date -Format 'yyyy-MM-dd HH:mm:ss'
Get-Process | Group-Object -Property ProcessName | ForEach-Object {
[pscustomobject]@{
Zaman = $zaman
Surec = $_.Name
Adet = $_.Count
CalismaMB = [math]::Round(($_.Group | Measure-Object WorkingSet64 -Sum).Sum / 1MB, 0)
OzelMB = [math]::Round(($_.Group | Measure-Object PrivateMemorySize64 -Sum).Sum / 1MB, 0)
}
} | Sort-Object OzelMB -Descending | Select-Object -First 10 |
Export-Csv -Path (Join-Path $Klasor "surec-$gun.csv") -Append `
-NoTypeInformation -Delimiter ';' -Encoding UTF8
SQL Server'ın veri dosyaları ayrı bir diskteyse (ör. D:), disk gecikmesini o diskte görmek daha anlamlıdır. Bu durumda LogicalDisk(_Total) ifadesini LogicalDisk(D:) olarak değiştirin.
Betiği bir kez elle çalıştırıp çıktıyı kontrol edin:
# Kısa deneme: 2 saniye arayla 3 örnek
powershell.exe -NoProfile -ExecutionPolicy Bypass -File C:\Olcum\Olcum-Topla.ps1 -AralikSaniye 2 -OrnekSayisi 3
# Yazılan satırları görüntüle
Get-ChildItem C:\Olcum\olcum-*.csv | ForEach-Object { Import-Csv $_.FullName -Delimiter ';' } | Format-Table
Her sütunda sayı görmelisiniz. Bir sütun sürekli 0 geliyorsa (ör. CpuYuzde), sayaç adı çevrilememiş demektir. Get-Counter -ListSet * ile sistemdeki sayaç kümelerinin adlarını kontrol edin.
Adım 2: 7 günlük zamanlanmış görevi kurun
Aşağıdaki betik, ölçüm betiğini 7 gün boyunca 5 dakikada bir SYSTEM hesabıyla çalıştıran bir görev oluşturur. Aynı adla görev varsa önce kaldırır, bu yüzden tekrar çalıştırmak güvenlidir. Windows Server 2016 ile 2025 arası ve PowerShell 5.1 için hazırlandı. Parametrelerin ayrıntısı Microsoft'un Register-ScheduledTask belgesinde bulunur.
Geri almak için: Unregister-ScheduledTask -TaskName 'SunucuOlcum' -Confirm:$false
# Gorev-Kur.ps1: yönetici PowerShell penceresinde çalıştırın.
$GorevAdi = 'SunucuOlcum' # görev adı
$BetikYolu = 'C:\Olcum\Olcum-Topla.ps1' # ölçüm betiğinin yolu
$Gun = 7 # ölçüm süresi (gün)
if (-not (Test-Path $BetikYolu)) { throw "Betik bulunamadı: $BetikYolu" }
# Aynı adlı görev varsa kaldır (betik tekrar çalıştırılabilir olsun)
if (Get-ScheduledTask -TaskName $GorevAdi -ErrorAction SilentlyContinue) {
Unregister-ScheduledTask -TaskName $GorevAdi -Confirm:$false
}
$eylem = New-ScheduledTaskAction -Execute 'powershell.exe' `
-Argument "-NoProfile -NonInteractive -ExecutionPolicy Bypass -File `"$BetikYolu`""
# 1 dakika sonra başla, 5 dakikada bir tekrarla, 7 gün sürsün
$tetik = New-ScheduledTaskTrigger -Once -At (Get-Date).AddMinutes(1) `
-RepetitionInterval (New-TimeSpan -Minutes 5) `
-RepetitionDuration (New-TimeSpan -Days $Gun)
# Bir çalışma 4 dakikayı geçmesin, üst üste binmesin
$ayar = New-ScheduledTaskSettingsSet -ExecutionTimeLimit (New-TimeSpan -Minutes 4) `
-MultipleInstances IgnoreNew -StartWhenAvailable
$kim = New-ScheduledTaskPrincipal -UserId 'SYSTEM' -LogonType ServiceAccount -RunLevel Highest
Register-ScheduledTask -TaskName $GorevAdi -Action $eylem -Trigger $tetik `
-Settings $ayar -Principal $kim `
-Description 'Boyut seçimi için 7 günlük performans ölçümü' | Out-Null
Get-ScheduledTask -TaskName $GorevAdi | Select-Object TaskName, State
Beklenen çıktı, State sütununda Ready değeridir. Varsayılan ayarla zamanın yaklaşık beşte biri örneklenir. Bu, yüzde 95'lik değeri çıkarmak için yeterlidir. Daha sık örnek isterseniz OrnekSayisi değerini 24'e çıkarın (10 saniye x 24 = 4 dakika). Bu durumda görevdeki 4 dakikalık süre sınırını da 5 dakikaya yaklaştırın.
Adım 3: Ölçümün çalıştığını doğrulayın
Görev kurulduktan 10 ile 15 dakika sonra şu iki kontrolü yapın:
# Son çalışma zamanı ve sonucu: LastTaskResult 0 olmalı
Get-ScheduledTaskInfo -TaskName 'SunucuOlcum' |
Select-Object LastRunTime, LastTaskResult, NextRunTime
# Bugünkü dosyadaki satır sayısı her 5 dakikada 6 artmalı
(Import-Csv "C:\Olcum\olcum-$(Get-Date -Format yyyyMMdd).csv" -Delimiter ';').Count
LastTaskResult değeri 0 değilse betiği Adım 1'deki gibi elle çalıştırın ve hata mesajını okuyun. En sık neden, betik yolundaki yazım hatası ya da dosyanın farklı bir klasöre kaydedilmesidir.
Sonuçları yorumlama: yüzde 95'lik değer, bellek baskısı ve disk gecikmesi
Ortalama değerler yanıltıcıdır. Gece boş kalan bir sunucunun haftalık CPU ortalaması %15 çıkabilir, ama sabah 09:30'da %95'e dayanıyor olabilir. Bu yüzden boyut kararında yüzde 95'lik değer (P95) kullanılır. P95, ölçümlerin %95'inin altında kaldığı değerdir. Arada bir yaşanan tek seferlik sıçramaları dışarıda bırakır, sürekli tekrar eden yoğunluğu ise gösterir. Boş bellek için tersine yüzde 5'lik değere (P05) bakılır, çünkü orada düşük değer kötüdür.
Aşağıdaki rapor betiği tüm CSV dosyalarını okur ve her metrik için ortalama, P05, P95 ve en yüksek değeri hesaplar. -MesaiSaatleri anahtarıyla yalnız hafta içi 08:00 ile 19:00 arasını değerlendirebilirsiniz. Windows PowerShell 5.1 için hazırlandı, yalnız okuma yapar, geri alınacak bir değişiklik yoktur.
# Rapor-Olustur.ps1: ölçüm CSV dosyalarından özet rapor üretir.
param(
[string]$Klasor = 'C:\Olcum',
[switch]$MesaiSaatleri # yalnız hafta içi 08:00-19:00 arası
)
$ci = [System.Globalization.CultureInfo]::InvariantCulture
$satirlar = @(Get-ChildItem -Path $Klasor -Filter 'olcum-*.csv' |
ForEach-Object { Import-Csv -Path $_.FullName -Delimiter ';' })
if ($satirlar.Count -eq 0) { throw "CSV bulunamadı: $Klasor" }
if ($MesaiSaatleri) {
$satirlar = @($satirlar | Where-Object {
$z = [datetime]::ParseExact($_.Zaman, 'yyyy-MM-dd HH:mm:ss', $ci)
([int]$z.DayOfWeek -in 1..5) -and $z.Hour -ge 8 -and $z.Hour -lt 19
})
}
function Get-Yuzdelik([double[]]$Dizi, [double]$Oran) {
$s = @($Dizi | Sort-Object)
$i = [math]::Max(0, [int]([math]::Ceiling($Oran * $s.Count) - 1))
return $s[$i]
}
$cs = Get-CimInstance Win32_ComputerSystem
$toplamMB = [math]::Round($cs.TotalPhysicalMemory / 1MB)
"Toplam RAM: $toplamMB MB | Mantıksal işlemci: $($cs.NumberOfLogicalProcessors) | Örnek: $($satirlar.Count)"
$kolonlar = 'CpuYuzde','IslemciKuyrugu','BosBellekMB','CommitYuzde','SayfaGirisSn',
'DiskOkumaMs','DiskYazmaMs','DiskKuyrugu','AgMbps'
$rapor = foreach ($k in $kolonlar) {
$d = [double[]]@($satirlar | ForEach-Object { [double]::Parse($_.$k, $ci) })
[pscustomobject]@{
Metrik = $k
Ortalama = [math]::Round(($d | Measure-Object -Average).Average, 2)
P05 = [math]::Round((Get-Yuzdelik $d 0.05), 2)
P95 = [math]::Round((Get-Yuzdelik $d 0.95), 2)
EnYuksek = [math]::Round(($d | Measure-Object -Maximum).Maximum, 2)
}
}
$rapor | Format-Table -AutoSize
# Bellek tahmini: boş belleğin yüzde 5'lik değeri üzerinden
$bosP05 = ($rapor | Where-Object Metrik -eq 'BosBellekMB').P05
$kullanilanMB = $toplamMB - $bosP05
"Yoğun anda kullanılan bellek (yaklaşık): $kullanilanMB MB"
"Yüzde 25 pay ile önerilen RAM: $([math]::Ceiling($kullanilanMB * 1.25 / 1024)) GB"
# Süreç özeti: hafta boyunca en yüksek özel bellek
Get-ChildItem -Path $Klasor -Filter 'surec-*.csv' |
ForEach-Object { Import-Csv $_.FullName -Delimiter ';' } |
Group-Object Surec | ForEach-Object {
[pscustomobject]@{
Surec = $_.Name
EnYuksekMB = ($_.Group | ForEach-Object { [double]$_.OzelMB } | Measure-Object -Maximum).Maximum
EnCokAdet = ($_.Group | ForEach-Object { [int]$_.Adet } | Measure-Object -Maximum).Maximum
}
} | Sort-Object EnYuksekMB -Descending | Select-Object -First 10 | Format-Table -AutoSize
Çıktının biçimi aşağıdaki gibidir. Değerler yalnız biçimi göstermek için yazılmış temsili sayılardır:
Toplam RAM: 8192 MB | Mantıksal işlemci: 4 | Örnek: 12096
Metrik Ortalama P05 P95 EnYuksek
------ -------- --- --- --------
CpuYuzde 21,4 1,2 84,6 99,8
BosBellekMB 1850,0 910,0 3400,0 4100,0
DiskOkumaMs 3,1 0,4 14,2 61,0
...
Raporu okurken şu ölçütleri kullanın. Bunlar sektörde yaygın kullanılan pratik eşiklerdir, kesin kural değildir:
- CPU: P95 sürekli %80'in üzerindeyse vCPU yetersizdir. P95 %40'ın altındaysa işlemci büyük olasılıkla fazladır.
- İşlemci kuyruğu: P95 değeri vCPU sayısının 2 katını sık sık aşıyorsa işlemler sıra bekliyordur. Bu, CPU yüzdesi yüksek görünmese bile darboğaz belirtisidir.
- Boş bellek: P05 değeri toplam RAM'in %10'unun altındaysa bellek baskısı vardır. Yalnız SQL Server çalışan sunucularda bu değer yanıltabilir, bir sonraki bölüme bakın.
- Commit yüzdesi: P95 %85'in üzerindeyse sistem taahhüt sınırına yaklaşıyordur. Bu sınıra ulaşıldığında uygulamalar "yetersiz bellek" hatası verebilir.
- Sayfa girişi: Boş bellek düşükken Pages Input/sec değeri de sürekli yükseliyorsa Windows, bellekten atılan sayfaları diskten geri okuyordur. Gerçek RAM eksikliğinin en güvenilir işareti budur.
- Disk gecikmesi: Okuma ve yazmada P95 10 ms altıysa iyi, 10 ile 20 ms arası kabul edilebilir durumdadır. 20 ms'nin üzerinde SQL Server tabanlı programlarda yavaşlık hissedilir. Bu durumda RAM eklemek yerine daha hızlı diske (NVMe SSD) geçmeyi değerlendirin.
Logo, Mikro ve SQL Server yükünü ayrı görmek
Muhasebe ve ERP sunucularında bellek genelde üç yere gider: SQL Server, uzak masaüstü oturumlarında açılan program istemcileri ve işletim sistemi. Rapor betiğinin son tablosu bu ayrımı gösterir. sqlservr satırı veritabanı motorunu, EnCokAdet sütunu ise aynı anda açık kalan istemci sayısını verir. Logo, Mikro ya da Netsis'in çalıştırılabilir dosya adını Görev Yöneticisi'nin Ayrıntılar sekmesinden kontrol edin.
Kullanıcı başına bellek ihtiyacını şöyle hesaplayabilirsiniz: program sürecinin en yüksek MB değerini, en çok adet değerine bölün. Çıkan sayı, eklenecek her kullanıcı için ayırmanız gereken yaklaşık bellektir. Buna kullanıcının oturumunda açtığı tarayıcı ve Excel gibi programları da eklemeyi unutmayın.
SQL Server'da dikkat edilecek nokta şudur: SQL Server, max server memory sınırı verilmemişse boş belleği önbellek olarak kullanır ve geri vermekte acele etmez. Bu yüzden Görev Yöneticisi'nde bellek %90 dolu görünür, ama bu her zaman RAM eksikliği anlamına gelmez. Ayrıca "Lock Pages in Memory" yetkisi açıksa sqlservr sürecinin çalışma kümesi gerçekte kullanılandan düşük görünebilir. Gerçek değeri SQL Server'ın kendisinden okuyun:
-- SQL Server'ın fiilen kullandığı bellek
SELECT physical_memory_in_use_kb / 1024 AS kullanilan_mb,
memory_utilization_percentage
FROM sys.dm_os_process_memory;
-- Tanımlı bellek tavanı (2147483647 değeri sınır yok demektir)
SELECT name, value_in_use
FROM sys.configurations
WHERE name = 'max server memory (MB)';
Tavan tanımlı değilse, boş bellek ölçümü SQL'in önbelleği yüzünden hep düşük çıkar. Doğru yorum için önce tavanı belirleyin. Microsoft'un sunucu belleği yapılandırma belgesi işletim sistemi ve diğer uygulamalar için pay bırakmayı önerir. Uzak masaüstü kullanıcıları da aynı sunucudaysa bu pay, oturum sayısına göre daha büyük tutulmalıdır. SQL Express kullanıyorsanız motorun kendi bellek ve veritabanı boyutu sınırları vardır. Bu durumda RAM eklemek tek başına sorunu çözmeyebilir.
Ölçüme göre Windows bulut sunucu boyutunu seçme
Raporu aldıktan sonra karar için üç hesap yeterlidir.
RAM: Yoğun anda kullanılan bellek = toplam RAM − boş belleğin P05 değeri. SQL Server'a tavan verdiyseniz bu değer SQL tavanı ile diğer süreçlerin toplamına yakın çıkmalıdır. Sonucu %25 ile %30 arası pay ekleyerek yukarı yuvarlayın. Bu pay, büyüyen veritabanı ve yeni kullanıcılar içindir.
vCPU: Gerekli vCPU ≈ mevcut vCPU × (CPU P95 / 70). Hedef, P95'in %70 civarında kalmasıdır. Böylece ay sonu gibi dönemlerde nefes alacak alan olur.
Disk: Gecikme eşikleri aşılıyorsa ya da kuyruk sürekli doluysa disk tipini yükseltin. Disk kapasitesi için mevcut kullanımın üzerine en az bir yıllık büyüme ve yerel yedekler için alan ekleyin.
Örnek hesap (temsili değerlerle): 8 GB RAM ve 4 vCPU'lu bir sunucuda boş belleğin P05 değeri 900 MB, CPU P95 değeri %85 çıkmış olsun. Kullanılan bellek yaklaşık 7.300 MB eder, %25 payla bu 9 GB'a ulaşır. Bu durumda bir üst paket olarak 12 ya da 16 GB seçilir. İşlemci için 4 × 85 / 70 ≈ 4,9 sonucu çıkar, yani 6 vCPU uygun olur.
Hesapladığınız değerleri Windows sunucu paketleriyle karşılaştırıp en yakın üst boyutu seçebilirsiniz. Fiziksel sunucudan buluta geçiyorsanız bir noktaya dikkat edin: eski bir fiziksel işlemcinin çekirdeği ile güncel bir vCPU aynı güçte değildir. CPU hesabını yaklaşık kabul edin ve geçişten sonraki ilk hafta ölçümü yeni sunucuda tekrarlayın.
Büyütme zamanı: Ölçüm betiğini geçişten sonra da ayda bir hafta çalıştırın. Şu durumlarda büyütmeyi planlayın:
- CPU P95 iki ölçüm dönemi üst üste %80'in üzerinde kalıyorsa,
- commit yüzdesi %85'i geçiyorsa,
- sayfa girişleri boş bellek düşükken sürekli yüksekse,
- yeni kullanıcı ya da şube eklenecekse.
Ters yönde, P95 CPU %30'un altında ve bellek rahatsa küçültmeyi değerlendirin. Çoğu bulut altyapısında boyut değişikliği yeniden başlatma gerektirdiği için işlemi mesai dışına planlayın. Sürekli izleme ve eşik aşılınca uyarı istiyorsanız haftalık ölçüm yerine sunucu izleme hizmeti daha uygundur.
Sık yapılan hatalar
- Tek anlık ölçüm: Görev Yöneticisi'ne bir kez bakıp karar vermek, en sık yapılan hatadır. Sabah açılışı, öğle arası ve ay sonu çok farklı tablo çizer.
- Tipik olmayan hafta: Bayram haftasında ya da personelin yarısı izindeyken yapılan ölçüm yükü olduğundan düşük gösterir. Muhasebe sunucularında ölçüm haftasının ay sonu kapanışını ya da beyanname dönemini kapsamasına özen gösterin.
- SQL Server tavanını unutmak: Tavan verilmemiş SQL Server'da "bellek hep dolu" görüntüsü, gereksiz RAM alımına yol açar. Tersi de olur: tavan çok düşük verildiyse SQL diske taşar ve disk gecikmesi yükselir.
- Sayfa dosyasını kapatmak: Sayfa dosyasını kapatmak ya da çok küçültmek taahhüt sınırını düşürür. Bu durumda boşta RAM varken bile uygulamalar bellek hatası verebilir. Sayfa dosyasını sistem tarafından yönetilen boyutta bırakın.
- Yalnız ortalamaya bakmak: Ortalama %20 CPU, yoğun saatlerde %95 olabilir. Kararı P95 ve P05 değerleriyle verin.
- Disk sorununu RAM ile çözmeye çalışmak: Disk gecikmesi yüksek, bellek rahatsa RAM eklemek hissedilir bir fark yaratmaz.
Sık sorulan sorular
Ölçümü ofisteki eski sunucuda yapıp sonucu bulut sunucuya uygulayabilir miyim?
Evet, bellek ve disk sonuçları doğrudan kullanılabilir. CPU sonucunu ise yaklaşık kabul edin, çünkü işlemci kuşağı ve saat hızı değişir. Geçişten sonraki ilk hafta betiği yeni sunucuda tekrar çalıştırıp boyutu doğrulayın.
Görev Yöneticisi'nde RAM %90 dolu görünüyor, daha fazla RAM mi almalıyım?
Hemen değil. SQL Server tavansız çalışıyorsa belleği önbellek olarak doldurur. Önce max server memory değerini kontrol edin, ardından sayfa girişlerine ve commit yüzdesine bakın. İkisi de normalse RAM eksikliği yoktur.
Betik sunucuyu yavaşlatır mı?
Hayır, fark edilir bir yük oluşturmaz. Betik 5 dakikada bir, bir dakika boyunca birkaç sayaç okur ve küçük bir CSV satırı yazar. Bir haftalık veri genellikle birkaç MB'ı geçmez.
7 gün yeterli mi?
Çoğu işletme için tam bir iş haftası temel tabloyu verir. Muhasebe ve ERP sunucularında ay sonu yoğunluğu belirgin olduğu için ölçüm haftasının ayın son günlerini kapsaması iyi olur. Gerekirse Gorev-Kur.ps1 içindeki $Gun değerini 14 ya da 31 yapın.
Türkçe Windows'ta Get-Counter neden hata veriyor?
Sayaç adları sistem diline çevrilmiştir, İngilizce adla sorgulayınca bulunamaz. Rehberdeki betik bu yüzden İngilizce adı kayıt defterindeki sayaç numarası üzerinden sistem diline çevirir. Elle sorgularken Get-Counter -ListSet * komutuyla yerel adları listeleyebilirsiniz.
Sonuç
Doğru Windows bulut sunucu boyutu, bir haftalık ölçüm ve üç basit hesapla bulunur. CPU için P95, bellek için boş belleğin P05 değeri, disk için gecikme. Ölçüm betiğini kurun, görevi 7 gün çalıştırın, rapor betiğiyle özeti alın. Ardından SQL Server tavanını hesaba katarak %25 payla en yakın üst paketi seçin. Aynı betikleri geçişten sonra da düzenli çalıştırırsanız büyütme ya da küçültme kararını tahminle değil, verilerle verirsiniz.
- #windows bulut sunucu
- #powershell
- #get-counter
- #performans izleme
- #ram boyutlandırma
- #sql server
- #logo
- #zamanlanmış görev
Yazar
Kurucu, sunucu.com.tr · Bulut altyapısı ve yapay zeka otomasyonları
sunucu.com.tr ve Sunucu UK'in kurucusu. Bulut altyapısı, sanallaştırma ve sunucu yönetimi üzerine çalışıyor; şirketlerin iş yazılımlarını, web sitelerini ve yapay zeka iş yüklerini güvenli sunuculara taşıyor. Blogdaki rehberler sahada karşılaşılan kurulum, güvenlik ve taşıma işlerinden derlenir; yazılar yapay zeka desteğiyle hazırlanır ve kaynaklarla doğrulanır.