Dovecot Hibernation ile Bellek Optimizasyonu

Yoğun kullanıcı trafiğine sahip bir mail sunucusu yönetiyorsanız, bir noktada şu soruyla yüzleşmek zorunda kalırsınız: “Neden bu kadar çok RAM tüketiyorum?” Dovecot, IMAP bağlantılarını yönetmek konusunda oldukça güçlü bir yazılım olsa da varsayılan yapılandırmasıyla her açık bağlantı için belirli miktarda bellek ayırır ve bu durum onlarca, hatta yüzlerce eşzamanlı kullanıcı olduğunda ciddi bir kaynak problemi haline gelir. İşte bu noktada Dovecot Hibernation devreye girer.

Hibernation Nedir ve Neden Önemlidir?

Dovecot Hibernation, uzun süredir aktif veri alışverişi yapmayan IMAP bağlantılarını düşük maliyetli bir “uyku” moduna alarak bellek tüketimini dramatik biçimde azaltan bir özelliktir. Teknik olarak açıklamak gerekirse: bir IMAP istemcisi bağlı ama sessiz olduğunda, Dovecot normalde o bağlantı için imap sürecini canlı tutar. Hibernation aktif olduğunda ise bu süreç sonlandırılır ve bağlantı durumu imap-hibernate adlı hafif bir servise devredilir.

Gerçek dünyada bu durumu şöyle hayal edebilirsiniz: 500 kullanıcılı bir mail sunucunuzda sabah 10’da herkes maillerini açmış, ama çoğu kişi aslında sadece Outlook ya da Thunderbird’ün arka planda tuttuğu kalıcı IMAP bağlantısını sürdürmektedir. Bu bağlantıların %80’i belki saatlerce hiçbir şey yapmaz. Ama her biri için ~2-5 MB bellek tüketen bir imap süreci çalışmaya devam eder. 400 pasif bağlantı için bu, 800 MB ile 2 GB arasında boşa harcanan RAM demektir.

Hibernation bu israfı ortadan kaldırır. Bağlantı gerçekten bir şey yapmaya başladığında (kullanıcı mail açar, siler, vb.) süreç yeniden canlandırılır ve işlem sorunsuz devam eder. İstemci tarafından bu geçiş tamamen şeffaftır.

Sistem Gereksinimleri ve Ön Kontroller

Hibernation özelliği Dovecot 2.2 ve sonrasında mevcuttur, ancak tam anlamıyla olgunlaşmış hali 2.3.x serisindedir. Üretim ortamında kullanmadan önce versiyonunuzu kontrol edin:

dovecot --version
# Örnek çıktı: 2.3.21 (9571df908)

Servislerin durumunu kontrol etmek için:

doveadm service status

imap-hibernate servisinin listede görünüp görünmediğine bakın. Eğer yoksa, kurulumunuzda bu modül eksik olabilir. Debian/Ubuntu tabanlı sistemlerde:

apt list --installed | grep dovecot
# dovecot-imapd paketinin kurulu olduğundan emin olun

Mevcut bellek kullanımını bir baz olarak kaydedin, optimizasyon sonrasındaki farkı görmek için buna ihtiyacınız olacak:

ps aux | grep imap | awk '{sum += $6} END {print "Toplam IMAP bellek: " sum/1024 " MB"}'

Temel Yapılandırma

Hibernation yapılandırması birkaç farklı dosyayı kapsar. Önce imap-hibernate servisini tanımlamamız, ardından IMAP servisine bu özelliği aktif etmemiz gerekir.

imap-hibernate Servisini Tanımlamak

/etc/dovecot/conf.d/10-master.conf dosyasını açın ve aşağıdaki servis bloğunu ekleyin:

service imap-hibernate {
  unix_listener imap-hibernate {
    # Sadece dovecot kullanıcısının erişmesine izin ver
    mode = 0600
    user = dovecot
  }
  # Bekleme sürecinin sayısını sınırla
  process_min_avail = 0
  idle_kill = 29s
}

Ardından mevcut service imap bloğunu bulun ve imap_hibernate_timeout parametresini ekleyin. Bu parametre, bir bağlantının ne kadar süre sessiz kaldıktan sonra hibernate moduna alınacağını belirler:

service imap {
  executable = imap imap-postlogin
  process_limit = 1024
  # Diğer mevcut ayarlarınız...
}

