CPU Throttling Sorunlarını Limit Ayarlarıyla Çözmek

moon_ibrahim Member
10-28-2026, 07:48 AM

OOMKilled Hatalarının Nedenleri ve Önlemleri



Kubernetes kümelerinde kaynak limitleri her iş yükü için bellek tüketimini sınırlar içinde tutan önemli bir mekanizmadır. Bu tanımlamalar sayesinde bir uygulama kümedeki diğer bileşenleri etkilemeden hizmet verebilir. Yönetici bu değerleri dikkatli tanımladığında atıl kaynaklar önlenir ve cluster kararlılığı güçlenir. Limit tanımlanmayan pod düğüm üzerindeki tüm boş kaynakları kullanabilir, bu da komşu iş yüklerinde kesintilere yol açabilir. Üretim ortamlarda limitler olmazsa olmaz kabul edilir. Doğru tasarım için önce uygulamanın normal ve zirve yük profili analiz edilmeli. Bu analiz izleme araçlarıyla yapıldığında sonuçlar daha isabetli olur. Ayrıca ad alanı düzeyinde kota ve LimitRange nesneleriyle standart değerler belirlenebilir. Böylece ekipler kendilerine ait iş yükleri için standart sınırlarla çalışır. Sonuç olarak limit yönetimi, kapasite kontrolü ile güvenilirliği birlikte güçlendiren sürekli bir çalışmadır.


Kubernetes'te requests ile limits arasındaki fark kaynak planlamasının temelini oluşturur. Requests, zamanlayıcının (scheduler) bir konteyner için ayırdığı minimum kaynak miktarıdır. Zamanlayıcı, düğüm seçerken bu istek miktarlarına bakar ve yalnızca yeterli serbest kapasiteye sahip node'lara yerleştirme yapar. Limitler ise bir konteynerin tavanı üst sınırı belirler. CPU için bu sınır aşıldığında konteyner yavaşlatılır, ancak sonlandırılmaz. RAM için ise limit aşıldığında süreç OOMKilled hatasına düşerek öldürülür. Requests ile limits aynı değere eşitlendiğinde pod Guaranteed QoS sınıfına dahil olur. Farklı değerler tanımlandığında patlayabilir sınıf oluşur. Hiçbir değer tanımlanmadığında en iyi çaba sınıfı geçerli olur ve bu konteyner kaynak baskısında ilk çıkarılma adayı olur. Bu nedenle hangi sınıfın seçileceğine iş yükünün kritikliğine göre karar verilmeli. Kritik veritabanları için Guaranteed sınıf, toplu işler için esnek sınıf uygun olabilir. Her iki miktarın da anlaşılması maliyet ve verim dengesini sağlıklı kurmak için şarttır.


CPU limitlerinin belirlenmesi uygulamanın davranışına bağlı olarak gerçekleştirilmelidir. İşlemci birimi millicore cinsinden ifade edilir ve 1000m değeri tek bir çekirdeğe karşılık gelir. İlk olarak uygulamanın düşük yük ve yoğun trafik altındaki işlemci kullanımı gözlemlenmeli. Prometheus gibi izleme sistemleriyle alınan veriler p95 yüzdelik değerleri üzerinden yorumlanır. Sınır değeri genellikle bu zirve kullanımın biraz üzerinde tutulur. Aşırı kısıtlayıcı bir limit gecikmelere ve bekleme sürelerinin uzamasına neden olur. Çok yüksek bir limit ise küme kapasitesinin boşa kullanılmasına yol açar. Pek çok ekip CPU limitini tamamen kaldırıp yalnızca requests değerine dayanır. Bu yaklaşım esneklik sağlasa da komşu iş yüklerinde gürültülü etkilere neden olabilir. Yük ortamlarında farklı limit seviyeleri denenerek ideal nokta bulunmalıdır. Bu aşamada gerçek trafik örnekleri kullanıldığında sonuçlar çok daha değerli olur. Son olarak limitler, servis sürümleri güncellendikçe tekrar değerlendirilmelidir.


Bellek limitlerinin hesaplanması CPU'ya göre çok daha hassas bir konudur, çünkü bellek sıkıştırılamaz bir kaynaktır. Sınır aşıldığında kernel OOM Killer çalışır ve konteyneri öldürür. Dolayısıyla RAM limiti konservatif ama isabetli ayarlanmalıdır. Hesaplamaya başlamak uygulamanın yığın ve yığın bellek kullanımı ayrıntılı incelenmelidir. JVM tabanlı uygulamalarda heap boyutu ile pod'un toplam belleği arasında makul bir boşluk bırakılmalıdır. Node.js ve Python uygulamalarında RAM sızıntıları zamanla limit ihlaline yol açabilir. Bu yüzden sürekli izleme ile bellek eğrisi takip edilmelidir. Kubernetes içinde çalışma kümesi bellek metriği örneğin metrikler, fiili kullanımı isabetli gösterir. Sınır değeri çoğunlukla zirve kullanımın yüzde on beş üzerinde tutulur. Ancak gereğinden fazla büyük limitler düğüm belleğinin boşa edilmesine neden olur. Ortam koşulları farklılaştıkça hesaplamanın yeniden yapılması tavsiye edilir.


