Linux Sunucularda OOM Killer ve Bellek Sızıntısı Analizi
Linux Sunucularda OOM Killer ve Bellek Sızıntısı Analizi
Son Güncelleme: Haziran 2026
OOM Killer, Linux sunucularda bellek yetersizliği oluştuğunda sistemi tamamen kilitlenmekten korumak için devreye giren çekirdek mekanizmasıdır. Özellikle VPS, VDS, hosting, veritabanı ve uygulama sunucularında bellek tüketimini doğru analiz etmek, kesintisiz hizmet ve performans için kritik öneme sahiptir.
Bu rehberde OOM Killer’ın nasıl çalıştığını, bellek sızıntısı (memory leak) belirtilerini, log analizini, süreç bazlı bellek kullanımını ve pratik önleme yöntemlerini adım adım inceleyeceğiz.
İçindekiler
- OOM Killer Nedir?
- OOM Killer Nasıl Çalışır?
- Belirtiler ve Log Analizi
- Bellek Kullanımını Ölçmek
- Bellek Sızıntısı Analizi
- OOM Önleme Yöntemleri
- Uygulama Bazlı İpuçları
- Örnek Müdahale Planı
- Sıkça Sorulan Sorular
- Sonuç
OOM Killer Nedir?
OOM Killer, İngilizce Out of Memory Killer ifadesinin kısaltmasıdır. Türkçeye “bellek yetersizliği sonlandırıcısı” olarak çevrilebilir. Linux çekirdeği, fiziksel RAM ve kullanılabilir takas alanı (swap) kritik seviyeye düştüğünde bazı süreçleri sonlandırarak sistemin tamamen yanıt vermez hale gelmesini engellemeye çalışır.
Bir sunucuda çalışan web sunucusu, veritabanı, PHP-FPM havuzu, Node.js servisi, Java uygulaması veya yedekleme işlemi beklenenden fazla bellek tüketebilir. Bu durumda Linux çekirdeği tüm sistemi kapatmak yerine, en uygun gördüğü süreci öldürür. Kullanıcı tarafında bu olay çoğu zaman “site düştü”, “veritabanı kapanmış”, “uygulama kendiliğinden restart olmuş” veya “502 Bad Gateway hatası alıyorum” şeklinde fark edilir.
OOM Killer tek başına bir hata değil, genellikle altta yatan kapasite planlama, yanlış servis yapılandırması, bellek sızıntısı veya trafik artışı probleminin sonucudur. Bu nedenle yalnızca öldürülen servisi yeniden başlatmak kalıcı çözüm sağlamaz; bellek tüketiminin neden arttığı analiz edilmelidir.
OOM Killer Nasıl Çalışır?
Linux çekirdeği, bellek baskısı oluştuğunda her süreç için bir risk puanı hesaplar. Bu puan genellikle oom_score olarak görülür. Puan ne kadar yüksekse, ilgili sürecin OOM durumunda sonlandırılma ihtimali o kadar fazladır.
oom_score ve oom_score_adj Mantığı
/proc dosya sistemi altında her sürecin OOM ile ilişkili değerleri incelenebilir. Örneğin bir sürecin PID değeri 1234 ise aşağıdaki dosyalar kontrol edilebilir:
cat /proc/1234/oom_score
cat /proc/1234/oom_score_adj
oom_score çekirdeğin hesapladığı anlık riski gösterirken, oom_score_adj yöneticinin bu sürecin öldürülme olasılığını artırmak veya azaltmak için kullanabileceği ayardır. Bu değer -1000 ile 1000 arasında olabilir. -1000 değeri süreci OOM Killer’dan pratikte korur; 1000 ise süreci daha kolay hedef haline getirir.
Hangi Süreçler Daha Risklidir?
- Yüksek bellek kullanan süreçler: Büyük veritabanı işlemleri, raporlama servisleri, import ve export işleri daha yüksek risk taşır.
- Çok sayıda worker açan servisler: Yanlış yapılandırılmış PHP-FPM, Apache veya kuyruk işleyicileri belleği hızla tüketebilir.
- Bellek limiti olmayan uygulamalar: Node.js, Java, Python ve PHP uygulamaları limitlenmediğinde beklenenden fazla RAM kullanabilir.
- Yoğun trafik alan web siteleri: Ani trafik artışı, her istek için yeni süreç veya thread oluşuyorsa OOM riskini yükseltir.
Belirtiler ve Log Analizi
OOM olayları bazen belirgin bir hata mesajı vermeden gerçekleşir. Bir servis kapanır, süreç kaybolur veya sistem birkaç saniye boyunca yanıt vermeyebilir. Bu nedenle ilk adım her zaman logları kontrol etmektir.
journalctl ile OOM Kayıtlarını Bulma
Systemd kullanan Linux dağıtımlarında journalctl ile çekirdek logları incelenebilir:
journalctl -k | grep -i "out of memory"
journalctl -k | grep -i "killed process"
journalctl -k --since "24 hours ago" | grep -Ei "oom|killed process|out of memory"
Bu komutlar, son 24 saat içinde OOM Killer tarafından sonlandırılan süreçleri bulmak için pratik bir başlangıç sağlar. Loglarda genellikle süreç adı, PID, bellek tüketimi ve öldürülme nedeni görülebilir.
dmesg ile Çekirdek Mesajlarını İnceleme
dmesg, çekirdek mesajlarını hızlıca görmek için kullanılır:
dmesg -T | grep -Ei "oom|killed process|out of memory"
-T parametresi zaman damgalarını okunabilir biçime çevirir. Böylece OOM olayının tam olarak hangi saatte yaşandığı tespit edilebilir ve aynı zaman aralığındaki web, veritabanı veya uygulama loglarıyla karşılaştırılabilir.
Tipik OOM Log Örneği
Out of memory: Killed process 24567 (php-fpm) total-vm:2048000kB, anon-rss:850000kB, file-rss:0kB, shmem-rss:0kB
Bu örnekte php-fpm süreci öldürülmüştür. anon-rss değeri, sürecin gerçek RAM kullanımını anlamak için önemlidir. Eğer aynı servis tekrar tekrar öldürülüyorsa, ilgili servis yapılandırması veya uygulama kodu detaylı incelenmelidir.
Bellek Kullanımını Ölçmek
OOM analizinde yalnızca toplam RAM miktarına bakmak yeterli değildir. Kullanılabilir bellek, cache, swap, süreç sayısı, servis limitleri ve anlık yük birlikte değerlendirilmelidir.
free Komutu ile Genel Durum
free -h
free -h komutu toplam, kullanılan, boş, cache ve kullanılabilir bellek değerlerini gösterir. Linux sistemlerde “used” değerinin yüksek görünmesi her zaman problem değildir; çünkü çekirdek boş belleği disk önbelleği için kullanabilir. Daha doğru yorum için available sütununa bakılmalıdır.
ps ile En Çok Bellek Kullanan Süreçler
ps aux --sort=-%mem | head -n 15
Bu komut, bellek kullanımına göre en yüksek süreçleri listeler. Ani artış yaşayan servisleri tespit etmek için belirli aralıklarla çalıştırılabilir.
smem ile PSS Değeri
smem, paylaşılan bellek kullanımını daha doğru yorumlamak için PSS (Proportional Set Size) değerini gösterir. Özellikle çok sayıda worker kullanan servislerde RSS değerleri yanıltıcı olabilir.
apt update
apt install smem -y
smem -tk | sort -nr -k 7 | head -n 20
Temel Bellek Metrikleri
| Metrik | Anlamı | Ne Zaman Önemli? |
|---|---|---|
| RSS | Resident Set Size, sürecin RAM’de tuttuğu bellek | Tekil süreç tüketimini incelerken |
| VSZ | Virtual Size, sürecin sanal bellek adres alanı | Her zaman gerçek RAM tüketimini göstermez |
| PSS | Paylaşılan belleğin süreçlere orantılı dağıtılmış hali | Çok süreçli servislerde daha doğru analiz için |
| Swap | Disk üzerinde kullanılan takas alanı | RAM baskısı ve performans düşüşünü anlamak için |
| Available | Yeni uygulamalar için kullanılabilir tahmini bellek | Genel bellek sağlığını yorumlamak için |
Bellek Sızıntısı Analizi
Bellek sızıntısı, bir uygulamanın artık ihtiyaç duymadığı belleği işletim sistemine geri bırakmaması durumudur. Kısa süreli testlerde fark edilmeyebilir; ancak saatler veya günler içinde süreç belleği sürekli artar ve sonunda OOM Killer devreye girebilir.
Belirgin İşaretler
- Sürekli artan RSS: Servis yeniden başlatılana kadar bellek kullanımı düzenli olarak yükselir.
- Trafikten bağımsız artış: Ziyaretçi veya işlem sayısı düşük olsa bile bellek büyümeye devam eder.
- Tekrarlayan servis çökmesi: Aynı süreç belirli aralıklarla OOM nedeniyle kapanır.
- Yavaşlayan yanıt süreleri: Swap kullanımı arttıkça uygulama gecikmeleri belirginleşir.
Basit İzleme Döngüsü
Aşağıdaki örnek, belirli bir sürecin bellek kullanımını periyodik olarak izlemek için kullanılabilir:
while true; do
date
ps -o pid,ppid,cmd,%mem,rss,vsz -p 1234
sleep 60
done
PID değişebileceği için servis adına göre takip yapmak çoğu zaman daha kullanışlıdır:
while true; do
date
ps aux | grep -E "php-fpm|node|java" | grep -v grep | sort -nr -k 4 | head
sleep 60
done
Grafiksel İzleme Neden Gereklidir?
Komut satırı anlık teşhis için yeterli olsa da bellek sızıntısını anlamak için zaman serisi verisi gerekir. RAM, swap, süreç sayısı, CPU, disk I/O ve ağ trafiği birlikte grafiklenmelidir. Böylece örneğin her gece çalışan bir raporlama görevinin bellek tüketimini artırdığı veya belirli endpoint çağrılarından sonra worker süreçlerinin büyüdüğü görülebilir.
OOM Önleme Yöntemleri
OOM olaylarını azaltmak için tek bir ayar yeterli değildir. Doğru yaklaşım; servis limitleri, uygulama optimizasyonu, swap yönetimi, izleme ve kapasite planlamasını birlikte uygulamaktır.
Servis Başına Bellek Limiti Tanımlama
Systemd servislerinde MemoryMax ile bellek limiti belirlenebilir. Bu yöntem, tek bir servisin tüm sunucuyu tüketmesini engeller.
systemctl edit my-app.service
[Service]
MemoryMax=1G
Restart=on-failure
RestartSec=5
Değişiklikten sonra servis yapılandırması yeniden yüklenmelidir:
systemctl daemon-reload
systemctl restart my-app.service
Swap Alanını Doğru Kullanma
Swap, RAM’in yerine geçmez; ancak ani bellek sıçramalarında sistemin tamamen kilitlenmesini önleyebilir. Çok düşük RAM’e sahip sunucularda kontrollü swap alanı faydalı olabilir. Fakat yoğun swap kullanımı disk performansını düşürebilir.
swapon --show
free -h
Worker Sayılarını Sınırlandırma
PHP-FPM, Apache, Nginx worker, queue worker ve uygulama süreçleri sınırsız büyümemelidir. Örneğin her PHP-FPM worker ortalama 80 MB bellek kullanıyorsa, 40 worker yaklaşık 3.2 GB RAM tüketebilir. Sunucuda veritabanı da çalışıyorsa bu değer OOM için yeterli olabilir.
| Servis | Kontrol Edilecek Ayar | Risk |
|---|---|---|
| PHP-FPM | pm.max_children |
Fazla worker RAM’i tüketir |
| Apache | MaxRequestWorkers |
Yoğun trafikte süreç patlaması yaşanabilir |
| Node.js | --max-old-space-size |
Limit yoksa süreç aşırı büyüyebilir |
| Java | -Xmx |
Heap limiti yanlışsa sistem belleği daralır |
| Queue Worker | Worker sayısı ve restart politikası | Uzun yaşayan işler bellek sızdırabilir |
Uygulama Bazlı İpuçları
OOM problemleri çoğu zaman uygulama katmanında başlar. Sunucu tarafında önlem almak önemlidir; ancak kod, framework ve çalışma zamanı ayarları da gözden geçirilmelidir.
PHP ve Laravel Uygulamaları
PHP tarafında memory_limit, her script için üst sınır belirler. Laravel gibi framework kullanan projelerde queue worker süreçleri uzun süre çalıştığı için bellek sızıntıları daha kolay ortaya çıkar. Worker süreçlerini belirli iş sayısından sonra yeniden başlatmak etkili bir yöntemdir.
php artisan queue:work --max-jobs=500 --max-time=3600
Ayrıca büyük Excel, CSV veya görsel işleme operasyonlarında verinin tamamını belleğe almak yerine parça parça işlemek daha sağlıklıdır.
Node.js Uygulamaları
Node.js uygulamalarında heap limiti açıkça belirlenebilir. Bellek tüketimi kontrol altına alınmadığında V8 motoru yüksek bellek kullanabilir.
node --max-old-space-size=1024 app.js
PM2 gibi süreç yöneticileri kullanılıyorsa bellek eşiğine göre otomatik restart uygulanabilir:
pm2 start app.js --max-memory-restart 1G
Veritabanı Sunucuları
MySQL, MariaDB veya PostgreSQL gibi veritabanlarında bellek ayarları toplam RAM’e göre planlanmalıdır. Buffer, cache, bağlantı sayısı ve geçici tablo ayarları yanlış yapılandırıldığında veritabanı tek başına sunucuyu OOM noktasına taşıyabilir. Uygulama ve veritabanı aynı sunucuda çalışıyorsa daha dikkatli limitleme yapılmalıdır.
Yoğun veritabanı ve web trafiği olan projelerde kaynak izolasyonu için Türkiye VDS Sunucu veya daha yüksek kaynak gerektiren senaryolarda Kiralık Sunucu tercih edilebilir.
Örnek Müdahale Planı
Bir üretim sunucusunda OOM yaşandığında panikle yalnızca servis restart etmek yerine sistematik ilerlemek gerekir. Aşağıdaki plan, hızlı teşhis ve kalıcı çözüm için kullanılabilir.
- Olay saatini belirleyin: Kullanıcı şikayetleri, izleme alarmları ve servis loglarıyla kesinti zamanını netleştirin.
- Çekirdek loglarını kontrol edin:
journalctlvedmesgile OOM mesajlarını bulun. - Öldürülen süreci tespit edin: Hangi servis, hangi PID ve ne kadar bellek ile sonlandırılmış inceleyin.
- Servis loglarıyla eşleştirin: Aynı dakikada web isteği, cron, import, backup veya kampanya trafiği var mı kontrol edin.
- Anlık kaynak durumunu ölçün:
free,ps,top,smemve disk I/O değerlerini inceleyin. - Geçici önlem alın: Gerekirse worker sayısını düşürün, problemli cron görevini durdurun veya servisi kontrollü yeniden başlatın.
- Kalıcı limitler uygulayın: Systemd, PHP-FPM, Node.js, Java veya veritabanı ayarlarında kaynak sınırlarını tanımlayın.
- İzleme ekleyin: RAM, swap, süreç sayısı ve servis özel metrikleri için alarm oluşturun.
Özellikle yedekleme ve büyük dosya işleme görevleri bellek tüketimini artırabilir. Kritik projelerde düzenli yedekleme mimarisi için Yedekleme Hizmeti değerlendirilmelidir. Web projeleri için başlangıç seviyesinde daha yönetilebilir bir yapı gerekiyorsa Linux Hosting çözümleri de uygun olabilir.
Sıkça Sorulan Sorular
OOM Killer devreye girdiyse sunucum bozuk mu?
Hayır. OOM Killer, Linux çekirdeğinin sistemi tamamen kilitlenmekten korumak için kullandığı bir mekanizmadır. Ancak sık sık devreye giriyorsa bellek kapasitesi, servis yapılandırması veya uygulama kodu mutlaka incelenmelidir.
OOM hatasını sadece RAM yükselterek çözebilir miyim?
Bazen RAM yükseltmek doğru çözümdür; fakat bellek sızıntısı varsa daha fazla RAM yalnızca problemin daha geç ortaya çıkmasına neden olur. Önce hangi sürecin neden büyüdüğü analiz edilmeli, ardından kapasite artırımı değerlendirilmelidir.
Swap kullanmak OOM sorununu tamamen engeller mi?
Swap, ani bellek sıçramalarında zaman kazandırabilir; ancak RAM’in birebir alternatifi değildir. Aşırı swap kullanımı ciddi performans düşüşüne yol açabilir. Bu nedenle swap, servis limitleri ve uygulama optimizasyonu ile birlikte düşünülmelidir.
Hangi sürecin OOM nedeniyle kapandığını nasıl anlarım?
journalctl -k ve dmesg -T komutları ile çekirdek loglarını inceleyebilirsiniz. Loglarda genellikle “Killed process” ifadesi, süreç adı, PID ve bellek değerleri yer alır.
PHP-FPM neden OOM Killer tarafından öldürülür?
Genellikle pm.max_children değerinin yüksek olması, ağır PHP işlemleri, bellek sızdıran eklentiler veya büyük veri işleme operasyonları buna neden olur. Ortalama worker belleği hesaplanarak maksimum worker sayısı yeniden belirlenmelidir.
Veritabanı sunucusu OOM nedeniyle kapanıyorsa ne yapmalıyım?
Bağlantı sayısı, buffer ayarları, sorgu yoğunluğu ve geçici tablo kullanımı incelenmelidir. Web uygulaması ve veritabanı aynı makinedeyse kaynak izolasyonu için ayrı sunucu veya daha güçlü VDS planı değerlendirilmelidir.
OOM olaylarını önceden fark etmek mümkün mü?
Evet. RAM, swap, süreç sayısı, servis restart sayısı ve uygulama özel metrikleri izlenirse OOM yaşanmadan önce alarm üretilebilir. Özellikle “available memory” düşüşü ve swap artışı erken uyarı sinyalleridir.
Sonuç
Linux OOM Killer, sunucuyu tamamen kilitlenmekten koruyan önemli bir güvenlik mekanizmasıdır; ancak sık görülmesi ciddi bir kaynak veya yapılandırma problemine işaret eder. Kalıcı çözüm için log analizi, süreç bazlı bellek ölçümü, servis limitleri, uygulama optimizasyonu ve düzenli izleme birlikte uygulanmalıdır.
Web siteniz, uygulamanız veya veritabanınız büyüdükçe bellek yönetimi daha kritik hale gelir. Kaynak izolasyonu, yüksek performans ve ölçeklenebilir altyapı için Corelux Sanal Sunucu, Bulut Sunucu ve Kiralık Sunucu çözümlerini değerlendirebilir; projenize uygun altyapı ile OOM riskini en aza indirebilirsiniz.
Yazar
Boran BAR