Linux Bellek Yönetimi: Swap, OOM Killer & Cgroups
12 dakikalık okuma - 31 Mayıs 2026

Linux swap, OOM killer ve cgroups birlikte nasıl çalışır - veritabanları, web sunucuları ve çok kiracılı VPS ana bilgisayarları için yapılandırma örnekleri ile.
Linux bellek yönetimi açıklaması: swap, OOM killer ve cgroups
Linux, belleği çoğu işletim sisteminden farklı bir şekilde yönetir. Yüksek RAM kullanımı her zaman bir sorun değildir — çekirdek, disk okuma hızını artırmak için boş belleği önbellekleme amacıyla aktif olarak kullanır. Ancak gerçek bellek baskısı oluştuğunda, üç mekanizma devreye girer: swap, OOM killer ve cgroups. Her birinin nasıl davrandığını ve nasıl yapılandırılacağını anlamak, yük altında sorunsuz bir şekilde performansını düşüren bir sunucu ile uyarı vermeden çöken bir sunucu arasındaki farkı belirler.
Linux'un bellek sayfalarını yönetme şekli
Her işlem, 64 bit sistemlerde 128 TB'a kadar kendi sanal adres alanında çalışır. Çekirdek, bu sanal adresleri sayfa tabloları aracılığıyla fiziksel RAM'e eşler ve Translation Lookaside Buffer (TLB) son aramaları önbelleğe alır. Bir TLB isabeti yaklaşık 1 nanosaniye sürer; bir ıskalama ise 20–100 nanosaniyeye mal olur ve bu, veritabanları gibi bellek yoğun iş yüklerinde önemli bir süreye denk gelir.
Fiziksel bellek 4 KB'lık sayfalara bölünür ve çekirdek bunları iki kategoriye ayırır:
- Dosya destekli sayfalar — diskteki dosyalara bağlıdır. Çekirdek, temiz olanları atabilir veya kirli olanları takas yapmaya gerek kalmadan boşaltabilir.
- Anonim sayfalar — destek dosyası olmayan yığın ve yığın belleği. Çekirdek bunları serbest bırakmadan önce bunların takas alanına yazılması gerekir.
Bellek talebinin yüksek olduğu sunucularda, anonim sayfaların oranının yüksek olması, takasın erken devreye girmesine neden olur. si (swap in) ve so (swap out) sütunlarını vmstat 1 — sıfırdan farklı kalıcı değerler, sistemin baskı altında olduğuna dair ilk uyarıdır.
İzleme için, iş için doğru aracı kullanın:
| Araç | En uygun olduğu durum | Anahtar metrik |
|---|---|---|
free -h | Hızlı sistem genelinde anlık görüntü | available sütunu |
vmstat 1 | Gerçek zamanlı takas ve I/O izleme | si, so |
htop | İşlem başına etkileşimli görünüm | Bellek çubukları, işlem listesi |
smem | İşlem başına doğru kullanım | USS (Benzersiz Küme Boyutu) |
/proc/meminfo | Çekirdek düzeyinde ayrıntılar | MemAvailable, Dirty, Slab |
Yaygın bir hata: free sütunu izlemek free -h sütununu izlemek ve paniğe kapılmaktır. available sütun önemlidir. Bu sütun, çekirdeğin talep üzerine önbellekten geri kazanabileceği belleği içerir. Yalnızca 512 MB boş ama 5 GB kullanılabilir alan gösteren bir sunucuda sorun yoktur.
Bellek bir eşik değerin altına düştüğünde, çekirdeğin kswapd daemon arka planda sayfaları geri kazanmaya başlar. Bu yeterli olmazsa, çekirdek doğrudan geri kazanım moduna geçer ve sayfalar serbest kalana kadar işlemleri engeller. Gecikme artışlarının kaynağı budur. MemAvailable toplam RAM'in %10–15'inin altına düştüğünde bir uyarı ayarlayın, böylece müdahale etmek için zamanınız olur.
Swap yapılandırma
Swap, RAM dolduğunda çekirdeğin etkin olmayan anonim sayfaları taşıdığı bir disk alanıdır (bir bölüm veya dosya olabilir). Hız farkı önemlidir: DDR4 RAM'in gecikme süresi yaklaşık 100 ns iken, NVMe SSD'lerde bu süre 100.000 ns civarında ve SATA SSD'lerde 500.000 ns'ye yakındır. Takas alanı, ekstra RAM değil, bir güvenlik tamponudur. Sürekli takas alanına güvenen bir sunucuda, daha fazla takas alanı ile çözülemeyecek bir bellek sorunu vardır.
Bölüm yerine bir takas dosyası kullanın. Boyutunu değiştirmek daha kolaydır ve yeniden bölümleme gerektirmez.
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfileDosyayı /etc/fstab yeniden başlatmalarda kalıcı olması için. chmod 600 adım gereklidir — RAM'den sayfalara ayrılan tüm veriler takas alanından okunabilir, bu nedenle dosya herkes tarafından okunabilir olmamalıdır.
Swap'ı oluşturduktan sonra, vm.swappiness. Varsayılan değer olan 60, agresiftir. Çoğu barındırma iş yükü için çekirdeğin RAM'i tercih etmesini ve takas dosyasını yalnızca son çare olarak kullanmasını istersiniz:
| Sunucu rolü | vm.swappiness | vm.vfs_cache_pressure |
|---|---|---|
| Genel web sunucusu | 10–20 | 50 |
| Veritabanı (MySQL/PostgreSQL) | 1–5 | 50 |
| Varsayılan (çoğu dağıtım) | 60 | 100 |
Takas alanı boyutlandırması için: Ara sıra trafik artışları yaşayan 2 GB'lık bir VPS için 1–2 GB yeterlidir. 8 GB veya daha fazla belleğe sahip sistemlerde, genellikle sabit 2–4 GB'lık bir takas alanı yeterlidir. Amaç, toplam adreslenebilir belleği genişletmek değil, çekirdeğe soğuk sayfalar için bir basınç valfi sağlamaktır.
Yeterli CPU'ya sahip ancak RAM'i kısıtlı sunucularda, zram bellekte sıkıştırılmış bir takas alanı oluşturarak disk I/O'sunu tamamen ortadan kaldırır. NVMe'nin kiracılar arasında paylaşıldığı çok kiracılı VPS barındırma hizmetlerinde bu seçeneği dikkate almaya değer. Takas alanı veritabanı dosyalarıyla aynı aygıtta bulunuyorsa I/O çekişmesine dikkat edin — yoğun takas ve yüksek verimli disk yazma işlemleri birbiriyle uyumlu değildir.
OOM killer
Çekirdek RAM ve takas alanını tüketip başka yollarla yeterli bellek geri kazanamadığında, OOM katili devreye girer. oom_badness() işlevi kullanarak süreçleri puanlar:
points = (rss_anon + rss_file + rss_shmem + swapents + pgtables_pages) + (oom_score_adj × totalpages / 1000)En yüksek puanı alan işlem sonlandırılır. Formül, büyük bellek tüketicilerini öncelikli olarak değerlendirir ve çekirdek, bir işlemin son 5 saniye içinde sonlandırılıp sonlandırılmadığını kontrol ederek, arka arkaya birden fazla işlemi sonlandırmaktan kaçınır.
Günlüklerde iki tür OOM olayı görünür:
- Global OOM — tüm sistemde RAM ve takas alanı tükenmiştir. Günlüklerde
Out of memory: - Cgroup OOM — bir konteyner veya hizmet
memory.maxsınırına ulaşmıştır. Günlüklerin başındaMemory cgroup out of memory:
Geçmiş OOM olaylarını incelemek için:
dmesg -T | grep -i "out of memory"
journalctl -k --grep="oom"OOM günlüklerindeki order alanına dikkat edin. 0'ın üzerindeki bir değer, belleğin tamamen tükenmesinden ziyade bellek parçalanmasına işaret eder — çekirdek, kullanılabilir boş bellek olmasına rağmen yeterli sayıda bitişik sayfa bulamamıştır.
OOM katilinin hangi işlemleri hedefleyeceğini /proc/<pid>/oom_score_adj. Aralık -1000 (asla sonlandırma) ile +1000 (önce sonlandırma) arasındadır. systemd tarafından yönetilen hizmetler için, bunu birim dosyasında kalıcı olarak ayarlayın:
[Service]
OOMScoreAdjust=-1000OOM davranışını ayarlamak için ek sysctl parametreleri:
| Parametre | Değer | Etki |
|---|---|---|
vm.overcommit_memory | 0 | Varsayılan sezgisel aşırı taahhüt modu |
vm.overcommit_memory | 2 | Sıkı mod; RAM × overcommit_ratio + swap değerini aşan tahsisleri engeller |
vm.panic_on_oom | 1 | İşlemi sonlandırmak yerine yeniden başlatır |
vm.oom_kill_allocating_task | 1 | En fazla kaynak tüketen işlem yerine, OOM'u tetikleyen işlemi sonlandırır |
Proaktif izleme için /proc/pressure/memory (Basınç Durması Bilgisi, çekirdek 4.20'den itibaren kullanılabilir). some avg10 değeri izleyin: %5'in altında olması sağlıklıdır, %20'nin üzerinde kalması ise bir OOM olayının muhtemelen yaklaştığı anlamına gelir. Artan allocstall sayaç /proc/vmstat başka bir erken sinyaldir — genellikle OOM sonlandırmalarından önce gelen doğrudan geri kazanım duraklamalarını sayar. systemd-oomd veya earlyoom gibi araçlar, çekirdeğin OOM katili devreye girmeden önce PSI eşiklerine göre harekete geçebilir.
Cgroups ve bellek sınırları
Kontrol grupları (cgroups), işlemleri gruplar halinde düzenlemenizi ve katı kaynak sınırlamaları uygulamanızı sağlar. Linux 2.6.24 sürümünde tanıtılan bu gruplar, Docker, Podman, Kubernetes ve LXC dahil olmak üzere konteyner çalışma zamanlarının temelini oluşturur. Çekirdek, anonim bellek, dosya destekli sayfalar ve çekirdek nesnelerini kapsayan cgroup başına bellek kullanımını izler. Bir cgroup sınırına ulaşırsa, çekirdek o grup içindeki belleği geri kazanır veya cgroup kapsamlı bir OOM kill işlemini tetikler.
Cgroup v1 ve v2, temel olarak yapıları bakımından farklılık gösterir. V1, her denetleyiciyi (bellek, CPU, I/O) ayrı ayrı /sys/fs/cgroup/<controller>/altında ayrı ayrı bağlar, bu da tutarsız kaynak izlemesine yol açar. V2, /sys/fs/cgroup/kullanır. Kubernetes, 1.25 sürümünde varsayılan olarak v2'ye geçti ve 1.31 sürümünde v1 desteğini kaldırdı.
Sisteminizin hangi sürümü kullandığını kontrol etmek için:
stat -fc %T /sys/fs/cgroup/cgroup2fs v2 anlamına gelir; tmpfs genellikle v1 anlamına gelir.
| Özellik | Cgroup v1 | Cgroup v2 |
|---|---|---|
| Hiyerarşi | Çoklu, denetleyici başına | Tek, birleştirilmiş |
| Sabit bellek sınırı | memory.limit_in_bytes | memory.max |
| Yumuşak bellek sınırı | memory.soft_limit_in_bytes | memory.high (kısıtlamalar) |
| Kullanım izleme | memory.usage_in_bytes | memory.current |
| Basınç ölçümleri | Sınırlı | PSI entegre |
cgroup v2'deki temel bellek denetimleri:
| Parametre | Tür | Açıklama |
|---|---|---|
memory.max | Sert sınır | Bu sınırın aşılması OOM killer'ı tetikler |
memory.high | Yumuşak sınır | Sert sınıra ulaşmadan önce tahsisi kısıtlar ve geri kazanımı tetikler |
memory.low | Yumuşak koruma | Bu eşiğin altındaki bellek en son geri kazanılır |
memory.min | Sert koruma | Bu seviyenin altındaki bellek asla geri kazanılmaz |
memory.swap.max | Takas sınırı | Bu cgroup için takas özelliğini devre dışı bırakmak için 0 olarak ayarlayın |
memory.oom.group | Boolean | Etkinleştirilirse, OOM cgroup'taki tüm işlemleri bir arada sonlandırır |
Pratik bir kural: memory.high %10–20 civarında memory.max ayarlayın, böylece çekirdeğin sert sınıra ulaşmadan önce geri kazanım yapması için yer açılır. memory.max, cgroup bellek toplamlarına dahil edilen sayfa önbelleğini hesaba katmak için uygulamanın en yüksek kullanımının %20–30 üzerinde bir değer ekleyin.
cgroup dosya sistemine doğrudan yazmak yerine, cgroup'ları systemd aracılığıyla yönetin. MemoryMax=, MemoryHigh=ve MemoryMin= kullanarak kalıcı sınırlar belirleyin. Hızlı testler için:
systemd-run --scope -p MemoryMax=512M <command>Web sunucusu işçi havuzları için memory.oom.group=1 ayarı, bir işçi sınırını aşarsa temiz bir sonlandırma sağlar — geride yetim süreçler kalmaz. Veritabanı motorları için memory.min , sistem genelindeki yük altında tampon havuzunun geri kazanılmasını önler.
Sunucu rolüne göre bellek yapılandırması
Doğru bellek ayarları, sunucunun ne yaptığına bağlıdır. Aynı yapılandırmayı bir veritabanına ve bir PHP web sunucusuna uygulamak, bunlardan birine zarar verecektir.
| Sunucu rolü | vm.swappiness | OOM stratejisi | Cgroup politikası |
|---|---|---|---|
| Veritabanı | 1–5 | Koruma (OOMScoreAdjust=-900) | Kullan memory.min tampon havuzunu korumak için |
| Web/uygulama sunucusu | 10–20 | Varsayılan | İşçi havuzu başına sınır memory.max |
| Arka plan işleyicisi | 60 | Sonlandırılabilir (OOMScoreAdjust=+200) | Kısıtlama yoluyla memory.high |
| Çok kiracılı VPS | 60 (zram ile) | Varsayılan | Kullanıcı başına sabit izolasyon memory.max |
MySQL ve PostgreSQL için, kullanılabilir RAM'in %50–70'ini innodb_buffer_pool_size, gecikme artışlarını azaltmak için Şeffaf Büyük Sayfaları devre dışı bırakın ve OOMScoreAdjust=-900 ile koruyun.
PHP-FPM için, işçi havuzlarının boyutunu gerçek bellek kullanımına göre ayarlayın. Her işçi genellikle 30–100 MB kullanır. Güvenli bir pm.max_children değer elde etmek için ayrılan RAM'i ortalama işçi boyutuna bölün. Havuzu sınırlamak için memory.max cgroups'ta havuzu sınırlamak için kullanın.
Yazma yoğun iş yükleri için vm.dirty_ratio değerini yaklaşık %10 ve vm.dirty_background_ratio değeri %3 olarak ayarlayın. Bu, kirli sayfaları daha sık boşaltarak büyük I/O duraklamalarını önler.
Parametreleri /etc/sysctl.d/90-memory.conf. Çalışma zamanında uygulanan ayarlar, yeniden başlatma sırasında kaybolur.
Rol bazında önerilen değerlerin özeti için:
| Parametre | Web/uygulama sunucusu | Veritabanı sunucusu |
|---|---|---|
vm.swappiness | 10–20 | 1–5 |
vm.vfs_cache_pressure | 50 | 50 |
vm.dirty_ratio | %15 | %10 |
vm.min_free_kbytes | 65536 | 65536 |
| OOM koruması | Varsayılan | OOMScoreAdjust=-1000 |
Yüksek yoğunluklu iş yükleri çalıştırıyorsanız ve bu ilkeleri düzgün bir şekilde uygulayabilecek kapasiteye sahip bir sunucuya ihtiyacınız varsa, FDC'nin özel sunucularını incelemeye değer.

Linux Bellek Yönetimi: Swap, OOM Killer & Cgroups
Linux swap, OOM killer ve cgroups birlikte nasıl çalışır - veritabanları, web sunucuları ve çok kiracılı VPS ana bilgisayarları için yapılandırma örnekleri ile.
12 dakikalık okuma - 31 Mayıs 2026
Prometheus ve node_exporter kurulum kılavuzu
15 dakikalık okuma - 29 Mayıs 2026

Sorularınız mı var veya özel bir çözüme mi ihtiyacınız var?
Esnek seçenekler
Küresel erişim
Anında dağıtım
Esnek seçenekler
Küresel erişim
Anında dağıtım