Kaynak isteklerinin isabetli ayarlanması, küme planlamasının verimli çalışması için kritik öneme sahiptir. Requests değeri gereğinden az tanımlandığında zamanlayıcı pod'u aşırı dolu düğümlere yerleştirir, bu da kararlılık sorunlarına neden olur. Gereğinden fazla tanımlandığında ise node'lar gerçekte kullanılmadığı halde bile dolu görünür. Bu durum cluster verimliliğini düşürür ve fazla altyapı maliyeti oluşturur. Doğru bir başlangıç için tarihsel metrikler incelenmeli ve ortalama kullanım değerine yakınsak bir istek belirlenmelidir. Vertical Pod Autoscaler gibi mekanizmalar öneri sunabilir ve bu tavsiyeler ilk yapılandırma için kullanılabilir. Horizontal Pod Autoscaler ile beraber kullanılırken çakışmalara dikkat gösterilmelidir. Ayrıca ad alanı seviyesinde LimitRange kurulduğunda eksik istekler kendiliğinden atanabilir. Düzenli değerlendirme ile ayarlar uygulama gelişimine uyumlu güncel tutulmalıdır.


Kubernetes kümelerinde resource limit değerlerini doğru belirlemek için öncelikle QoS sınıflarını iyi anlamak gerekir. Bir pod Burstable sınıfına, tanımlanan request ve limit değerlerine göre atanır. Pod içindeki her container için request ve limit eşit tanımlanırsa pod Guaranteed kabul edilir ve bellek baskısı altında en son sonlandırılan grup olur. Yalnızca request tanımlanmış veya request ile limit farklı olan pod'lar Burstable sınıfına girer ve kaynak fazlasını kullanabilir. Hiçbir request veya limit belirtilmeyen pod'lar BestEffort sınıfa düşer ve node üzerinde kaynak sıkıştığında ilk sonlandırılan adaylar arasında yer alır. Bu ayrım, kritik servisleri korumak için temel bir araçtır. Doğru sınıflandırma yapıldığında, yoğun yük altında bile önemli uygulamaların sorunsuz çalışması sağlanabilir. Üretim ortamında her iş yükünün önem derecesine göre QoS sınıfı bilinçli biçimde seçilmelidir. Aksi halde beklenmeyen tahliyeler ve performans düşüşleri kaçınılmaz hale gelir. Ekipler bu sınıfları, ilgili manifestolarda açıkça tanımlayarak tutarlı bir davranış elde edebilir. Ayrıca node kapasitesinin bu sınıfların toplam talebini kaldırabilecek şekilde planlanması gerekir. Son olarak, QoS kararlarının izlenmesi için metrikler ve uyarılar yapılandırılmalı ve düzenli gözden geçirilmelidir.


LimitRange nesnesi, bir namespace içindeki container ve pod'lar için varsayılan request ve limit değerlerini tanımlamanın pratik bir yoludur. Geliştiriciler manifestolarında kaynak belirtmeyi atladığında bile, LimitRange devreye girerek her container'a makul değerler atar. Böylece BestEffort sınıfında kalan pod sayısı minimize edilebilir. Bu nesne ile minimum ve maksimum sınırlar da zorunlu kılınabilir. Örneğin bir container'ın belleği belirli bir üst sınırı aşarsa, API sunucusu isteği reddeder. Bu yaklaşım, aşırı kaynak tahsisini önler ve küme genelinde adil dağılım sağlar. LimitRange, request ile limit oranını da kısıtlayabilir ve böylece aşırı taahhüt sorununu azaltır. Varsayılan değerler seçilirken uygulamaların tipik kullanım profilleri göz önünde bulundurulmalıdır. Çok düşük değerler sık OOMKill olaylarına, çok yüksek değerler ise kaynak israfına neden olur. Bu nedenle ekipler, LimitRange değerlerini periyodik olarak güncellemeli ve uygulamaların gerçek davranışıyla karşılaştırmalıdır. Ayrıca farklı ortamlar için, örneğin geliştirme ve üretim namespace'leri için, ayrı LimitRange tanımları oluşturulabilir. Bu esneklik, kaynak yönetimini hem kolaylaştırır hem de tutarlılığı korur.


