Sistem yöneticiliğinde en sık karşılaşılan problemlerin başında “bu sunucu neden yavaş?” sorusu gelir. Uygulamalar cevap vermez, sayfalar yüklenmez, kullanıcılar şikayet eder ve sen terminale bakıp ne yapacağını düşünürsün. İşte bu anlarda vmstat komutu, sana saniyeler içinde sistemin nabzını tutan, hem bellek hem CPU hem de I/O hakkında özet bilgi sunan bir araç olarak karşına çıkar. Bu yazıda vmstat‘ı gerçekten kullanışlı hale getiren her detayı ele alacağız.
vmstat Nedir ve Neden Kullanmalısın?
vmstat (virtual memory statistics), Linux çekirdeğinden sistem kaynaklarına dair anlık ve periyodik istatistikler toplayan bir komuttur. Adı “virtual memory statistics” olmasına rağmen sadece bellek değil; CPU kullanımı, blok I/O aktivitesi, sistem çağrıları ve bağlam değiştirme (context switch) gibi kritik metrikleri de raporlar.
top ya da htop gibi araçlarla karşılaştırıldığında vmstat‘ın birkaç önemli avantajı vardır. Öncelikle çok daha az sistem kaynağı tüketir. İkincisi, çıktısı script ve log dosyasına yönlendirmek için idealdir çünkü temiz bir metin formatında gelir. Üçüncüsü, zaman içindeki trendi görmek için periyodik örnekleme yapabilirsin, yani “5 dakika önce ne oluyordu?” sorusuna cevap verebilirsin.
Genellikle procps paketi içinde gelir ve neredeyse tüm Linux dağıtımlarında varsayılan olarak yüklüdür.
# vmstat'ın kurulu olup olmadığını kontrol et
which vmstat
vmstat --version
Temel Kullanım ve Çıktıyı Anlamak
vmstat‘ı hiçbir parametre vermeden çalıştırırsan sistem başladığından bu yana olan ortalama değerleri gösterir. Bu değerler çoğu zaman yanıltıcı olabilir, bu yüzden genellikle bir aralık ve tekrar sayısı belirterek kullanmak daha doğrudur.
# Temel kullanım - başlangıçtan bu yana ortalama
vmstat
# 2 saniyede bir, 10 kez örnekle
vmstat 2 10
# Sadece aralık belirt, sürekli çalışsın
vmstat 3
Çıktı şu şekilde görünür:
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 1245600 89432 2156788 0 0 12 8 234 456 5 2 92 1 0
Bu çıktıyı bölüm bölüm inceleyelim çünkü her sütun ayrı bir hikaye anlatır.
procs Bölümü
- r: Run queue’da bekleyen ya da çalışan proses sayısı. Bu değer CPU çekirdek sayısını sürekli aşıyorsa ciddi bir CPU yükü var demektir.
- b: Kesintisiz uyku (uninterruptible sleep) durumundaki proses sayısı. I/O beklentisinde takılı prosesler burada görünür.
memory Bölümü
- swpd: Kullanılan swap alanı (KB cinsinden). Sıfır olmayan bir değer varsa sisteme dikkat etmelisin.
- free: Kullanılmayan bellek miktarı (KB). Tek başına bir anlam ifade etmez, buff ve cache ile birlikte değerlendir.
- buff: Tampon bellek (buffer). Disk blok cihazları için kullanılan bellek.
- cache: Dosya sistemi önbelleği. Yüksek olması normaldir ve iyi bir şeydir; Linux boş belleği cache olarak kullanır.
swap Bölümü
- si: Saniyede diskten RAM’e alınan swap miktarı (swap in). Bu değer sıfırdan büyükse sistem bellek sıkıntısı yaşıyor.
- so: Saniyede RAM’den diske yazılan swap miktarı (swap out). Sürekli yüksek bir değer ciddi bellek baskısı işaretidir.
io Bölümü
- bi: Saniyede blok cihazlardan okunan blok sayısı (blocks in).
- bo: Saniyede blok cihazlara yazılan blok sayısı (blocks out).
system Bölümü
- in: Saniyedeki interrupt (kesme) sayısı. Saatteki tikler dahil.
- cs: Saniyedeki context switch sayısı. Çok yüksek değerler çok sayıda küçük ve kısa ömürlü proses işaretçisi olabilir.
cpu Bölümü
- us: User space’de geçirilen CPU yüzdesi. Uygulama kodunun tüketimi.
- sy: Kernel space’de geçirilen CPU yüzdesi. Sistem çağrıları ve kernel işlemleri.
- id: Boşta geçirilen CPU yüzdesi (idle). Yüksek olması iyidir.
- wa: I/O beklentisinde geçirilen CPU yüzdesi. Disk ya da ağ I/O darboğazı varsa burası yükselir.
- st: Sanallaştırma ortamında başka sanal makine tarafından çalınan CPU yüzdesi (steal time). VPS ve bulut sunucularda önemlidir.
Önemli Parametreler
- -a: Aktif ve inaktif bellek ayrımını gösterir.
buffvecacheyerineinactveactivesütunları gelir. - -d: Disk istatistiklerini gösterir. Her disk için ayrı satır açar.
- -s: Tek satır çıktı yerine bellek istatistiklerini tablo formatında listeler (event counter’ları gösterir).
- -m: Slabinfo verilerini gösterir. Kernel bellek tahsisi için kullanılan slab allocator bilgileri.
- -n: Başlığı sadece bir kez yazar, periyodik örneklemede başlığın her tekrarda tekrarlanmasını önler.
- -t: Her satıra timestamp ekler. Log dosyasına yazarken çok işe yarar.
- -w: Geniş çıktı modu. Büyük sayılar için sütunları genişletir.
- -S: Birimleri değiştir.
-S Mile megabyte cinsinden çıktı alırsın.
# Megabyte cinsinden göster
vmstat -S M 2 5
# Timestamp ile birlikte
vmstat -t 2 10
# Disk istatistikleriyle birlikte
vmstat -d 2 5
# Aktif/inaktif bellek ayrımıyla
vmstat -a 2 5
Gerçek Dünya Senaryosu 1: CPU Darboğazı Tespiti
Üretim ortamında bir web sunucusunun yavaşladığı bildirildi. top çalıştırıyorsun ama hangi prosenin suçlu olduğunu tam anlayamıyorsun. vmstat ile önce genel tabloyu çiz:
vmstat -n 1 30
Bu komut 30 saniye boyunca 1 saniyelik aralıklarla çıktı verecek. Çıktıda şunu görüyorsun:
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
8 0 0 1245600 89432 2156788 0 0 2 4 1234 4560 78 8 14 0 0
9 0 0 1243200 89432 2156788 0 0 0 0 1456 5230 82 9 9 0 0
7 0 0 1241000 89432 2156788 0 0 0 0 1234 4890 79 7 14 0 0
Burada r değerinin sürekli yüksek (7-9) olması ve id‘nin düşük (9-14%) olması açık bir CPU doygunluğunu gösteriyor. wa değerinin sıfıra yakın olması ise I/O problemi olmadığını söylüyor. Sorun CPU bound. us değerinin yüksek olması kullanıcı uygulamalarının, sy‘nin yüksek olması ise kernel’ın CPU tükettiğini gösterir. Bu durumda ps aux --sort=-%cpu | head -20 ile en çok CPU tüketen proseslere bakman gerekir.
Gerçek Dünya Senaryosu 2: Bellek Sıkıntısı ve Swap Baskısı
Bir veritabanı sunucusunda gece 2’de performans düşüşü yaşanıyor. Sabah logları inceliyorsun ve şunu görüyorsun:
# Gece toplanan vmstat logunu incele
grep -v "^procs" /var/log/vmstat.log | awk '$7 > 0 || $8 > 0'
Eğer si ve so sütunlarında değerler görüyorsan sistem gece swap kullanmış demektir. Bunu önlemek için gerçek zamanlı izleme kuralım:
# si veya so değeri 0'dan büyük olduğunda uyar (basit bir örnek)
vmstat 5 | awk 'NR>2 { if ($7 > 0 || $8 > 0) print strftime("[%Y-%m-%d %H:%M:%S]"), "SWAP ALERT: si="$7, "so="$8 }'
Swap aktivitesini görmek için daha detaylı bir yaklaşım:
# free ve swpd değerlerini takip et
vmstat -S M -n 2 20 | awk 'NR==1{print} NR>2{printf "%s free=%sMB swpd=%sMB si=%s so=%sn", NR, $4, $3, $7, $8}'
Bu senaryoda free değerinin hızla düştüğünü ve swpd‘nin arttığını görürsen mutlaka hangi prosenin bellek yuttuğunu bulmak için ps aux --sort=-%mem | head -10 çalıştırmalısın.
Gerçek Dünya Senaryosu 3: I/O Darboğazı Analizi
Disk I/O problemi yaşayan bir sistemde wa değeri sürekli yüksek gelir:
vmstat 2 15
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 4 0 2145600 89432 2156788 0 0 8234 4560 234 456 5 3 12 80 0
0 3 0 2143200 89432 2156788 0 0 7123 3890 198 389 4 2 15 79 0
1 5 0 2141000 89432 2156788 0 0 9456 5120 267 512 6 4 11 79 0
b değerinin yüksek (3-5) ve wa‘nın %79-80 seviyesinde olması açık bir disk I/O darboğazı. Bu durumda:
# Disk istatistiklerini vmstat ile detaylı incele
vmstat -d 2 5
# Hangi diskin sorunlu olduğunu bul
iostat -x 2 5
# Hangi proses I/O yapıyor
iotop -o
vmstat -d çıktısı şu şekilde görünür:
vmstat -d 2 3
Bu çıktıda her disk için reads/writes sütunları gelir. sda diskinde reads.ms veya writes.ms değerleri çok yüksekse o disk doymuş demektir.
vmstat Çıktısını Loglama
Uzun vadeli analiz için vmstat çıktısını dosyaya kaydetmek çok değerlidir. Bunu cron ile yapabilirsin:
# /usr/local/bin/vmstat_logger.sh dosyasını oluştur
cat << 'EOF' > /usr/local/bin/vmstat_logger.sh
#!/bin/bash
LOGFILE="/var/log/vmstat_$(date +%Y%m%d).log"
echo "=== vmstat log started at $(date) ===" >> "$LOGFILE"
vmstat -t -n 10 360 >> "$LOGFILE" 2>&1
EOF
chmod +x /usr/local/bin/vmstat_logger.sh
# Her saat başı çalışsın (crontab -e ile ekle)
# 0 * * * * /usr/local/bin/vmstat_logger.sh
Daha uzun süreli izleme için:
# Sürekli çalışan, tarih damgalı loglama
vmstat -t 30 >> /var/log/vmstat_continuous.log &
# Logrotate ile yönet
cat << 'EOF' > /etc/logrotate.d/vmstat
/var/log/vmstat_continuous.log {
daily
rotate 7
compress
missingok
notifempty
}
EOF
Context Switch Analizi
Yüksek cs değerleri özellikle çok iş parçacıklı uygulamalarda ve containerized ortamlarda performans sorunlarına yol açabilir.
# Context switch'i izole et
vmstat -n 1 20 | awk 'NR>2 {print NR, "cs:", $12, "interrupts:", $11}'
Normal bir sistemde context switch değerleri saniyede birkaç binden on binlere kadar çıkabilir. Ancak birkaç yüz bini aşmaya başlarsa şüphelenmelisin. Bunu araştırmak için:
# Hangi proses çok context switch yapıyor
pidstat -w 2 10
# Alternatif olarak
cat /proc/$(pgrep nginx | head -1)/status | grep ctxt
vmstat ile Sanallaştırma Sorunlarını Tespit Etmek
Bulut sunucularda ya da VPS’lerde st (steal time) değeri kritik önem taşır. Steal time, hypervisor’ın CPU’yu başka bir sanal makineye ayırdığı için senin sanal makinenin beklemek zorunda kaldığı süredir.
# Steal time'ı izle
vmstat -n 1 60 | awk 'NR>2 {if ($16 > 5) print strftime("%H:%M:%S"), "HIGH STEAL TIME:", $16"%"}'
st değeri sürekli %5’in üzerindeyse bulut sağlayıcına şikayet etme zamanı gelmiştir ya da daha iyi bir instance tipine geçmeyi düşünmelisin. Bu değer genellikle aşırı yüklenmiş fiziksel sunucularda bulunan VPS’lerde yükselir, özellikle “noisy neighbor” problemi olarak bilinir.
Pratik Karşılaştırma: vmstat ile Hızlı Sağlık Kontrolü
Bir sunucuya bağlandığında ilk 2 dakikada sistemin genel sağlığını değerlendirmek için şu script’i kullanabilirsin:
#!/bin/bash
# Hızlı sistem sağlık kontrolü
echo "=== Sistem Sağlık Kontrolü ==="
echo "Tarih: $(date)"
echo ""
echo "--- Son 10 saniye vmstat özeti ---"
vmstat -n 1 10 | tail -5
echo ""
echo "--- Bellek Özeti ---"
vmstat -s | head -15
echo ""
echo "--- Disk I/O ---"
vmstat -d | grep -v "^disk|^total"
echo ""
echo "--- Yük Ortalaması ---"
uptime
Bu script’i /usr/local/bin/syscheck olarak kaydedip chmod +x ile çalıştırılabilir hale getirirsen hızlı triage için çok işe yarar.
vmstat -s ile Detaylı Bellek Sayaçları
vmstat -s komutu sistem başladığından bu yana biriken olayları gösterir. Swap kullanımı, sayfa hataları (page faults) ve fork çağrıları gibi veriler burada görünür.
vmstat -s
Çıktıda dikkat etmen gereken satırlar:
- pages swapped in / out: Toplam swap aktivitesi. Çok büyükse bellek yönetimi sorunlu.
- pages paged in / out: Normal sayfalama, swap’tan farklı.
- forks: Toplam fork sayısı. Çok sık fork yapan uygulamaları gösterir.
- non-nice user cpu ticks: Kullanıcı uygulamalarına harcanan CPU.
- used memory: Kullanılan toplam bellek.
Slab Bellek Sorunlarını Tespit Etmek
Bazen sisteme yeterli RAM olmasına rağmen free komutu az boş bellek gösterir ve sistem yavaşlar. Bu durumda slab cache dolmuş olabilir.
# Slab bilgilerini gör
vmstat -m | sort -k3 -rn | head -20
# Alternatif
cat /proc/slabinfo | sort -k3 -rn | head -20
# Slab cache'i temizle (dikkatli kullan, production'da düşün)
echo 2 > /proc/sys/vm/drop_caches
vmstat -m çıktısında hangi kernel modülünün veya dosya sistemi bileşeninin en çok slab bellek tükettiğini görebilirsin. dentry ve inode_cache değerleri çok yüksekse dosya sistemi operasyonları yoğun demektir.
Alarm Sistemi Kurma
Basit bir bash script ile vmstat tabanlı alarm sistemi kurabilirsin:
#!/bin/bash
# /usr/local/bin/vmstat_alert.sh
THRESHOLD_CPU_WAIT=20
THRESHOLD_SWAP=100
ALERT_EMAIL="[email protected]"
LOGFILE="/var/log/vmstat_alerts.log"
vmstat -n 5 12 | tail -10 | while read line; do
# Başlık satırlarını atla
[[ "$line" =~ ^[[:alpha:]] ]] && continue
wa=$(echo $line | awk '{print $16}')
so=$(echo $line | awk '{print $8}')
if [ ! -z "$wa" ] && [ "$wa" -gt "$THRESHOLD_CPU_WAIT" ] 2>/dev/null; then
MSG="[$(date)] UYARI: I/O wait %${wa} - Esik deger: %${THRESHOLD_CPU_WAIT}"
echo "$MSG" >> "$LOGFILE"
echo "$MSG" | mail -s "vmstat I/O Alert - $(hostname)" "$ALERT_EMAIL"
fi
if [ ! -z "$so" ] && [ "$so" -gt "$THRESHOLD_SWAP" ] 2>/dev/null; then
MSG="[$(date)] UYARI: Swap out aktif: ${so} blok/sn"
echo "$MSG" >> "$LOGFILE"
echo "$MSG" | mail -s "vmstat Swap Alert - $(hostname)" "$ALERT_EMAIL"
fi
done
vmstat’ı Diğer Araçlarla Birlikte Kullanmak
vmstat tek başına güçlü olsa da diğer araçlarla kombinlenince çok daha etkili olur:
vmstatile genel tabloyu çizersin,topile hangi prosenin suçlu olduğunu bulursun.vmstat -dile disk aktivitesini görürsün,iostat -xile hangi diskin ve ne kadar latency ile çalıştığını anlarsın.vmstatile bellek baskısını tespit edersin,smemya dapmapile hangi prosenin ne kadar bellek tuttuğunu görürsün.- Context switch yüksekse
vmstat‘tan sonraperf statile kernel düzeyinde analiz yapabilirsin.
# Kombinli hızlı analiz
echo "=== vmstat ===" && vmstat 1 5
echo "=== iostat ===" && iostat -x 1 3 2>/dev/null || echo "iostat kurulu degil"
echo "=== En fazla CPU kullanan 5 proses ===" && ps aux --sort=-%cpu | head -6
echo "=== En fazla bellek kullanan 5 proses ===" && ps aux --sort=-%mem | head -6
Sonuç
vmstat sysadmin arsenalinin vazgeçilmez bir parçasıdır. Özellikle şu durumlarda ilk çalıştırman gereken komuttur: sistem açıklanamayan bir şekilde yavaşladığında, bellek dolup dolmadığından emin olmak istediğinde, CPU’nun gerçekten meşgul mu yoksa I/O bekleyip beklemediğini anlamak istediğinde ve bulut sunucusunda steal time problemi yaşandığından şüphelendiğinde.
Aklında şunları tutarsan vmstat’tan maksimum verimi alırsın: r değeri CPU çekirdek sayısını aşmamalı, si ve so sıfır olmalı, wa %5-10’u geçmemeli, st %5’in altında kalmalı ve cs değeri çok hızlı artmamalı.
Sistematik bir izleme altyapısı kurmak istiyorsan vmstat çıktılarını loglayıp Grafana gibi araçlarla görselleştirmek uzun vadede çok değerli olacaktır. Ama kriz anında, hızlıca bir sunucuya bağlanıp vmstat 2 10 yazmak, sana o sistemin son 20 saniyedeki davranışı hakkında düzinelerce sayfanın anlatacağından fazla bilgi verecektir. Basitliğini küçümseme, bu komut onlarca yıllık savaştan geçmiş ve hâlâ birinci sıradadır.