Dovecot Performans Optimizasyonu: Hız ve Verimlilik İçin Kapsamlı Rehber

Mail sunucunuzda kullanıcılar “e-postalarım yüklenmiyor” veya “bağlantı çok yavaş” diye şikayet etmeye başladıysa, büyük ihtimalle Dovecot yapılandırmanız varsayılan ayarlarla çalışıyor demektir. Varsayılan ayarlar test ortamları için makul olsa da yüzlerce veya binlerce kullanıcıya hizmet veren bir üretim ortamında ciddi darboğazlara neden olabilir. Bu yazıda Dovecot’u gerçek dünya senaryolarına göre nasıl optimize edeceğinizi, hangi parametrelerin ne işe yaradığını ve performans sorunlarını nasıl tespit edip çözeceğinizi anlatacağım.

Neden Dovecot Yavaş Çalışır?

Performans sorunlarını çözmeden önce neyin yavaş olduğunu anlamak gerekir. Dovecot’ta yavaşlık genellikle şu kaynaklardan gelir:

  • Disk I/O darboğazları: Maildir formatında binlerce küçük dosya okuma/yazma işlemi
  • Yetersiz process limitleri: Eş zamanlı bağlantı sayısının varsayılan sınırları aşması
  • Önbellekleme eksikliği: Her IMAP isteğinde metadata’nın tekrar hesaplanması
  • Yanlış yapılandırılmış index dosyaları: Yoksa ya da yanlış yerdeyse her oturum yeniden tarama yapar
  • SSL/TLS handshake maliyeti: Her bağlantıda sıfırdan şifreleme müzakeresi
  • Çok fazla açık dosya descriptor: Sistem limitlerinin aşılması

Bunları tek tek ele alacağız.

Mevcut Durumu Analiz Etmek

Optimizasyon yapmadan önce nerede durduğunuzu bilmeniz gerekir. Dovecot’un dahili istatistik aracını kullanın:

# Dovecot istatistiklerini göster
doveadm stats dump

# Aktif bağlantıları listele
doveadm who

# Belirli bir kullanıcının oturumlarına bak
doveadm who -1 [email protected]

# Process kullanımını izle
doveadm process status

Sistem tarafında ise şu komutlar işinize yarayacak:

# Dovecot process'lerinin kaynak kullanımını izle
ps aux | grep dovecot | awk '{sum += $3} END {print "CPU: " sum "%"}'

# Açık dosya sayısını kontrol et
lsof -p $(pidof dovecot | tr ' ' ',') | wc -l

# Disk I/O'yu izle (iostat)
iostat -x 1 10 | grep -v "^$"

# Anlık bağlantı sayısını say
ss -tnp | grep dovecot | wc -l

Bu verilere bakarak hangi bileşenin darboğaz yarattığını anlayabilirsiniz. Mesela CPU yüksekse SSL veya index sorununa, disk I/O yüksekse maildir yapısına veya önbellek sorununa bakmalısınız.

Process ve Bağlantı Limitlerini Ayarlamak

Dovecot’un /etc/dovecot/conf.d/10-master.conf dosyası, process yönetiminin kalbi. Varsayılan değerler çoğu zaman gereksiz yere düşük tutulmuş.

# /etc/dovecot/conf.d/10-master.conf

service imap-login {
  inet_listener imap {
    port = 143
  }
  inet_listener imaps {
    port = 993
    ssl = yes
  }
  
  # Aynı anda kaç login process çalışabilir
  process_limit = 512
  
  # Her process kaç bağlantı kabul eder
  # 0 = sınırsız (dikkatli kullanın)
  service_count = 1
  
  # Önceden hazır bekleyen process sayısı
  process_min_avail = 10
  
  # vsz_limit: Virtual memory limiti (MB cinsinden)
  vsz_limit = 256M
}

service imap {
  # Maksimum eş zamanlı IMAP oturumu
  process_limit = 2048
  
  # Her process kaç istek sonra yeniden başlar
  # Bellek sızıntılarına karşı koruma
  service_count = 256
}

service pop3-login {
  process_limit = 256
}

service pop3 {
  process_limit = 512
}

service lmtp {
  inet_listener lmtp {
    port = 24
  }
  process_limit = 64
}

service auth {
  # Auth worker process sayısı
  process_limit = 64
}

process_limit: Toplam kaç process çalışabileceğini belirler. 1000 kullanıcılı bir ortamda en az 1024-2048 yapın.

process_min_avail: Her zaman hazırda bekleyen process sayısı. Ani yük artışlarında bağlantı gecikmeleri yaşamamak için 10-20 arası iyi bir değer.

service_count: Bir process kaç istek karşıladıktan sonra öldürülüp yeniden başlatılacak. 1 yaparsanız her bağlantı için yeni process açılır (güvenli ama yavaş), büyük değer performans için daha iyi.