ResourceQuota, bir namespace'in tüketebileceği toplam kaynak miktarını sınırlandırarak çok kiracılı kümelerde adaletli bir paylaşım sağlar. Bu nesne ile CPU ve bellek toplamları, depolama talepleri ve hatta pod, service veya secret gibi nesne sayıları kısıtlanabilir. Bir namespace kotası dolduğunda, yeni kaynak talepleri API sunucusu tarafından geri çevrilir. Bu mekanizma, bir ekibin tüm kümeyi ele geçirmesini engeller. ResourceQuota kullanırken, quota kapsamındaki her pod'un request ve limit değerlerini açıkça belirtmesi gerekir, aksi halde talep kabul edilmez. Bu nedenle LimitRange ile birlikte kullanmak çoğu zaman ideal yaklaşımdır. Kota değerleri belirlenirken geçmiş tüketim verileri ve büyüme tahminleri esas alınmalıdır. Fazla sıkı kotalar dağıtımları durdurabilir, fazla gevşek kotalar ise amacını yitirir. Ayrıca kota kullanım oranlarının düzenli izlenmesi, sorunların erken tespit edilmesini sağlar. Kurumsal ortamlarda her ekibin kotası, iş birimi bütçesiyle uyumlu hale getirilebilir.


Vertical Pod Autoscaler, pod'ların geçmiş kullanım verilerine dayanarak request ve limit değerlerini otomatik önermesini veya uygulamasını sağlayan bir bileşendir. VPA, öneri modunda çalıştığında yalnızca tavsiyeler üretir ve bunları raporlar, böylece ekipler değişiklikleri kendi onaylarına göre uygulayabilir. Auto moduna geçildiğinde ise VPA, pod'ları yeniden oluşturarak değerleri otomatik olarak günceller. Bu yaklaşım, manuel ayarlama yükünü ciddi biçimde azaltır. Ancak pod yeniden başlatmalarının kesinti yaratabileceği unutulmamalıdır. Bu nedenle kritik iş yüklerinde önce öneri modu ile gözlem yapılması önerilir. VPA ile Horizontal Pod Autoscaler birlikte kullanılacaksa, aynı metrik üzerinde çakışma olmamasına özen gösterilmelidir. VPA önerilerinin, uygulamanın ölçeklenme davranışı ile uyumlu olup olmadığı değerlendirilmelidir. Öneri değerlerinin minimum ve maksimum sınırlarını belirlemek, aşırı sapmaları önler. Düzenli olarak önerileri inceleyen bir süreç kurmak, uzun vadede en verimli sonuçları getirir.


Gerçek kullanım verisine dayalı kaynak ayarı, tahminlere değil ölçümlere dayanan en güvenilir yöntemdir. Prometheus gibi araçlarla toplanan CPU ve bellek metrikleri, uygulamanın gerçek profilini ortaya koyar. Bu veriler, belirli bir zaman aralığında yüzdelik değerler, özellikle p95 ve p99, olarak analiz edildiğinde isabetli sonuçlar verir. Request değeri genellikle ortalama kullanıma yakın, limit değeri ise tepe yüklere uygun seçilmelidir. Bellek limitlerinin, CPU limitlerine göre daha dikkatli ayarlanması gerekir, çünkü bellek aşımı OOMKill ile sonuçlanır. CPU limitlerinin ise bazı durumlarda gereksiz gecikmelere neden olabileceği tartışılmaktadır. Bu nedenle her iş yükü için ayrı bir değerlendirme gerekir. Ölçüm süreci, farklı trafik dönemlerini, örneğin kampanya veya ay sonu yoğunluğunu, kapsayacak şekilde uzatılmalıdır. Elde edilen değerler, deployment sonrası davranışla karşılaştırılarak doğrulanmalıdır. Sürekli iyileştirme döngüsü kurulduğunda, kaynak kullanımı hem performans hem de güvenilirlik açısından dengeli hale gelir.


Kubernetes kaynak kotaları ne şekilde ayarlanır


Kubernetes üretim altyapısında kaynak limitlerini isabetli ayarlamak kararlılık açısından büyük bir öneme sahip unsur üstlenir. İstekler ve sınırlar parametreleri arasında ayrışma net özümsenmeden yapılan ayarlar beklenmedik durumlara neden açar. Kube-scheduler modülü requests tanımlarına göre iş yükü atamasını sağlar. Sınırlar ancak çalıştırma esnasında devreye girer. İlk adım şeklinde bütün uygulama adına test edilmiş değerler saptamak, metrics-server ör. çözümlerle fiili yük kayıtlarını değerlendirmek oldukça güvenilir yöntemdir.


