Thread Starter
#0
OOM Killer Nedir ve Neden Önemlidir?
Bir sunucu ortamında bellek kaynakları sınırlıdır ve bu kaynakların tükenmesi ciddi sorunlara yol açabilir. "Out Of Memory" (OOM) Killer, Linux çekirdeğinin kritik bir bileşenidir ve sistem belleği yetersiz kaldığında devreye girer. Amacı, bellek tüketen süreçlerden birini sonlandırarak sistemin tamamen çökmesini veya donmasını engellemektir. Bu mekanizma, özellikle yoğun iş yükü altındaki sunucular ve konteynerize edilmiş ortamlar için hayati önem taşır. OOM Killer, sistemi kurtarmak için genellikle en çok belleği kullanan veya en az önemli olarak işaretlenmiş süreçleri hedefler. Dolayısıyla, doğru yapılandırma ile sunucu istikrarını önemli ölçüde artırabilir, beklenmedik kesintilerin önüne geçebiliriz.
OOM Killer'ın Çalışma Prensibi
Linux çekirdeği, sistemde kullanılabilir bellek seviyesini sürekli olarak izler. Bellek kritik seviyelere düştüğünde, OOM Killer tetiklenir ve hangi sürecin kurban seçileceğini belirlemek için karmaşık bir algoritma kullanır. Bu algoritma, sürecin tükettiği bellek miktarı, yaşam süresi ve sürecin öncelik ayarları gibi faktörleri dikkate alır. Her sürecin kendine ait bir "oom_score" değeri vardır; bu değer ne kadar yüksekse, sürecin OOM Killer tarafından sonlandırılma olasılığı o kadar artar. Sistem, genellikle en yüksek "oom_score" değerine sahip süreci seçerek onu sonlandırır ve böylece diğer önemli süreçlerin çalışmaya devam etmesini sağlar. Bu, sistemin nefes almasını ve normal işlevselliğine dönmesini sağlar.
/proc/sys/vm/overcommit_memory Parametresi
`overcommit_memory` parametresi, Linux çekirdeğinin belleği aşırı tahsis etme politikasını kontrol eder. Bu parametre, çekirdeğe uygulamaların talep ettikleri bellek miktarını fiziksel olarak mevcut olandan daha fazla talep edip edemeyeceğini söyler. Üç farklı değeri vardır: `0`, `1` ve `2`. Varsayılan değer olan `0`, çekirdeğin bellek taleplerini sezgisel bir yaklaşımla değerlendirmesi anlamına gelir; yani, bazı talepleri reddedebilir. `1` değeri, çekirdeğin tüm bellek taleplerini kabul etmesini sağlar, bu da OOM Killer'ın daha sık tetiklenmesine yol açabilir. Aksine, `2` değeri ise çekirdeğin asla aşırı bellek tahsis etmemesini sağlar ve bu da sistemin daha kararlı çalışmasına katkıda bulunur. Bu ayar, bellek yönetimi stratejimizin temelini oluşturur.
/proc/sys/vm/overcommit_ratio Parametresi
`overcommit_memory` değeri `2` olarak ayarlandığında, `overcommit_ratio` parametresi devreye girer ve ne kadar sanal belleğin fiziksel RAM ve takas alanı toplamının üzerinde tahsis edilebileceğini yüzde olarak belirler. Örneğin, bu değeri %50 olarak ayarlarsak, sistem fiziksel bellek ve takas alanının toplamının %50'si kadar daha fazla bellek tahsis etmeye izin verir. Bu, özellikle bellek yoğun uygulamalar için daha esnek bir bellek yönetimi sağlar, ancak aynı zamanda OOM durumuna düşme riskini de artırabilir. Bu oranı dikkatli bir şekilde ayarlamak, hem sistemin performansını hem de kararlılığını doğrudan etkiler. Bu nedenle, sunucunun iş yüküne ve bellek kullanım desenlerine göre en uygun değeri bulmak kritik öneme sahiptir.
cgroup v2 ve OOM Yönetimi
Modern Linux sistemleri ve özellikle konteynerizasyon teknolojileri (Docker, Kubernetes) ile birlikte `cgroup v2` (control groups v2) daha gelişmiş bir OOM yönetimi sunar. `cgroup v2`, süreçleri hiyerarşik gruplar halinde düzenleyerek her gruba belirli kaynak limitleri atamamıza olanak tanır, buna bellek de dahildir. Her `cgroup` için ayrı bellek limitleri belirleyebiliriz. Bir `cgroup` içinde bellek tükenirse, OOM Killer yalnızca o grubun içindeki süreçleri hedef alır, tüm sistemi etkilemesini önler. Bu sayede, bir uygulamanın bellek sızdırması veya aşırı kullanımı diğer kritik hizmetleri riske atmaz. Başka bir deyişle, `cgroup v2`, OOM durumlarının etkisini izole etmemize ve çok daha granular bir kontrol sağlamamıza yardımcı olur.
Uygulama Bazında OOM Killer Ayarları
OOM Killer'ın hangi süreçleri sonlandıracağını daha iyi kontrol etmek için uygulama bazında ayarlar yapabiliriz. Her Linux süreci, `/proc/[PID]/oom_score_adj` adlı bir dosyaya sahiptir. Bu dosyadaki değeri değiştirerek sürecin `oom_score`'unu etkileyebiliriz. Örneğin, değeri `-1000` olarak ayarlarsak, o sürecin OOM Killer tarafından sonlandırılma olasılığını neredeyse sıfıra indiririz; bu, kritik veritabanı sunucuları veya web sunucuları gibi uygulamalar için idealdir. Aksine, değeri pozitif bir sayıya ayarlarsak (örneğin `+500`), o sürecin OOM Killer tarafından daha erken hedeflenmesini sağlarız. Bu esneklik, sunucu üzerindeki farklı uygulamaların önem derecesine göre bellek koruma stratejileri oluşturmamıza olanak tanır ve böylece sistemin genel kararlılığını artırırız.
OOM Killer Ayarlarını Test Etme ve İzleme
OOM Killer ayarlarını yapılandırdıktan sonra, bunların beklediğimiz gibi çalıştığından emin olmak için test etmek ve sürekli izlemek önemlidir. Küçük bir test ortamında, kontrollü bir şekilde bellek tüketimi yaratarak OOM Killer'ın hangi süreçleri sonlandırdığını gözlemleyebiliriz. Örneğin, basit bir Python betiği ile bellek sızdırması taklit edebiliriz. Ayrıca, `dmesg` komutu ile çekirdek loglarını kontrol ederek OOM Killer'ın tetiklendiği zamanları ve hangi süreçleri öldürdüğünü görebiliriz. Prometheus, Grafana gibi izleme araçları da sunucunun bellek kullanımını gerçek zamanlı olarak takip etmemizi sağlar. Sonuç olarak, düzenli testler ve aktif izleme, OOM Killer ayarlarımızın optimum düzeyde çalıştığından emin olmamıza ve olası sorunlara proaktif bir şekilde müdahale etmemize yardımcı olur.