Sistem Limitlerini Ayarlamak

Dovecot ne kadar iyi yapılandırılmış olursa olsun, eğer işletim sistemi limitleri düşükse sorun yaşarsınız. Bu ayarları /etc/security/limits.conf veya systemd unit dosyasına ekleyin:

# /etc/security/limits.conf
dovecot soft nofile 65536
dovecot hard nofile 65536
root soft nofile 65536
root hard nofile 65536

# Systemd ile çalışıyorsa:
# /etc/systemd/system/dovecot.service.d/limits.conf
[Service]
LimitNOFILE=65536
LimitNPROC=512

Sistemin genel limitlerini de kontrol edin:

# Mevcut limitleri göster
ulimit -n
cat /proc/sys/fs/file-max

# Kernel parametrelerini optimize et
cat >> /etc/sysctl.conf << 'EOF'
# TCP bağlantı kuyruğunu artır
net.core.somaxconn = 4096
net.ipv4.tcp_max_syn_backlog = 4096

# TCP bağlantı yeniden kullanımını etkinleştir
net.ipv4.tcp_tw_reuse = 1

# FIN_WAIT2 timeout süresini düşür
net.ipv4.tcp_fin_timeout = 15

# Dosya sistemi önbelleğini ayarla
vm.swappiness = 10
EOF

sysctl -p

Maildir Yerine mdbox Formatına Geçmek

Bu, performans açısından yapabileceğiniz en büyük değişikliklerden biri. Maildir formatında her e-posta ayrı bir dosyada saklanır. 50.000 maili olan bir kullanıcı için bu 50.000 küçük dosya demektir ve bu dosya sistemleri için kötü bir senaryo.

mdbox (multi-dbox) formatı ise birden fazla maili tek bir dosyada gruplandırır. Özellikle HDD kullanan sistemlerde I/O performansı dramatik biçimde artar.

# /etc/dovecot/conf.d/10-mail.conf

# mdbox formatına geçiş
mail_location = mdbox:~/mdbox

# mdbox için optimize ayarlar
mdbox_rotate_size = 10M      # Dosya 10MB olunca yeni dosya aç
mdbox_rotate_interval = 1d   # Günde bir yeni dosyaya geç
mdbox_preallocate_space = yes # Disk alanını önceden ayır

# Alternatif: Maildir kullanmaya devam edecekseniz
# mail_location = maildir:~/Maildir

Mevcut kullanıcıları Maildir’den mdbox’a taşımak için:

# Tek kullanıcı için dönüşüm
doveadm backup -u [email protected] mdbox:~/mdbox_yeni

# Tüm kullanıcılar için toplu dönüşüm scripti
#!/bin/bash
for user in $(doveadm user '*'); do
    echo "Donusturuluyor: $user"
    doveadm backup -u "$user" mdbox:/home/vmail/$(echo $user | cut -d@ -f2)/$(echo $user | cut -d@ -f1)/mdbox
    if [ $? -eq 0 ]; then
        echo "$user: Basarili"
    else
        echo "$user: HATA"
    fi
done

Dikkat: Büyük posta kutularında bu işlem saatler sürebilir. Bakım penceresi planlayın.

Index ve Önbellekleme Ayarları

Dovecot’un en güçlü performans özelliklerinden biri index dosyaları ve önbellek sistemi. Doğru yapılandırılmazsa her IMAP oturumunda gereksiz yük oluşur.

# /etc/dovecot/conf.d/10-mail.conf

# Index dosyalarını mail dizininden ayır (daha hızlı SSD'ye koyabilirsiniz)
mail_location = maildir:~/Maildir:INDEX=/var/lib/dovecot/index/%d/%n

# Önbellek ayarları için 10-mail.conf veya ayrı bir dosya
mail_cache_fields = flags date.save date.received imap.envelope imap.bodystructure mime.parts

# Önbellek yaşam süresi (default: 1hafta)
mail_cache_max_header_count = 100

Önbellek politikasını daha detaylı ayarlamak için namespace bazında yapılandırabilirsiniz:

# /etc/dovecot/conf.d/15-mailboxes.conf

namespace inbox {
  mailbox INBOX {
    # Sık erişilen alanları her zaman önbellekte tut
    special_use = Inbox
  }
  
  mailbox Sent {
    special_use = Sent
    auto = subscribe
  }
  
  mailbox Drafts {
    special_use = Drafts
    auto = subscribe
  }
  
  mailbox Trash {
    special_use = Trash
    auto = subscribe
    # Çöp kutusundaki indexleri daha az agresif önbellekle
  }
  
  mailbox Junk {
    special_use = Junk
    auto = subscribe
  }
}

Index dosyalarını SSD üzerine taşımak, özellikle mail depolamanın HDD’de olduğu sistemlerde büyük fark yaratır:

