Disk ve I/O Performansını Netdata ile Takip Etme
Sunucunuzda bir şeyler yavaşladığında ilk şüphelendiğiniz yer genellikle CPU ya da RAM olur. Ama çoğu zaman asıl suçlu disktir. Yavaş I/O, yüksek bekleme süreleri, dolmaya yüz tutmuş diskler… Bunların hepsini zamanında fark etmezseniz, gece yarısı bir prodüksiyion sunucusu çöküşüyle yüz yüze gelirsiniz. Netdata tam da bu noktada devreye giriyor. Gerçek zamanlı, saniyelik çözünürlükte disk ve I/O metriklerini görsel olarak sunan Netdata, sysadmin hayatını ciddi ölçüde kolaylaştırıyor. Bu yazıda disk performansını Netdata ile nasıl takip edeceğinizi, hangi metriklere bakmanız gerektiğini ve gerçek senaryolarda nasıl yorumlama yapacağınızı ele alacağız.
Netdata Disk Monitoring’e Neden İhtiyaç Duyarız?
Klasik araçlarla, örneğin iostat ya da df ile disk durumuna bakabilirsiniz. Ama bu araçlar size anlık bir fotoğraf sunar. Netdata ise bir video gibi sürekli akan veriyi size gösterir. Saniyeden saniyeye ne olduğunu görmek, özellikle aralıklı I/O problemlerini yakalamak için kritiktir.
Bir veritabanı sunucusunda zaman zaman yaşanan yavaşlamayı düşünün. Kullanıcılar şikayet ediyor ama siz kontrol ettiğinizde her şey normal görünüyor. İşte burada Netdata’nın tarihsel veri tutma özelliği devreye giriyor. Sorunun yaşandığı zaman dilimine gidip disk I/O grafiğine bakıyorsunuz ve o anda yaşanan bir write spike’ı görüyorsunuz. Sorun bulundu.
Netdata şu disk metriklerini varsayılan olarak toplar:
- Disk okuma/yazma hızı: MB/s cinsinden anlık throughput
- I/O işlem sayısı: Saniyede kaç işlem yapıldığı (IOPS)
- I/O bekleme süresi: Ortalama ve maksimum latency değerleri
- Disk kullanım oranı: Diskin ne kadar süre meşgul olduğu (utilization %)
- Dosya sistemi doluluk oranı: Kalan alan yüzdesi
- Inode kullanımı: Dosya sayısı limitleri
- Disk sıcaklığı ve SMART verileri: Fiziksel disk sağlığı
Netdata Kurulumu ve Temel Yapılandırma
Eğer Netdata henüz kurulu değilse, tek satır ile kurabilirsiniz:
wget -O /tmp/netdata-kickstart.sh https://my-netdata.io/kickstart.sh
sh /tmp/netdata-kickstart.sh
Kurulum tamamlandıktan sonra servis durumunu kontrol edin:
systemctl status netdata
Netdata varsayılan olarak 19999 portunda çalışır. Tarayıcınızdan http://sunucu-ip:19999 adresine giderek arayüze erişebilirsiniz.
Disk metriklerini toplamaktan sorumlu plugin’lerin aktif olup olmadığını kontrol etmek için:
grep -r "disk" /etc/netdata/netdata.conf
ls /usr/lib/netdata/plugins.d/ | grep -i disk
/proc/diskstats dosyasından veri toplayan modül varsayılan olarak aktiftir. Herhangi bir ek ayar yapmanıza gerek yoktur.
netdata.conf Üzerinden Disk Takip Aralığını Ayarlama
Varsayılan olarak Netdata her saniye veri toplar. Disk I/O için bu çözünürlük genellikle yeterlidir. Ancak çok sayıda diskli bir sunucuda bu yükü hafifletmek isteyebilirsiniz:
nano /etc/netdata/netdata.conf
İlgili bölümü bulup düzenleyin:
[plugin:proc:/proc/diskstats]
# update every = 1
# enable new disks detected at runtime = yes
# performance metrics for physical disks = auto
# performance metrics for virtual disks = auto
# performance metrics for partitions = no
Buradaki update every değerini artırırsanız, örneğin 2 yaparsanız, her 2 saniyede bir veri toplanır. Bu kaynak kullanımını düşürür ama çözünürlüğü de azaltır. Prodüksiyon ortamları için 1 saniye önerilir.
Değişiklikten sonra Netdata’yı yeniden başlatın:
systemctl restart netdata
Arayüzde Disk Metriklerini Bulmak
Netdata web arayüzüne girdiğinizde sol menüde “Disk” kategorisini göreceksiniz. Her fiziksel disk ve partition için ayrı grafikler oluşturulur.
Ana disk metrikleri şu başlıklar altında gruplanır:
- disk.io: Okuma ve yazma throughput değerleri (KB/s)
- disk.ops: Saniyede gerçekleştirilen okuma/yazma operasyonları
- disk.util: Diskin meşgul olduğu sürenin yüzdesi
- disk.mops: Birleştirilmiş (merged) operasyon sayısı
- disk.svctm: Ortalama servis süresi (ms)
- disk.await: I/O işlemlerinin ortalama bekleme süresi (ms)
- disk.backlog: Bekleyen I/O işlemi sayısı
- disk_space: Dosya sistemi doluluk durumu
- disk_inodes: Inode kullanım durumu
Kritik Metrikler ve Yorumlama
disk.util: Disk Kullanım Yüzdesi
Bu metrik, diskin ne kadar süre aktif olduğunu gösterir. %100 değeri diskin sürekli meşgul olduğu anlamına gelir ve bu ciddi bir uyarı işaretidir.
Genel eşik değerleri:
- %0-60: Normal, disk rahat çalışıyor
- %60-80: Dikkat, yük artmaya başlıyor
- %80-95: Yüksek yük, izleme sıklığını artırın
- %95-100: Kritik, disk darboğazı yaşanıyor
Özellikle HDD’lerde %80 üzeri değerler latency artışına yol açar. SSD’lerde bu eşik biraz daha yüksektir ama %95’i aşan değerlerde yine de sorun yaşarsınız.
disk.await: I/O Bekleme Süresi
Bu değer, bir I/O isteğinin kuyrukta beklemesi dahil toplam süreyi milisaniye cinsinden gösterir. Normal değerler:
- HDD için: 5-10ms normal, 20ms üzeri sorunlu
- SSD için: 0.1-1ms normal, 5ms üzeri sorunlu
- NVMe için: 0.05ms altı beklenir, 1ms üzeri sorunlu
Eğer disk.await değeri aniden sıçradıysa, o anda disk üzerinde yoğun bir işlem gerçekleşiyor demektir.
disk.svctm: Servis Süresi
Kuyruk bekleme süresi hariç, sadece I/O işleminin diskte geçirdiği süredir. disk.await ile disk.svctm arasındaki fark büyüdüğünde, disk kuyruğunun dolduğunu anlayabilirsiniz. Bu durum ciddi bir I/O darboğazına işaret eder.
Alert Yapılandırması
Netdata’nın en güçlü özelliklerinden biri esnek alarm sistemidir. Disk metrikleri için alarm tanımlayalım.
Önce mevcut disk alarmlarına bakalım:
ls /etc/netdata/health.d/
cat /usr/lib/netdata/conf.d/health.d/disks.conf
Özel alarm oluşturmak için:
nano /etc/netdata/health.d/custom-disk-alerts.conf
Dosyaya şunları ekleyin:
# Disk doluluk uyarısı
alarm: disk_space_warning
on: disk_space._
lookup: average -10m unaligned of used
units: %
every: 1m
warn: $this > 80
crit: $this > 90
info: Disk alanı kritik seviyede doldu
to: sysadmin
# Disk I/O utilization uyarısı
alarm: disk_util_warning
on: disk.util
lookup: average -10m unaligned of utilization
units: %
every: 1m
warn: $this > 80
crit: $this > 95
info: Disk kullanımı kritik seviyeye ulaştı
to: sysadmin
# Yüksek I/O latency uyarısı
alarm: disk_await_warning
on: disk.await
lookup: average -5m unaligned of reads,writes
units: ms
every: 1m
warn: $this > 50
crit: $this > 200
info: Disk I/O latency çok yüksek
to: sysadmin
Alarm konfigürasyonunu test etmek için:
netdatacli reload-health
Gerçek Dünya Senaryosu: Veritabanı Sunucusunda I/O Sorunu
Bir e-ticaret platformu düşünün. Hafta sonu yoğun saatlerde sistem yavaşlıyor. Müşteriler ödeme sayfasında takılı kalıyor. Standart kontroller yapıyorsunuz: CPU normal, RAM yeterli, ağ bant genişliği sorun değil. Netdata’ya bakıyorsunuz.
Disk metriklerine gittiğinizde şunu görüyorsunuz: disk.await değeri normal zamanlarda 3-5ms iken yoğun saatlerde 150ms’e kadar çıkıyor. disk.util ise %95 ile %100 arasında geziniyor. Bu klasik bir I/O darboğazı.
Sorunu daha derinlemesine analiz etmek için terminalde şunu çalıştırın:
iostat -xz 2 10
Bu komut, 2 saniye aralıklarla 10 kez disk istatistiklerini gösterir. Çıktıda await, util ve %iowait sütunlarına odaklanın.
Peki neden böyle bir spike yaşanıyor? MySQL binary log yazmaları, checkpoint operasyonları ya da büyük bir export işlemi olabilir. Bunu anlamak için:
iotop -ao
Bu komut, disk I/O kullanan prosesleri listeler. -a kümülatif değerleri, -o sadece aktif prosesleri gösterir. Burada MySQL’in binary log yazmalarının yoğun olduğunu görüyorsunuz.
Çözüm: innodb_io_capacity değerini düşürüp, binary log’ları ayrı bir SSD’ye taşıyarak problemi çözebilirsiniz.
Netdata ile SMART Disk Sağlığı İzleme
Netdata, smartd entegrasyonu sayesinde disk sağlığını da izleyebilir. Bu özelliği etkinleştirmek için:
apt install smartmontools # Debian/Ubuntu
yum install smartmontools # RHEL/CentOS
Netdata’nın SMART plugin konfigürasyonunu düzenleyin:
nano /etc/netdata/go.d/smartctl.conf
İçeriği şu şekilde ayarlayın:
jobs:
- name: smartctl
devices:
- /dev/sda
- /dev/sdb
- /dev/nvme0n1
every: 60
Değişiklikten sonra Netdata’yı yeniden başlatın:
systemctl restart netdata
Artık arayüzde “smartctl” başlığı altında her diskin yeniden tahsis edilen sektör sayısı, bekleyen sektörler, güç açılma sayısı, çalışma saatleri gibi kritik SMART değerlerini görebilirsiniz.
Özellikle Reallocated Sectors Count (yeniden tahsis edilen sektörler) sıfırın üzerine çıkmaya başladıysa, o disk kısa süre içinde bozulacak demektir. Bunu önceden görmek, veri kaybını önlemenizi sağlar.
Inode Tükenmesi Senaryosu
Disk doluluk izlemesinde çoğu sysadmin sadece kullanılan alan yüzdesine bakar. Ama inode tükenmesi de aynı derecede kritik bir sorundur ve genellikle gözden kaçar.
Bir mail sunucusunda düşünün: Binlerce küçük geçici dosya birikiyor. Disk alanı olarak hala %60 boşluk var ama yeni dosya oluşturulamıyor. Neden? Çünkü inode’lar tükenmiş.
Netdata bu durumu disk_inodes metriği ile gösterir. İnode kullanımı için de alarm ekleyelim:
nano /etc/netdata/health.d/custom-disk-alerts.conf
Mevcut dosyaya şunu ekleyin:
# Inode kullanım uyarısı
alarm: disk_inode_warning
on: disk_inodes._
lookup: average -10m unaligned of used
units: %
every: 1m
warn: $this > 70
crit: $this > 90
info: Inode kullanımı kritik seviyeye ulaştı
to: sysadmin
Mevcut inode durumunu terminalde kontrol etmek için:
df -i
find /tmp -type f | wc -l
find /var/spool/postfix -type f | wc -l
NFS ve Network Dosya Sistemi İzleme
Eğer NFS mount’larınız varsa, bunları da Netdata ile izleyebilirsiniz. NFS performans metrikleri nfsd ve nfs başlıkları altında görünür.
NFS istatistiklerini aktif etmek için:
nano /etc/netdata/netdata.conf
Şu satırı kontrol edin ve aktif olduğundan emin olun:
[plugin:proc:/proc/net/rpc/nfs]
# update every = 1
nfs3 = yes
nfs4 = yes
NFS mount performansını terminal üzerinden de inceleyebilirsiniz:
nfsstat -c
mountstats
mountstats komutu özellikle faydalıdır. Her NFS mount için ortalama okuma/yazma süresi, RPC çağrı sayısı ve yeniden deneme sayısını gösterir. Yüksek retry sayısı ağ veya NFS sunucu sorununa işaret eder.
Disk I/O Performansını Artırmak İçin Pratik Öneriler
Netdata ile sorunu tespit ettikten sonra ne yapacaksınız? İşte en sık başvurulan yöntemler:
I/O Scheduler Optimizasyonu
Linux’ta disk I/O scheduler, disk isteklerinin nasıl sıralanacağını belirler. Farklı iş yükleri için farklı scheduler’lar önerilir.
Mevcut scheduler’ı kontrol edin:
cat /sys/block/sda/queue/scheduler
SSD için mq-deadline veya none, HDD için bfq önerilir. Scheduler’ı değiştirmek için:
echo mq-deadline > /sys/block/sda/queue/scheduler
Kalıcı hale getirmek için /etc/udev/rules.d/ altına kural ekleyin:
nano /etc/udev/rules.d/60-ioscheduler.rules
İçeriğe şunu ekleyin:
# SSD için
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="mq-deadline"
# HDD için
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="bfq"
Değişikliği yaptıktan sonra Netdata üzerinden disk.await değerinin düşüp düşmediğini kontrol edin. Bu optimizasyonun etkisini gerçek zamanlı olarak görebilirsiniz.
Read-Ahead Değeri Ayarlama
Büyük dosyaları sıralı okuyan uygulamalar için read-ahead değerini artırmak performansı artırabilir:
blockdev --getra /dev/sda
blockdev --setra 4096 /dev/sda
Bunun etkisini yine Netdata üzerinden disk.io grafiğini izleyerek ölçebilirsiniz.
Netdata API ile Disk Metriklerini Otomatik Raporlama
Netdata bir REST API sunar. Bu API ile özel scriptler yazarak disk metriklerini alabilir ve raporlayabilirsiniz.
Belirli bir diskin güncel utilization değerini çekmek için:
curl -s "http://localhost:19999/api/v1/data?chart=disk.util&after=-300&points=5&format=json" | python3 -m json.tool
Bu komut son 5 dakikanın 5 veri noktasını JSON olarak döndürür. Bunu bir cronjob’a bağlayarak günlük özet rapor oluşturabilirsiniz:
#!/bin/bash
DISK="sda"
THRESHOLD=80
UTIL=$(curl -s "http://localhost:19999/api/v1/data?chart=disk.util&after=-3600&points=1&format=json" | python3 -c "import sys,json; d=json.load(sys.stdin); print(round(d['data'][0][1],2))")
echo "Son 1 saatte $DISK ortalama kullanımı: $UTIL%"
if (( $(echo "$UTIL > $THRESHOLD" | bc -l) )); then
echo "UYARI: Disk kullanımı eşik değerini aştı!"
fi
Bu script’i /usr/local/bin/disk-report.sh olarak kaydedip çalıştırılabilir yapın:
chmod +x /usr/local/bin/disk-report.sh
Crontab’a ekleyin:
0 8 * * * /usr/local/bin/disk-report.sh | mail -s "Günlük Disk Raporu" [email protected]
Grafana ile Netdata Dashboard Entegrasyonu
Netdata’nın kendi arayüzü çok yeterlidir, ama kurumsal ortamlarda tüm metrikleri tek bir Grafana dashboard’unda görmek isteyebilirsiniz. Netdata, Prometheus uyumlu metrik endpoint’i sunar:
curl http://localhost:19999/api/v1/allmetrics?format=prometheus | grep disk
Prometheus konfigürasyonuna şunu ekleyin:
scrape_configs:
- job_name: 'netdata'
metrics_path: '/api/v1/allmetrics'
params:
format: ['prometheus']
static_configs:
- targets: ['sunucu-ip:19999']
Ardından Grafana’da Prometheus datasource’u seçip disk metriklerini sorgulayabilirsiniz. netdata_disk_util_percentage_average gibi metrik adlarını kullanarak güzel görselleştirmeler oluşturabilirsiniz.
Sonuç
Disk ve I/O performansı, sunucu yönetiminin en kritik ama en çok ihmal edilen alanlarından biridir. Netdata bu konuda gerçekten güçlü bir araç: saniyelik çözünürlük, kolay kurulum, esnek alarm sistemi ve geniş entegrasyon seçenekleri. Sadece disk doluluk takibi değil, IOPS, latency, utilization, SMART verileri ve inode kullanımını da tek bir platformdan izlemek ciddi bir avantaj.
Bu yazıda anlattıklarımı şu şekilde özetleyebiliriz: Önce Netdata’yı doğru yapılandırın ve disk plugin’lerinin aktif olduğundan emin olun. Ardından disk.await, disk.util ve disk.ops metriklerine düzenli olarak göz atın. Kritik eşik değerleri için mutlaka alarm tanımlayın. SMART izlemeyi aktif edin ki disk arızalarını önceden görebilin. Inode kullanımını da doluluk takibinin yanına ekleyin. Ve son olarak, bir sorun yaşandığında Netdata’nın geçmişe dönük veri görüntüleme özelliğini kullanarak olayı retrospektif analiz edin.
Disk sorunları genellikle sessiz sedasız büyür. Küçük bir I/O yavaşlığı, zamanla tüm sistemi çökertebilir. Netdata ile bu süreci proaktif olarak yönetmek, reaktif kriz çözümünden çok daha az stresli ve çok daha profesyoneldir.
