Linux Control Groups (Cgroups) ile Kaynak Yönetimi
Süreçlerin işlemci, bellek ve ağ kullanımlarını donanım seviyesinde kısıtlamayı sağlayan ve Docker'ın temelini oluşturan Linux cgroups mimarisi.
Genel Bakış
Linux Control Groups (Cgroups), işletim sistemi çekirdeğinin süreçlere (processes) sunucu kaynaklarını (CPU, RAM, Disk I/O, Ağ) tahsis etmesini, sınırlamasını ve izlemesini sağlayan devrim niteliğinde bir özelliktir. Docker ve Kubernetes gibi tüm konteyner teknolojilerinin temel yapı taşıdır.
Sorun
Paylaşımlı bir Linux sunucusunda (örneğin bir üniversite veya hosting ortamı) birden fazla uygulama çalıştırıyorsunuz. Eğer uygulamalardan biri, içindeki kötü yazılmış bir döngü veya anlık yoğun trafik nedeniyle sunucunun %100 CPU'sunu ve RAM'ini tüketmeye başlarsa (Noisy Neighbor problemi), sunucudaki diğer tüm uygulamalar çöker. Geleneksel nice komutu sadece CPU önceliği belirler, ancak mutlak bir sınır çizemez ve RAM tüketimini engelleyemez.
Çözüm: Cgroups Katmanları
Cgroups kullanarak işletim sistemine şu talimatı verebilirsiniz: "Veritabanı süreci (PID 1200) asla toplam CPU kapasitesinin %30'unu ve RAM'in 2 GB'ını geçemez."
Örnek Manuel Sınırlandırma:
# Yeni bir cgroup oluştur
mkdir /sys/fs/cgroup/memory/veritabani_limit
# RAM sınırını 1 GB (Bayt cinsinden) olarak ayarla
echo 1073741824 > /sys/fs/cgroup/memory/veritabani_limit/memory.limit_in_bytes
# Süreci (PID) bu gruba dahil et
echo 1200 > /sys/fs/cgroup/memory/veritabani_limit/tasks
Teknik Detaylar
Cgroups mimarisi, izole edilmiş süreçleri hiyerarşik ağaçlar şeklinde yönetir. Eğer bir süreç kendisine atanan bellek sınırını (memory.limit_in_bytes) aşmaya çalışırsa, Linux çekirdeğinin OOM (Out of Memory) Killer mekanizması devreye girer ve tüm sunucuyu kurtarmak için o spesifik süreci acımasızca "Killed (OOM)" komutuyla öldürür. Cgroups V2 (Unified Hierarchy), tüm denetleyicileri (CPU, IO, Memory) tek bir ağaç altında toplayarak daha güvenli ve tutarlı bir kaynak yönetimi sunmuştur.
Sonuç
Cgroups, Linux'un çok kiracılı (multi-tenant) ortamlarda kaynakları adil ve kesin çizgilerle dağıtmasını sağlar. Geliştiriciler cgroups kurallarını manuel yazmak yerine, bu işlemi arka planda şeffaf bir şekilde gerçekleştiren Docker, Podman veya Systemd gibi araçları kullanmayı tercih ederler.