# SSD'de index dizini oluştur
mkdir -p /var/lib/dovecot/index
chown -R vmail:vmail /var/lib/dovecot/index

# mail_location'ı güncelle
# maildir:~/Maildir:INDEX=/var/lib/dovecot/index/%d/%n

# Mevcut indexleri yeniden oluştur
doveadm index -A -q INBOX

SSL/TLS Optimizasyonu

Her SSL handshake CPU ve zaman maliyeti yaratır. Session caching ile bu maliyeti büyük ölçüde azaltabilirsiniz:

# /etc/dovecot/conf.d/10-ssl.conf

ssl = required
ssl_cert = </etc/letsencrypt/live/domain.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/domain.com/privkey.pem

# Modern ve hızlı cipher'lar
ssl_cipher_list = ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384

# TLS 1.2 ve üstü zorunlu
ssl_min_protocol = TLSv1.2

# SSL session cache - aynı client tekrar bağlandığında handshake atlanır
ssl_options = no_compression

# DH parametreler (önceden oluşturulmuş olmalı)
ssl_dh = </etc/dovecot/dh.pem

# Sunucu cipher tercihini zorla
ssl_prefer_server_ciphers = yes

DH parametrelerini oluşturun (bir kez yapılır):

# 4096 bit DH parametresi oluştur (yavaş sürer, sabırlı olun)
openssl dhparam -out /etc/dovecot/dh.pem 4096

# Daha hızlı üretim için 2048 de kabul edilebilir
openssl dhparam -out /etc/dovecot/dh.pem 2048

Authentikasyon Performansı

Yüzlerce kullanıcının eş zamanlı giriş yaptığı anlarda auth servisi darboğaz olabilir. Özellikle SQL tabanlı auth kullanıyorsanız bağlantı havuzu kritik:

# /etc/dovecot/conf.d/auth-sql.conf.ext

passdb {
  driver = sql
  args = /etc/dovecot/dovecot-sql.conf.ext
}

userdb {
  driver = sql
  args = /etc/dovecot/dovecot-sql.conf.ext
}

# /etc/dovecot/dovecot-sql.conf.ext
driver = mysql
connect = host=127.0.0.1 dbname=maildb user=dovecot password=sifre

# Sorgu sonuçlarını önbellekle
# Aynı kullanıcı kısa sürede tekrar giriş yaparsa veritabanına gitme
iterate_query = SELECT username as user FROM mailbox

Auth cache’i etkinleştirin:

# /etc/dovecot/conf.d/10-auth.conf

# Auth sonuçlarını önbellekte tut
auth_cache_size = 10M
auth_cache_ttl = 1 hour
auth_cache_negative_ttl = 1 min

# Aynı kullanıcı/şifre kombinasyonu başarısız olursa 1 dakika beklet
auth_penalty = 2

# Kaç paralel auth worker çalışsın
# LDAP veya SQL kullanıyorsanız artırın
service auth-worker {
  process_limit = 30
}

Bellek Kullanımını Optimize Etmek

Dovecot bazı durumlarda gereksiz yere fazla bellek kullanabilir. Bu ayarlarla bellek kullanımını kontrol altına alabilirsiniz:

# /etc/dovecot/conf.d/10-master.conf içine veya dovecot.conf'a ekleyin

# IMAP process başına bellek limiti
service imap {
  vsz_limit = 512M
  process_limit = 1024
}

# Login process bellek limiti
service imap-login {
  vsz_limit = 128M
}

# /etc/dovecot/conf.d/10-mail.conf
# Bir seferde bellekte tutulacak maksimum mesaj sayısı
mail_prefetch_count = 0

# Büyük mesajlar için mmap yerine read() kullan
# SSD sistemlerde mmap daha iyi, HDD'de read() daha iyi
mail_use_mmap = no  # HDD için
# mail_use_mmap = yes  # SSD için

# Geçici dosyalar için dizin (hızlı disk kullanın)
mail_temp_dir = /tmp

Logging ve İzleme ile Performansı Takip Etmek

Optimizasyon sonrasında sistemi izlemek için doğru log ayarları şart:

# /etc/dovecot/conf.d/10-logging.conf

# Log formatını zenginleştir
log_path = /var/log/dovecot.log
info_log_path = /var/log/dovecot-info.log
debug_log_path = /var/log/dovecot-debug.log

# Yavaş sorgular için threshold (mikrosaniye)
# 5 saniyeden uzun süren işlemleri logla
mail_log_prefix = "%s(%u): "

# Login işlemlerini logla
auth_verbose = yes
auth_verbose_passwords = no  # Şifreleri loglama!

# IMAP komut sürelerini logla
imap_logout_format = in=%i out=%o deleted=%{deleted} expunged=%{expunged} trashed=%{trashed} hdr_count=%{fetch_hdr_count} hdr_bytes=%{fetch_hdr_bytes} body_count=%{fetch_body_count} body_bytes=%{fetch_body_bytes}