imap Protokol Yapılandırması

/etc/dovecot/conf.d/20-imap.conf dosyasına aşağıdaki satırı ekleyin:

protocol imap {
  # 30 saniye sessizlik sonrası hibernate moduna al
  imap_hibernate_timeout = 30s
  
  # Diğer mevcut ayarlarınız korunur
  imap_max_line_length = 64k
  imap_client_workarounds = delay-newmail  tb-extra-mailbox-sep
}

imap_hibernate_timeout değeri için önerilen aralık 5 saniye ile birkaç dakika arasındadır. Çok düşük bir değer (örneğin 5s), aktif kullanıcılarda bile sürekli hibernate/wake döngüsüne yol açarak performansı olumsuz etkileyebilir. Çok yüksek bir değer ise optimizasyonu geciktirir. Çoğu ortam için 30 saniye iyi bir başlangıç noktasıdır.

Gelişmiş Yapılandırma Senaryoları

Yüksek Yoğunluklu Ortamlar İçin Ayarlama

500’den fazla eşzamanlı kullanıcısı olan ortamlarda, hibernate servisinin kendisini de optimize etmeniz gerekir:

service imap-hibernate {
  unix_listener imap-hibernate {
    mode = 0600
    user = dovecot
  }
  # Yoğun saatlerde anında işlem yapabilmek için
  # minimum 2 süreç hazır beklesin
  process_min_avail = 2
  
  # Hibernate servisinin kendi bellek sınırı
  vsz_limit = 256M
  
  idle_kill = 29s
}

Aynı zamanda imap sürecinin kendisi için de bellek sınırı belirlemek iyi bir pratiktir:

service imap {
  process_limit = 2048
  vsz_limit = 256M
}

SSL/TLS Ortamlarında Hibernate

Eğer TLS bağlantıları kullanıyorsanız (ki kullanmalısınız), hibernate özelliği TLS oturum durumunu da yönetmek zorundadır. Bu genellikle otomatik çalışır ancak şunu doğrulamanız gerekir:

# TLS durumunu kontrol et
doveadm config -n | grep ssl

ssl = required ayarı varsa ve hibernate çalışmıyorsa, 10-ssl.conf dosyanızda aşağıdaki ayarı kontrol edin:

# /etc/dovecot/conf.d/10-ssl.conf
ssl = required
ssl_min_protocol = TLSv1.2
# ssl_dh ayarınızın mevcut olduğundan emin olun
ssl_dh = </etc/dovecot/dh.pem

Namespace ve Shared Mailbox Ortamları

Paylaşımlı mailbox kullanan ortamlarda hibernate biraz daha dikkatli yapılandırılmalıdır. IMAP NOTIFY komutu destekleniyorsa (Dovecot bunu destekler), hibernate sırasında push bildirimleri de çalışmaya devam eder:

protocol imap {
  imap_hibernate_timeout = 30s
  # NOTIFY desteğini açık tut
  imap_capability = +NOTIFY
  
  # Paylaşımlı mailboxlar için idle timeout'u artır
  # Hibernate zaten belleği kurtardığı için
  # uzun idle bağlantılarına izin verebiliriz
  imap_idle_notify_interval = 2 mins
}

Monitoring ve Debug

Yapılandırmanın çalışıp çalışmadığını izlemek kritik önem taşır. Dovecot, bu konuda zengin araçlar sunar.

Anlık Hibernate Durumunu İzlemek

# Tüm aktif bağlantıları listele ve durumlarını gör
doveadm who -1

# Hibernate'deki bağlantı sayısını hesapla
doveadm who | grep -c hibernate

# Kullanıcı bazında detaylı bilgi
doveadm who -f username

Gerçek Zamanlı İstatistikler

# Dovecot istatistiklerini dump et
doveadm stats dump

# Özellikle imap ile ilgili olanları filtrele
doveadm stats dump | grep -i imap

# Süreç sayısını izle - hibernate çalışıyorsa imap süreç sayısı düşmeli
watch -n 5 'ps aux | grep "dovecot/imap " | grep -v grep | wc -l'

Bellek Karşılaştırma Scripti

Optimizasyonun etkisini ölçmek için basit bir izleme scripti yazalım:

#!/bin/bash
# /usr/local/bin/dovecot-mem-monitor.sh

TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
IMAP_PROCS=$(ps aux | grep "dovecot/imap " | grep -v grep | wc -l)
IMAP_MEM=$(ps aux | grep "dovecot/imap " | grep -v grep | awk '{sum += $6} END {print sum/1024}')
HIBERNATE_PROCS=$(ps aux | grep "imap-hibernate" | grep -v grep | wc -l)
TOTAL_CONNECTIONS=$(doveadm who 2>/dev/null | wc -l)

echo "$TIMESTAMP | IMAP Procs: $IMAP_PROCS | IMAP Mem: ${IMAP_MEM}MB | Hibernate Procs: $HIBERNATE_PROCS | Total Conn: $TOTAL_CONNECTIONS" >> /var/log/dovecot-mem-stats.log

Bu scripti cron’a ekleyin:

# crontab -e
*/5 * * * * /usr/local/bin/dovecot-mem-monitor.sh

Log Analizi

Dovecot loglarında hibernate aktivitesini takip etmek için:

# Hibernate ile ilgili logları filtrele
grep -i hibernate /var/log/mail.log | tail -50

# Belirli bir kullanıcının hibernate geçişlerini izle
grep "[email protected]" /var/log/mail.log | grep -i "hibernat|wakeup"

# Hata varsa görmek için
grep -i "imap-hibernate" /var/log/mail.log | grep -i "error|fatal|warn"

Sık Karşılaşılan Sorunlar ve Çözümleri

Hibernate Çalışmıyor

En yaygın sorun, unix socket’in doğru konumda olmamasıdır. Dovecot base directory’yi kontrol edin:

doveadm config -h base_dir
# Genellikle /var/run/dovecot çıkar

ls -la /var/run/dovecot/ | grep hibernate
# imap-hibernate socket dosyasının burada olması gerekir

Socket yoksa, servis tanımınızdaki unix_listener adını base_dir ile eşleştirin:

service imap-hibernate {
  unix_listener imap-hibernate {
    # Tam path belirtmek gerekirse:
    # path = /var/run/dovecot/imap-hibernate
    mode = 0600
    user = $default_internal_user
  }
}

Bağlantılar Hibernate’e Geçmiyor

Debug log seviyesini geçici olarak artırarak neler olduğunu görebilirsiniz:

# Geçici debug modunu aç (üretimde kısa tutun)
doveadm log errors

# dovecot.conf içinde:
# auth_verbose = yes
# mail_debug = yes
# Bu ayarları test sonrası kapatmayı unutmayın!

Ayrıca imap_hibernate_timeout değerinin doğru parse edildiğini doğrulayın:

doveadm config -n protocol imap | grep hibernate
# Çıktı: imap_hibernate_timeout = 30s olmalı

Yüksek CPU Kullanımı

Hibernate çok sık devreye girip çıkıyorsa (thrashing durumu), timeout değerinizi artırın. Özellikle mobil istemciler ve agresif sync yapan uygulamalar bu probleme yol açabilir:

# Hangi istemcilerin en çok bağlantı kurduğunu görmek için
doveadm who | awk '{print $NF}' | sort | uniq -c | sort -rn | head -20

Belirli istemciler sürekli bağlantı kesip kuruyorsa, bunlar için özel ayar yapabilirsiniz. Thunderbird gibi desktop istemciler genellikle saatlerce sessiz kalırken, mobil istemciler daha kısa döngülere sahiptir.

Performans Etkileri ve Gerçek Dünya Sonuçları

Hibernation’ın ağırlıklı etkisi bellek üzerindedir ama bunun dolaylı yan etkileri de vardır. Bellek baskısı azaldığında:

  • Daha az swap kullanımı: Sistem swap’a daha az başvurur, bu da disk I/O’yu azaltır
  • Daha hızlı context switching: Daha az aktif süreç, daha verimli CPU kullanımı
  • Daha iyi fork latency: Yeni bağlantılar için süreç oluştururken sistem daha az meşguldür
  • Mail delivery gecikmeleri azalır: LMTP veya LDA üzerinden gelen mailler daha hızlı teslim edilir

Tipik bir kurumsal ortamda (200-500 kullanıcı) şu sonuçları bekleyebilirsiniz:

  • Hibernate öncesi: 400 aktif imap süreci, ~1.2 GB RAM
  • Hibernate sonrası: 80 aktif imap süreci, ~240 MB RAM (pasif bağlantılar imap-hibernate’de)
  • Net tasarruf: ~960 MB, yaklaşık %80 azalma

