« Tüm yayınlar

PostgreSQL ve Linux OOM Killer: Daha Güvenli Bir Varsayılan

PostgreSQL'de katı Linux bellek overcommit (vm.overcommit_memory=2) ayarının OOM killer'a bağlı örnek çökmelerini nasıl önlediğini benchmark verileriyle inceliyoruz.

Linux'un bellek overcommit politikası gevşek olduğunda, fiziksel belleği aşan bir işlem OOM killer tarafından SIGKILL ile sonlandırılır. PostgreSQL bu duruma özellikle duyarlıdır: tüm backend'ler shared buffers, WAL buffer'ları ve kilit tablolarını içeren tek bir paylaşımlı bellek segmentini kullanır. Tek bir backend'in SIGKILL ile ölmesi, postmaster'ın bu segmentin bozulmuş olabileceğini varsayıp tüm bağlantıları kesmesine, WAL'ı yeniden oynatmasına ve tüm örneği yeniden başlatmasına yol açar.

Buna karşı çözüm, vm.overcommit_memory=2 ile katı overcommit politikası uygulamak ve commit limitini kernel'in varsayılan oranı yerine açıkça kilobyte cinsinden hesaplamaktır: shared_buffers için ayrılan huge page havuzu dışındaki RAM'in %80'i artı 2GB'lık bir tampon. Bu formül, kernel'in fiziksel bellek hâlâ mevcutken ENOMEM döndürmesini sağlar; böylece hata, kurtarılabilir bir sorgu hatası olarak PostgreSQL'e ulaşır.

m7i.2xlarge üzerinde yapılan bir bellek baskısı testinde iki politika karşılaştırıldı. Varsayılan gevşek overcommit altında, bir backend OOM killer tarafından öldürüldü, tüm örnek çöktü, 20 bekleyen oturumun tamamı düştü ve sunucu 30 saniye boyunca yeni bağlantı kabul edemedi. Katı overcommit altında ise aynı yük, tek bir sorgunun 'out of memory' hatası alıp geri alınmasıyla sonuçlandı; hiçbir oturum düşmedi ve kesinti olmadı. Select-only ve read-write benchmark'larında iki politika arasındaki performans farkı sırasıyla yalnızca %2,2 ve %0,6 olup, ölçüm gürültüsü sınırları içinde kaldı.