Logları analiz etmek için:

# En çok bağlanan kullanıcıları bul
grep "Login:" /var/log/dovecot.log | awk '{print $7}' | sort | uniq -c | sort -rn | head 20

# Başarısız girişleri say
grep "authentication failed" /var/log/dovecot.log | wc -l

# Ortalama oturum süresini hesapla
grep "Disconnected" /var/log/dovecot-info.log | tail -100

# Dovecot istatistiklerini düzenli raporla
doveadm stats reset  # Sayaçları sıfırla
watch -n 5 'doveadm stats dump'

Gerçek Dünya Senaryosu: 500 Kullanıcılı Şirket Ortamı

Bir müşterimde yaklaşık 500 kullanıcılı bir mail sunucusu optimize etmek durumunda kaldım. Sabahları iş başlangıcında (08:30-09:30 arası) sunucu çok yavaşlıyordu. Teşhis adımları:

# O saatlerde log'a bakın
grep "08:[3-9][0-9]:" /var/log/dovecot.log | grep -c "imap-login"

# Process limitlerine takılıyor muyuz?
grep "service_limit" /var/log/dovecot.log

# Auth gecikmeleri var mı?
grep "auth.*timeout" /var/log/dovecot.log

Sorunun kaynağı üç şeydi: process limiti 100’de kalıyordu, SQL auth connection pool yoktu ve index dosyaları mail diziniyle aynı HDD üzerindeydi. Yaptığım değişiklikler:

# Hızlı düzeltme scripti - production'a uygulamadan önce test edin
#!/bin/bash

echo "Dovecot performans optimizasyonu basliyor..."

# Backup al
cp /etc/dovecot/conf.d/10-master.conf /etc/dovecot/conf.d/10-master.conf.bak
cp /etc/dovecot/conf.d/10-auth.conf /etc/dovecot/conf.d/10-auth.conf.bak

# Process limitlerini artır
sed -i 's/process_limit = 100/process_limit = 1024/' /etc/dovecot/conf.d/10-master.conf

# Auth cache'i etkinleştir
echo "auth_cache_size = 10M" >> /etc/dovecot/conf.d/10-auth.conf
echo "auth_cache_ttl = 1 hour" >> /etc/dovecot/conf.d/10-auth.conf

# Index'leri SSD'ye taşı
mkdir -p /fast-ssd/dovecot-index
chown vmail:vmail /fast-ssd/dovecot-index

# Değişikliği uygula
doveadm reload

echo "Tamamlandi. Loglari izleyin: tail -f /var/log/dovecot.log"

Bu değişikliklerden sonra sabah yoğun saatindeki bağlantı kurma süresi ortalama 3.2 saniyeden 0.4 saniyeye düştü. Kullanıcı şikayetleri büyük ölçüde azaldı.

Düzenli Bakım Görevleri

Performansı uzun vadede sürdürmek için bazı bakım işlemlerini düzenli yapmak gerekir:

# Bozuk index'leri düzelt ve yeniden oluştur
doveadm force-resync -A '*'

# Silinmiş mesajların alanını geri kazan (mdbox için)
doveadm purge -A

# Tüm kullanıcılar için posta kutusu istatistiklerini güncelle
doveadm quota recalc -A

# Cron ile haftalık bakım
cat > /etc/cron.weekly/dovecot-maintenance << 'EOF'
#!/bin/bash
/usr/bin/doveadm purge -A
/usr/bin/doveadm force-resync -A INBOX
logger "Dovecot haftalik bakım tamamlandı"
EOF
chmod +x /etc/cron.weekly/dovecot-maintenance

Sonuç

Dovecot optimizasyonu tek seferlik bir iş değil, sürekli izleme ve ince ayar gerektiren bir süreç. Yapılacak işlerin öncelik sırası şöyle olmalı:

  • Önce ölç: Neyin yavaş olduğunu bilmeden değişiklik yapmayın
  • Process limitlerini artırın: En hızlı ve en güvenli iyileştirme bu
  • Auth cache’i etkinleştirin: Özellikle SQL/LDAP auth kullananlar için büyük kazanım
  • Index’leri ayrı diske taşıyın: SSD kullanıyorsanız dramatik fark yaratır
  • SSL session cache: Bağlantı kurulum süresini kısaltır
  • mdbox’a geçin: Uzun vadeli ve kalıcı I/O iyileştirmesi

Her değişikliği tek tek ve test ortamında denemeyi, sonrasında üretim ortamına taşımayı alışkanlık haline getirin. Dovecot’un doveadm araçları çok güçlü, bunları hem teşhis hem de bakım için düzenli kullanın. Log dosyalarını göz ardı etmeyin çünkü çoğu zaman sorun doğrudan orada yazıyor olur.

Yorum yapın