Bu sayılar ortama ve kullanıcı davranışlarına göre değişir, ama yön her zaman aynıdır: belirgin bir iyileşme.

Syslog ve Alerting Entegrasyonu

Üretim ortamında bellek kullanımını alerting sistemine bağlamak iyi bir pratiktir. Basit bir nagios/icinga uyumlu check scripti:

#!/bin/bash
# /usr/local/lib/nagios/check_dovecot_hibernation.sh

WARN_THRESHOLD=${1:-100}  # Aktif imap süreci uyarı eşiği
CRIT_THRESHOLD=${2:-200}  # Kritik eşik

IMAP_COUNT=$(ps aux | grep "dovecot/imap " | grep -v grep | wc -l)

if [ "$IMAP_COUNT" -gt "$CRIT_THRESHOLD" ]; then
    echo "CRITICAL: $IMAP_COUNT aktif IMAP süreci (eşik: $CRIT_THRESHOLD)"
    exit 2
elif [ "$IMAP_COUNT" -gt "$WARN_THRESHOLD" ]; then
    echo "WARNING: $IMAP_COUNT aktif IMAP süreci (eşik: $WARN_THRESHOLD)"
    exit 1
else
    echo "OK: $IMAP_COUNT aktif IMAP süreci - Hibernation sağlıklı çalışıyor"
    exit 0
fi

Diğer Bellek Optimizasyon Teknikleriyle Birlikte Kullanım

Hibernation tek başına güçlü bir araçtır, ama diğer Dovecot optimizasyonlarıyla birlikte kullanıldığında daha da etkili hale gelir.

process_limit ayarları: Her servis için mantıklı limitler belirleyin. Sınırsız süreç oluşumu memory exhaustion’a yol açar.

vsz_limit: Süreç başına sanal bellek sınırı koyun. Bellek sızıntısı olan durumlarda sistemi korur.

imap_max_line_length: Aşırı büyük IMAP komutlarını reddetmek hem güvenlik hem de bellek açısından önemlidir.

mail_prefetch_count: Mailbox okuma sırasında önbelleğe alınan mesaj sayısını ayarlayın. Yüksek değerler hız kazandırır ama bellek tüketimini artırır.

Tüm bu parametreler bir arada değerlendirildiğinde, mail sunucunuz hem daha az kaynak tüketir hem de daha öngörülebilir bir performans profili sergiler.

Yapılandırma Değişikliklerini Uygulamak

Tüm değişiklikleri yaptıktan sonra önce syntax kontrolü yapın:

dovecot -n
# Hata yoksa devam edin

# Dovecot'u graceful restart ile yeniden başlatın
# Bu komut mevcut bağlantıları kesmez
doveadm reload

# Eğer major değişiklikler yaptıysanız tam restart gerekebilir
# Bakım penceresi sırasında:
systemctl restart dovecot

Restart sonrası logları izleyin:

journalctl -u dovecot -f
# veya
tail -f /var/log/mail.log

Sonuç

Dovecot Hibernation, mail sunucusu yönetiminde sıkça göz ardı edilen ama uygulaması son derece kolay bir optimizasyondur. Özellikle 100’ün üzerinde aktif kullanıcıya sahip ortamlarda, bu tek ayar değişikliği ile bellek kullanımını yarı yarıya hatta daha fazla azaltmak mümkündür.

Kritik noktaları özetlemek gerekirse: imap_hibernate_timeout değerini kullanıcı tabanınıza göre ayarlayın, imap-hibernate servisini doğru izinlerle tanımlayın ve değişiklik öncesi/sonrası bellek kullanımını kayıt altına alın. Monitoring altyapınızı bu yeni parametreye göre güncelleyin ve olağandışı bir durum yaşandığında log analizi yapabilecek araçları hazır tutun.

Mail sunucusu optimizasyonu bir defalık bir eylem değil, sürekli gözlem ve ince ayar gerektiren bir süreçtir. Hibernation bu sürecin en düşük maliyetli, en yüksek geri dönüşlü adımlarından biridir. Hemen uygulayabilir, farkı birkaç saat içinde görebilirsiniz.

Yorum yapın