Ana içeriğe geç
Kategoriye Dön

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.

Okuma süresi: 14 dk Sorun Giderme
diskI/Oiotopiostatperformanslinuxdepolama

İç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ş
  • top veya htop'ta yüksek wa (I/O wait) değeri
  • Uygulama loglarında zaman aşımı hataları
  • df veya du komutları çok uzun sürer

Adım 1: I/O Wait Kontrolü

İlk adım olarak sistemin I/O wait değerini kontrol edin:

hljs bash
# 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?

hljs bash
# 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

hljs bash
# 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ü

hljs bash
# 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ü

hljs bash
# 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

hljs bash
# 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

hljs bash
# 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:

hljs bash
# 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:

hljs bash
# /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.