Disk yavaşlığı şikayetleriyle karşılaşmayan sysadmin yok gibidir. “Sunucu kasıyor”, “veritabanı sorguları çok uzun sürüyor”, “uygulama zaman zaman donuyor” gibi şikayetlerin arkasında çoğu zaman disk I/O darboğazı yatar. İşte tam bu noktada iostat komutu devreye girer ve size diskin ne yaptığını, ne kadar meşgul olduğunu, ne kadar beklettiğini net rakamlarla gösterir.
iostat Nedir ve Neden Kullanılır?
iostat, sysstat paketinin bir parçasıdır ve CPU kullanım istatistikleriyle birlikte blok cihazlarına ait I/O istatistiklerini raporlar. /proc/diskstats dosyasından veri okuyarak size disk okuma/yazma hızları, istek kuyruk uzunlukları, servis süreleri ve bekletme süreleri gibi kritik metrikleri sunar.
Neden iostat tercih edilir? Çünkü sadece “disk kullanımda mı?” sorusunu değil, “disk nasıl kullanılıyor, nerede tıkanıyor?” sorularını da yanıtlar. df size disk doluluk oranını söyler, du dizin boyutlarını verir, ama I/O performansı için iostat vazgeçilmezdir.
Öncelikle paketi sisteme kuralım:
# Debian/Ubuntu
sudo apt install sysstat
# RHEL/CentOS/AlmaLinux
sudo dnf install sysstat
# Arch Linux
sudo pacman -S sysstat
Kurulumdan sonra servisi etkinleştirmeyi unutmayın, çünkü sysstat arka planda istatistik toplar:
sudo systemctl enable --now sysstat
Temel Kullanım ve Çıktıyı Okumak
En basit kullanımıyla iostat komutunu çalıştırdığınızda hem CPU hem de disk özetini görürsünüz:
iostat
Çıktı şuna benzer bir şey olacak:
Linux 5.15.0-91-generic (webserver01) 12/15/2024 _x86_64_ (4 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
3.42 0.00 1.23 8.45 0.00 86.90
Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd
sda 45.23 234.12 1823.45 0.00 456789 3567890 0
sdb 2.10 12.34 89.23 0.00 24123 174234 0
Bu çıktıdaki alanlara bakalım:
- %iowait: CPU’nun I/O işlemlerini bekleyerek geçirdiği zaman yüzdesi. Bu değer sürekli yüksekse disk performans sorununuz var demektir.
- tps: Saniye başına transfer (transaction) sayısı. Diske giden istek sayısını gösterir.
- kB_read/s: Saniye başına okunan kilobyte miktarı.
- kB_wrtn/s: Saniye başına yazılan kilobyte miktarı.
- kB_read: Başlangıçtan bu yana toplam okunan veri.
- kB_wrtn: Başlangıçtan bu yana toplam yazılan veri.
Önemli Parametreler
Gerçek analizde sadece iostat yazmak yetmez. Parametrelerle komutu çok daha güçlü hale getirirsiniz:
- -x: Genişletilmiş istatistikleri gösterir. Gerçek analizde neredeyse her zaman bu parametreyi kullanırsınız.
- -d: Sadece disk istatistiklerini gösterir, CPU çıktısını bastırır.
- -c: Sadece CPU istatistiklerini gösterir.
- -k: Çıktıyı kilobyte cinsinden verir (varsayılan).
- -m: Çıktıyı megabyte cinsinden verir, daha okunaklıdır.
- -g grup_adi: Belirtilen cihazları gruplayarak toplu istatistik gösterir.
- -p: Bölümleri (partition) ayrı ayrı gösterir.
- -N: LVM cihaz isimlerini gösterir.
- -t: Her rapor satırına zaman damgası ekler, monitoring için şart.
- -y: İlk raporu (önyükleme istatistikleri) atlar, sadece gerçek zamanlı veri gösterir.
- -z: Aktivite olmayan cihazları çıktıdan gizler.
Sayısal parametreler de çok önemli: iostat [interval] [count] şeklinde kullanılır. Örneğin iostat 2 10 komutu 2 saniye aralıklarla 10 kez rapor alır.
Genişletilmiş İstatistikler ile Derinlemesine Analiz
Asıl güç -x parametresinde saklıdır. Gelin bunu gerçek bir senaryoyla inceleyelim:
iostat -x -m -t 2 5
Bu komut 2 saniye arayla 5 rapor alır, megabyte cinsinden gösterir ve zaman damgası ekler. Çıktıda göreceğiniz ekstra alanlar şunlardır:
- r/s: Saniye başına okuma isteği sayısı.
- w/s: Saniye başına yazma isteği sayısı.
- rMB/s: Saniye başına okunan megabyte.
- wMB/s: Saniye başına yazılan megabyte.
- rrqm/s: Birleştirilen okuma isteklerinin saniye başına sayısı. Yüksek olması I/O scheduler’ın iyi çalıştığını gösterir.
- wrqm/s: Birleştirilen yazma isteklerinin saniye başına sayısı.
- r_await: Okuma isteklerinin ortalama bekleme süresi (milisaniye). Bu metrik altın değerindedir.
- w_await: Yazma isteklerinin ortalama bekleme süresi (milisaniye).
- aqu-sz (veya avgqu-sz): Ortalama I/O kuyruğu boyutu. 1’in üzerindeyse dikkat edin.
- rareq-sz: Ortalama okuma isteği boyutu (kilobyte).
- wareq-sz: Ortalama yazma isteği boyutu (kilobyte).
- svctm: Servis süresi (deprecated, artık güvenilir değil, %util kullanın).
- %util: Disk kullanım yüzdesi. Sürekli %100’e yakınsa ciddi darboğaz var demektir.
Gerçek Dünya Senaryosu: Yavaş Çalışan Veritabanı
Bir PostgreSQL sunucusunda sorgular yavaşlamış, kullanıcılar şikayet ediyor. Önce genel tabloya bakalım:
iostat -x -m -t 5 3
Çıktıda şunu görüyoruz diyelim:
12/15/2024 14:23:45
Device r/s w/s rMB/s wMB/s r_await w_await aqu-sz %util
sda 12.3 287.4 0.8 18.4 2.1 145.3 41.2 98.7
Bu çıktı bize çok şey söylüyor. %util 98.7 yani disk neredeyse sürekli meşgul. w_await 145.3ms yani yazma istekleri 145 milisaniye bekliyor, bu çok yüksek. aqu-sz 41.2 yani kuyruğa 41 istek birikmiş, disk bunları yetiştiremiyor.
Peki sorun nerede? Hangi process bu kadar yazma yapıyor diye bakalım:
# iotop kurulu değilse önce kur
sudo apt install iotop
# Disk I/O yapan processleri göster
sudo iotop -o -b -n 3 -d 2
Sonra iostat ile sadece ilgili diski izleyelim:
iostat -x -m -t 2 -p sda
Bu senaryo genellikle üç şeyden kaynaklanır: yetersiz RAM (buffer/cache dolmuş, her şey diske yazılıyor), yanlış yapılandırılmış PostgreSQL (checkpoint_completion_target, shared_buffers gibi parametreler), ya da diskin fiziksel kapasitesinin yetersizliği.
Gerçek Dünya Senaryosu: Gece Yarısı Performans Düşüşü
Bir web sunucusu her gece 02:00-03:00 arası yavaşlıyor. Gündüz bakıldığında her şey normal görünüyor. Bu tür sorunlar için zaman damgalı ve kayıt edilen iostat şart:
# Her 10 saniyede bir kayıt al, süresiz çalıştır
iostat -x -m -t 10 >> /var/log/iostat_$(hostname)_$(date +%Y%m%d).log 2>&1 &
Veya cron ile daha düzenli bir yöntem:
# Crontab'a ekle - her dakika çalışır
* * * * * /usr/bin/iostat -x -m -t 1 1 >> /var/log/iostat_perf.log
Gece yarısı loguna bakıldığında şunu görebilirsiniz: tam 02:00’de %util yüzde 20’den yüzde 95’e fırlıyor, r_await dakikalarca yüksek kalıyor. Bu klasik bir cron job veya backup işareti. crontab -l ve /etc/cron.d/ içeriklerine bakıldığında büyük ihtimalle bir yedekleme scripti bulunur.
Bölüm Bazlı Analiz
Birden fazla partition olan sunucularda hangi bölümün sorun çıkardığını bulmak için:
iostat -x -m -p ALL -t 2
LVM kullanan sistemlerde:
iostat -x -m -N -t 2
Bu komut /dev/mapper/vg_data-lv_postgres gibi mantıksal birimleri gerçek isimleriyle gösterir. RAID ya da LVM mimarilerinde fiziksel diskin mi yoksa mantıksal birimin mi doyduğunu anlamak için bu ayrım kritiktir.
iostat Çıktısını Yorumlamak: Kırmızı Bayraklar
Belirli değerlerin neye işaret ettiğini bilin:
%util değerleri:
- 0-60: Normal, disk rahat çalışıyor.
- 60-80: Yüklenmeye başlıyor, yakından takip et.
- 80-95: Yüksek yük, darboğaz riski var. Optimizasyon gerekiyor.
- 95-100: Kritik darboğaz. Disk kapasitesi yetersiz veya yanlış yapılandırma.
r_await ve w_await değerleri:
- 0-5ms: SSD için normal değerler.
- 5-20ms: Kabul edilebilir, HDD için makul.
- 20-100ms: Yüksek, incelenmeli.
- 100ms üstü: Problem var, kullanıcılar kesinlikle hissediyordur.
aqu-sz (kuyruk boyutu):
- 0-1: Normal.
- 1-5: Yük artıyor ama yönetilebilir.
- 5 üstü: Disk istekleri birikmeye başlamış, ciddi darboğaz işareti.
Pratik Analiz Script’i
Günlük rutin izleme için kullanabileceğiniz kapsamlı bir script:
#!/bin/bash
# disk_health_check.sh - Disk I/O durumu özeti
LOG_DIR="/var/log/sysadmin"
DATE=$(date +%Y%m%d_%H%M%S)
HOSTNAME=$(hostname -s)
THRESHOLD_UTIL=80
THRESHOLD_AWAIT=50
mkdir -p "$LOG_DIR"
echo "========================================" | tee "$LOG_DIR/disk_io_$DATE.log"
echo "Disk I/O Analizi - $DATE - $HOSTNAME" | tee -a "$LOG_DIR/disk_io_$DATE.log"
echo "========================================" | tee -a "$LOG_DIR/disk_io_$DATE.log"
# 30 saniye boyunca 5'er saniyelik 6 rapor al
iostat -x -m -t -y 5 6 | tee -a "$LOG_DIR/disk_io_$DATE.log"
# Son rapordaki %util değerlerini kontrol et
echo ""
echo "--- Kritik Eşik Kontrolleri ---"
iostat -x -y 1 1 | awk -v thresh="$THRESHOLD_UTIL" '
/Device/ { next }
NF > 0 && $NF+0 > thresh {
printf "UYARI: %s diski %%%s kullanim oraninda!n", $1, $NF
}
'
echo "Rapor kaydedildi: $LOG_DIR/disk_io_$DATE.log"
Bu scripti /usr/local/bin/disk_health_check.sh olarak kaydedin, çalıştırma izni verin (chmod +x) ve cron’a ekleyin.
iostat ile watch Kombinasyonu
Gerçek zamanlı dashboard gibi bir görünüm için watch ile birleştirin:
watch -n 2 'iostat -x -m -y 1 1'
Ya da sadece kritik sütunları görmek için awk ile filtreleyin:
iostat -x -m -y 1 1 | awk 'NR==1 || /Device/ || /sd/ || /nvme/ || /vd/'
NVMe Diskler ve Özel Durumlar
Modern sunucularda NVMe diskler yaygınlaştı. iostat bunları da destekler ama cihaz isimleri farklıdır (nvme0n1, nvme0n1p1 gibi). NVMe’nin çok kuyruklu mimarisi nedeniyle aqu-sz değerleri HDD’ye göre çok daha yüksek olabilir ve bu normal karşılanabilir. Asıl bakılması gereken yine r_await, w_await ve %util değerleridir:
# Sadece NVMe cihazları izle
iostat -x -m -t 2 nvme0n1 nvme1n1
Birden fazla NVMe diski grup olarak izlemek için:
iostat -x -m -t -g nvme_toplam 2 nvme0n1 nvme1n1
iostat Çıktısını Başka Araçlarla Entegre Etmek
Gerçek ortamlarda iostat verisini Grafana veya başka monitoring sistemlerine beslemek isteyebilirsiniz. Bunun için json çıktısını kullanabilirsiniz (sysstat 12.x ve üstü):
iostat -x -m -t -o JSON 2 3
JSON çıktısını bir Python scriptiyle ayrıştırıp InfluxDB veya Prometheus gibi sistemlere aktarabilirsiniz. Collectd ve sar gibi araçlar da aynı sysstat altyapısını kullanarak otomatik veri toplar.
Basit bir log parsing örneği için iostat çıktısını csv formatında kaydetmek de işe yarar:
# iostat çıktısını parse edilebilir formatta kaydet
iostat -x -m -t -y 5 | grep -E "^(nvme|sd|vd)" |
awk '{print systime()","$0}' >> /var/log/iostat_csv.log
sar ile Karşılaştırmalı Kullanım
sar komutu da sysstat paketinin parçasıdır ve geçmiş verilere bakma konusunda iostat‘tan üstündür. Örneğin dün gece 02:00’deki disk durumuna bakmak için:
# Dünkü I/O istatistiklerini gör
sar -d -m 1 -f /var/log/sysstat/sa$(date -d "yesterday" +%d)
# Belirli saat aralığı için
sar -d -m 1 -s 02:00:00 -e 03:00:00 -f /var/log/sysstat/sa14
iostat anlık ve kısa vadeli izleme için, sar geçmişe dönük analiz için kullanılır. İkisi birbirini tamamlar.
Yaygın Hatalar ve Dikkat Edilmesi Gerekenler
İlk satırı görmezden gelin: iostat komutunu watch veya script içinde kullandığınızda görünen ilk rapor, sistem açılışından bu yana olan ortalamadır. Gerçek anlık veriyi görmek için -y parametresini kullanın ya da ikinci raporu baz alın.
Sanal makinelerde yorumlama farkı: VM ortamlarında %util değerleri yanıltıcı olabilir. Hypervisor katmanında I/O sanallaştırıldığı için %100 görseniz bile fiziksel diskte durum farklı olabilir. Bu durumda hypervisor tarafındaki araçlarla çapraz kontrol yapın.
RAID controller cache etkisi: Hardware RAID ile write-back cache aktifse yazma süreleri yapay olarak düşük görünür. Gerçek I/O yükünü anlamak için controller istatistiklerini de takip edin.
tmpfs ve ramfs cihazları: Bunlar çıktıda görünmez çünkü gerçek blok cihazları değildir. Sadece gerçek depolama cihazları raporlanır.
Sonuç
iostat disk sorunlarının teşhisinde ilk ve en hızlı başvuracağınız araçlardan biridir. %util, r_await, w_await ve aqu-sz değerlerini anlamak, sizi “disk yavaş” şikayetinden “şu diskin yazma gecikmesi 180ms’ye çıkmış, RAID grubuna disk eklememiz lazım” gibi somut tespitlere götürür.
Pratik önerim şudur: her sunucunuzda sysstat servisini etkin tutun, düzenli aralıklarla iostat logları alın ve eşik değer aşımlarında alarm üretecek basit bir script yazın. Sorun çıkmadan önce hangi disklerin yüklenmeye başladığını görmek, gece 03:00’te alarm çalmasından çok daha iyidir.
Disk I/O analizi tek başına yetmez, vmstat ile bellek baskısını, iotop ile hangi processin disk yaktığını, strace ile uygulama düzeyinde I/O paternini de incelemelisiniz. Ama her şey iostat‘la başlar.