WordPress object cache, oturum yönetimi ve mikroservis kuyruklarında anlık donmaları (latency spikes) engelleyin; Transparent Huge Pages (THP) ve vm.overcommit_memory çekirdek ayarlarını yapılandırın.
RDB veya AOF arka planda fork() kullandığından Linux çekirdeğinde Copy-on-Write (COW) payı bırakılmalıdır.
Transparent Huge Pages (THP) devredeyken Linux 4 KB yerine 2 MB'lık bellek sayfaları kullanır. Redis arka planda RDB yedeği veya AOF sıkıştırması (fork) yaparken tek bir bayt değişse dahi çekirdek 2 MB'ın tamamını kopyalar (Copy-on-Write). Bu durum 200ms'yi aşan gecikme sıçramalarına (latency spikes) ve belleğin hızla tükenerek OOM Killer tarafından Redis'in öldürülmesine yol açar.
Sunucu belleğinin %40 kadarı Redis'e ayrıldı
Bellek dolduğunda en güvenli temizleme kuralı
OOM Killer çökmesini önleyen serbest RAM payı
Arka planda RAM şişmesini önleyen jemalloc defrag
# Redis Yüksek Performans ve Düşük Gecikme Yapılandırması # /etc/redis/redis.conf dosyasına ekleyin # Ağ ve Dinleme Kuyruğu bind 127.0.0.1 ::1 protected-mode yes port 6379 tcp-backlog 65535 timeout 0 tcp-keepalive 300 # Bellek Yönetimi ve Boşaltma Politikası maxmemory 1.6gb maxmemory-policy allkeys-lru maxmemory-samples 10 # Kalıcılık (Persistence) appendonly no # Aktif Bellek Parçalanma Giderici (Active Memory Defragmentation) activedefrag yes active-defrag-ignore-bytes 100mb active-defrag-threshold-lower 10 active-defrag-threshold-upper 30 active-defrag-cycle-min 5 active-defrag-cycle-max 50 active-defrag-max-scan-fields 1000 # Çekirdek IO ve İş Parçacıkları io-threads 4 io-threads-do-reads yes lazyfree-lazy-eviction yes lazyfree-lazy-expire yes lazyfree-lazy-server-del yes
Redis tamamen tek iş parçacıklı (single-threaded event loop) mimari üzerine kuruludur. Yedekleme veya kalıcılık sırasında (BGSAVE veya AOF rewrite) arka plana bir alt süreç (fork) çatallanır. Bu süreçte Linux çekirdeği Copy-on-Write (COW) mekanizmasını kullanır.
Linux çekirdeğinde THP aktif olduğunda bellek sayfaları 4 KB yerine 2 MB boyutundadır. Redis önbelleğindeki 10 baytlık tek bir anahtar güncellendiğinde dahi Linux çekirdeği 2 MB'lık koskoca bir bloğu kopyalamak zorunda kalır. Bu durum, Redis'in yanıt süresini mikrosaniyelerden 100-500 milisaniyelere fırlatır (latency spike) ve sitenizde anlık kilitlenmelere yol açar. Çözüm, Redis çalışan her sunucuda THP'yi never olarak kapatmaktır.
Varsayılan Linux ayarında çekirdek, fork işlemi başladığında alt sürecin de ebeveyn kadar fiziksel RAM tüketeceğini varsayar (aşırı kötümser senaryo). 4 GB RAM'li sunucuda Redis 2.5 GB kullanıyorsa, Linux fork işlemine izin vermez ve"Can't save in background: fork: Cannot allocate memory"hatası fırlatır. vm.overcommit_memory = 1 yapılarak çekirdeğin tüm bellek ayırma taleplerini kabul etmesi sağlanır.
Uzun süre çalışan Redis sunucularında anahtarlar silinip yeniden yazıldıkça bellek parçalanması (fragmentation ratio) 1.5x ile 2.5x seviyelerine çıkabilir. Bu durum, Redis'in aslında 1 GB veri tutmasına rağmen işletim sisteminden 2.5 GB RAM işgal etmesine neden olur. activedefrag yes direktifi ile Redis, boş zamanlarında bellek bloklarını otomatik olarak birleştirerek RAM israfını durdurur.