Yavaş Disk I/O Tespiti ve Çözümü
Linux sunucuda yavaş disk I/O sorunlarını tespit etme, iotop/iostat ile analiz yapma ve performansı artırma rehberi.
İçindekiler
Giriş
Yavaş disk I/O, sunucu performansını ciddi şekilde etkileyen yaygın bir sorundur. Veritabanı sorguları yavaşlar, web uygulamaları yanıt vermez ve sistem genel olarak hissedilir biçimde yavaşlar. Bu rehberde yavaş disk I/O'yu tespit etme ve çözme yöntemlerini ele alacağız.
Belirtiler
Yavaş disk I/O'nun tipik belirtileri:
- Komutlar uzun süre bekler (özellikle
ls,find, dosya okuma/yazma) - Veritabanı sorguları normalden çok daha yavaş
topveyahtop'ta yüksekwa(I/O wait) değeri- Uygulama loglarında zaman aşımı hataları
dfveyadukomutları çok uzun sürer
Adım 1: I/O Wait Kontrolü
İlk adım olarak sistemin I/O wait değerini kontrol edin:
# top ile I/O wait kontrolü
top
# 'wa' sütununa bakın — %5'in üzerindeyse sorun var
# vmstat ile anlık I/O durumu
vmstat 1 10
# 'wa' sütunu I/O wait yüzdesini gösterir
# iostat ile disk istatistikleri
iostat -x 1 5
# %util değeri %80'in üzerindeyse disk doymuş demektir
I/O wait değeri sürekli %10'un üzerindeyse disk I/O darboğazı yaşıyorsunuz demektir.
Adım 2: Hangi Süreç Disk Kullanıyor?
# iotop ile gerçek zamanlı disk I/O izleme
sudo apt install iotop -y
sudo iotop -o # Sadece aktif I/O yapan süreçleri göster
# iotop anlık snapshot
sudo iotop -b -n 5 -o
# pidstat ile süreç bazlı I/O
sudo apt install sysstat -y
pidstat -d 1 5
# lsof ile hangi dosyalar açık
sudo lsof | grep -E '(REG|DIR)' | sort -k7 -rn | head -20
Adım 3: Disk Performans Testi
# Basit yazma testi
dd if=/dev/zero of=/tmp/test_write bs=1M count=1024 oflag=direct
# Sonuç: X MB/s — SSD için 200+ MB/s, HDD için 80+ MB/s normal
# Basit okuma testi
dd if=/tmp/test_write of=/dev/null bs=1M
# fio ile kapsamlı test
sudo apt install fio -y
# Rastgele okuma testi
fio --name=randread --ioengine=libaio --iodepth=16 --rw=randread \
--bs=4k --direct=1 --size=1G --numjobs=4 --runtime=60 \
--group_reporting --filename=/tmp/fio_test
# Rastgele yazma testi
fio --name=randwrite --ioengine=libaio --iodepth=16 --rw=randwrite \
--bs=4k --direct=1 --size=1G --numjobs=4 --runtime=60 \
--group_reporting --filename=/tmp/fio_test
# Test dosyasını temizle
rm /tmp/fio_test /tmp/test_write
Adım 4: Disk Sağlığı Kontrolü
# Disk listesi
lsblk
fdisk -l
# SMART durumu kontrol
sudo apt install smartmontools -y
sudo smartctl -a /dev/sda
# SMART kısa test
sudo smartctl -t short /dev/sda
sudo smartctl -l selftest /dev/sda
# Disk hataları
dmesg | grep -i -E '(error|fail|bad|ata|scsi|disk)'
journalctl -k | grep -i -E '(error|fail|bad|ata|scsi)'
# Dosya sistemi hataları
sudo dmesg | grep -i 'ext4\|xfs\|btrfs'
SMART testinde Reallocated_Sector_Ct veya Pending_Sector_Count değerleri 0'dan büyükse disk arızalanmak üzere demektir. Hemen yedek alın.
Adım 5: Dosya Sistemi Optimizasyonu
Disk Doluluk Kontrolü
# Disk kullanımı
df -h
# En çok yer kaplayan dizinler
du -sh /* 2>/dev/null | sort -rh | head -20
du -sh /var/* 2>/dev/null | sort -rh | head -10
# Büyük dosyaları bul
find / -type f -size +100M -not -path '/proc/*' 2>/dev/null | sort -k5 -rn
# Log dosyalarını temizle
sudo journalctl --vacuum-size=500M
sudo find /var/log -name '*.gz' -mtime +30 -delete
Mount Seçenekleri Optimizasyonu
# Mevcut mount seçeneklerini görüntüle
cat /proc/mounts
mount | grep -E '(ext4|xfs|btrfs)'
# /etc/fstab'da noatime ekle (okuma performansını artırır)
# UUID=xxx / ext4 defaults,noatime 0 1
# Geçici olarak remount
sudo mount -o remount,noatime /
I/O Scheduler Optimizasyonu
# Mevcut I/O scheduler
cat /sys/block/sda/queue/scheduler
# SSD için 'none' veya 'mq-deadline' önerilir
echo 'none' | sudo tee /sys/block/sda/queue/scheduler
# HDD için 'bfq' veya 'mq-deadline'
echo 'bfq' | sudo tee /sys/block/sda/queue/scheduler
# Kalıcı hale getirmek için /etc/udev/rules.d/60-scheduler.rules
echo 'ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="none"' | sudo tee /etc/udev/rules.d/60-scheduler.rules
Adım 6: Veritabanı I/O Optimizasyonu
Eğer yavaş I/O veritabanından kaynaklanıyorsa:
# MySQL/MariaDB — yavaş sorgu logu
# /etc/mysql/mysql.conf.d/mysqld.cnf
# slow_query_log = 1
# slow_query_log_file = /var/log/mysql/slow.log
# long_query_time = 2
# PostgreSQL — yavaş sorgu logu
# postgresql.conf
# log_min_duration_statement = 2000 # 2 saniyeden uzun sorgular
# Redis — AOF yerine RDB kullan (daha az I/O)
# appendonly no
# save 900 1
Adım 7: tmpfs ile I/O Azaltma
Geçici dosyalar için RAM kullanmak disk I/O'yu önemli ölçüde azaltır:
# /tmp için tmpfs
echo 'tmpfs /tmp tmpfs defaults,noatime,mode=1777,size=2G 0 0' | sudo tee -a /etc/fstab
sudo mount -a
# Uygulama cache dizinleri için tmpfs
# Örnek: PHP session
echo 'tmpfs /var/lib/php/sessions tmpfs defaults,noatime,size=256M 0 0' | sudo tee -a /etc/fstab
tmpfs boyutunu RAM'inizin %25'ini geçmeyecek şekilde ayarlayın.
Sonuç
Yavaş disk I/O sorunlarını çözmek için önce iotop ve iostat ile hangi sürecin disk kullandığını tespit edin, ardından disk sağlığını SMART ile kontrol edin. Dosya sistemi optimizasyonları (noatime, I/O scheduler) ve tmpfs kullanımı performansı önemli ölçüde artırabilir. Disk fiziksel olarak arızalanıyorsa en kısa sürede yedek alın ve disk değişimi için REXE destek ile iletişime geçin.
İlgili Makaleler
SSH Bağlantı Sorunu: Sunucuya Bağlanamıyorum
SSH bağlantı sorunlarını çözme rehberi: Path.net firewall kuralları, Default Block, SSH portu için filtre kuralı oluşturma ve sorun giderme adımları.
RDP Bağlantı Sorunu: Windows Sunucuya Erişilemiyor
RDP bağlantı sorunlarını çözme rehberi: Path.net firewall kuralları, Default Block, RDP portu için filtre kuralı oluşturma ve sorun giderme adımları.
MTR Testi Nasıl Yapılır ve Destek Ekibine Gönderilir
WinMTR ve Linux MTR ile ağ testi yapma, ICMP filtre kuralı oluşturma ve sonuçları destek ekibine gönderme rehberi. Paket kaybı ve gecikme analizi.