Sıkça karşılaşılan yanlışlar hangileridir


Kaynak konusunda başlıca görülen sorunlardan bir tanesi limitlerin asla ayarlanmamasıdır. Böyle bir tür kümede tek konteyner mevcut düğüm işlemcisini ele geçirebilir ile kalan uygulamaları olumsuz etkileyebilir. Bir diğer tipik hata de istek miktarlarını fazla düşük tutmaktır. Bunun sonucunda koşulda pod makineye çok sığdırılır, ve bu disk baskısı hem de bellek yetersizliği durumlarına sebep yol açabilir. Son sorun ise bütün uygulamalara aynı değerleri uygulamak. Her bir servisin farklı kaynak ihtiyacı özelliği göz önüne alınmadan dikkate alınmalıdır.


Deneyimli öneriler ve kota ayarı

Alanında uzman yöneticiler çoğu zaman kota bağlamında şu metodu tercih eder: Önce trafik testleri çalıştırılır ardından alınan ölçümler ölçüsünde istek tanımları ortalama yükün az üzerine yerleştirilir. Limits tanımları ise yoğun kullanımı yeterli olacak biçimde tanımlanmalıdır. İşlemci açısından sınır koymak kimi zaman yersiz sınırlamalara kapı açabildiğinden özenli davranılmalıdır. Otomatik dikey ölçekleyici ile Horizontal Pod Autoscaler benzeri mekanizmalar dahi bu sürecte kotaların ilerleyen dönemde optimize hale getirilmesinde işe yarar sonuç verir.


Kaynak yönetimi bütçesi hem de ücret yönetimi


Kubernetes altyapısında sınır tanımları bizzat cloud faturasına yansır. Olması gerekenden yüksek kota atanmış bir çeşit cluster boşta kalan atıl kaynağa para ödenmesine neden doğurur. Bu olgu nedenle ekip bütçe hedeflerini somut surette belirlemeli hem de kaynak belirlemelerini bu öngörülerle tutarlı konuma getirmeli. Masraf takip araçları ve namespace ölçeğinde dökümleme gerçekleştirmek ise hangi tür bileşenin ne kapasite harcadığını görmeyi sağlar.


Mevsimsel trafik ve takvim yaklaşımları


Bir çok kurum içi servis zaman süresince düzensiz bir talep davranışına göre şekillenir. Satış aralıkları, ödeme zamanları ile dönemsel programlar süresince kaynak öngörüleri baştan öngörülmelidir. Bu aralıklar adına kalıcı kotalar yerine olarak planlanmış büyütme yöntemleri kullanmak gideri kayda değer boyutta hafifletebilir. Takvim tabanlı işleri ile eşdeğer sistemler üzerinden sabah erken dönemlerinde düşük güce değişim gerçekleştirmek de ek olarak başarım ile birlikte bütçe noktasında önemli faydalar doğurabilir.


Sık yöneltilen soru-cevap ile cevapları

K8s kaynak meselesinde en çok soru yöneltilen konulardan ilk sırada istek hem de sınırlar rakamlarının eşit tutulması tutulmayacağıdır. Böyle bir yaklaşım Guaranteed servis sınıfı kategorisini oluşturur, ama kaynak kullanımı esnekliğini azaltır ciddi ölçüde azaltabilir. Diğer bir öteki merak ayrıca tavan kotaya dayanıldığında hangi olduğudur. Bellek alanı limiti aşıldığında konteyner çoğu zaman zorla sonlandırılma kaderine girer, CPU tavanı tükendiğinde ise konteyner kısıtlanır lakin sıklıkla durdurulmaz. Bu bu yüzden bellek tavanlarının özenle belirlenmesi zorunludur.

Yanıtla
gaye.aydin Member
10-28-2026, 07:56 AM
Kaliteli bir kaynak. Yarin hemen deniyorum.
Yanıtla
ekrem_cetin11 Member
10-28-2026, 08:21 AM
Bu konuda daha once hic bu kadar ise yarar bir tecrube okumamistim.
Yanıtla
hulya.kara Member
10-28-2026, 09:22 AM
Onemli bir detay.
Yanıtla
nuri_h6 Member
10-28-2026, 09:26 AM
Gayet guzel bir paylasim, yerinde bir calisma.
Yanıtla
aylin_durmaz444 Member
10-28-2026, 09:33 AM
Emegi belli. Gec kaldim ama olsun, isime yaradi.
Yanıtla
star95 Member
10-28-2026, 10:33 AM
Bu konuda daha once hic bu kadar bilgilendirici bir arsiv okumamistim.
Yanıtla

Forumdan Konular