Fedora Donma Sorunu Çözümü: zram + Disk Swap + earlyoom
Fedora 44 ağır yük altında tamamen donuyor, kapatmadan düzelmiyordu. Kök nedenini (zram-only, diskte swap yok) nasıl bulup kalıcı olarak çözdüğümü adım adım komutlarla anlatıyorum.
Fedora yüklü dizüstümde bir süredir uğraştığım bir sorun vardı: bilgisayarım ağır yük altında tamamen donuyor, hiçbir tuşa yanıt vermiyor, mecburen güç düğmesine basılı tutup kapatmak zorunda kalıyordum. Bu yazıda bu donma sorununu nasıl teşhis ettiğimi ve kalıcı olarak nasıl çözdüğümü, kullandığım komutları tek tek göstererek anlatıyorum. Aynı sorunu yaşayan olursa birebir uygulayabilir.
Sistemim / Test Ortamı#
Önce hangi donanım ve yazılımda çalıştığımı paylaşayım, çünkü çözümün ayrıntıları buna göre değişebiliyor:
| Bileşen | Değer |
|---|---|
| Model | ASUS Zenbook 14 OLED (UX3405CA) |
| İşlemci | Intel Core Ultra 9 285H (16 çekirdek) |
| RAM | 32 GB (LPDDR5) |
| Depolama | NVMe SSD |
| İşletim Sistemi | Fedora Linux 44 (KDE Plasma Desktop) |
| Çekirdek (Kernel) | 7.1.3-200.fc44.x86_64 |
| Oturum | Wayland |
| Dosya Sistemi | btrfs (LUKS şifreli) |
Not: Komutların çoğu tüm Fedora sürümlerinde (ve büyük ölçüde diğer Linux dağıtımlarında) çalışır. Ama dosya sistemi btrfs olduğu için swap dosyası oluştururken buna özel bir yöntem kullandım; ext4 kullanıyorsanız o kısım daha basit.
Sorun tam olarak neydi?#
Belirti şuydu: Aynı anda birden fazla ağır uygulama çalıştırdığımda (benim durumumda bir Android ortamı + Android Studio + çok sekmeli tarayıcı + arka planda başka araçlar) sistem önce yavaşlıyor, sonra tamamen kilitleniyordu. Fare bile kıpırdamıyordu. Beklemek çözmüyordu; tek çare güç düğmesiydi.
İlk başta “donanım mı bozuk, ısınma mı var” diye düşündüm. Ama tahmin yürütmek yerine sistemin kendi günlüklerine (log) bakmaya karar verdim — çünkü Linux, donduğu anı zaten oraya yazıyor.
Adım 1: Kök nedeni bulmak (donma anının loglarını okumak)#
Linux, çöktüğü ya da donduğu anı çekirdek günlüklerine yazar. Bir önceki oturumun (yani donduğum oturumun) son satırlarına şöyle baktım:
# Bir önceki açılışın (-b -1) son 40 satırı
sudo journalctl -b -1 -n 40 --no-pager
Bellek tükenmesi (OOM = Out Of Memory) izi olup olmadığını da özel olarak aradım:
# Bir önceki açılışta "oom-killer" tetiklenmiş mi?
sudo journalctl -b -1 --no-pager | grep -iE 'out of memory|oom-kill|killed process'
Çıkan sonuç her şeyi açıkladı. Loglarda şu satırlar vardı:
Free swap = 148kB
Total swap = 8388604kB
systemd-oomd invoked oom-killer
Yani 8 GB’lık swap alanımın neredeyse tamamı (sadece 148 KB kalmış) dolmuştu ve RAM de bitmişti. Sistem, bellek bulmaya çalışırken kilitlenmişti. Donmanın sebebi donanım değil, bellek yönetimiydi.
Adım 2: Hangi swap’i kullanıyorum? (zram kontrolü)#
Burada işin püf noktası ortaya çıktı. Fedora’nın varsayılan olarak zram kullandığını aslında zaten biliyordum — ama “biliyorum” ile “kontrol edip gördüm” arasında fark var. Hem kendim emin olmak, hem de aynı sorunu yaşayan birinin kendi sisteminde nasıl bakacağını göstermek için her adımı komutuyla anlatıyorum. Peki “8 GB swap” nerede — diskte mi, RAM’de mi? Şu komutla kontrol ettim:
# Aktif swap alanlarını ve türlerini göster
swapon --show
Çıktı şuydu:
NAME TYPE SIZE USED PRIO
/dev/zram0 partition 8G ... 100
Yani swap’imin tamamı zram’dı. Peki zram nedir?
zram nedir? RAM’in bir kısmını ayırıp orada sıkıştırılmış bir swap alanı oluşturan bir çekirdek modülüdür. Diske göre çok hızlıdır çünkü fiziksel olarak RAM’dedir. Fedora, 33 sürümünden (2020) beri yeni kurulumlarda swap’i disk yerine varsayılan olarak zram’da oluşturuyor; Fedora 34’te bu alanın boyutu RAM’in yarısına (en fazla 8 GB) çıkarıldı — sistemimdeki 8 GB’lık zram tam da bu varsayılanın sonucu.
zram’ın detayına şu komutla bakabilirsiniz:
# zram cihazının boyutu, algoritması, sıkıştırma oranı
zramctl
İşte sorunun kökü buradaydı: Benim swap’im %100 zram idi, yani RAM’in içindeydi. Diskte hiç swap yoktu. Bu şu demek: RAM dolunca, zram da (o da RAM’de olduğu için) doluyor ve verinin kaçacağı hiçbir yer kalmıyordu. Sistem de bu noktada çakılıyordu.
Sorunun özü buydu: diskte bir emniyet ağı olmadan çalışmak. Diskte swap bulunan bir sistemde RAM dolunca fazlalık diske taşar; sistem yavaşlar ama yaşamaya devam eder, donmaz. Bende ise swap tamamen zram olduğu, yani diskte hiç swap bulunmadığı için o emniyet ağı yoktu.
Çözüm planı#
Araştırınca bunun çok bilinen bir Fedora davranışı olduğunu gördüm. Çözüm için üç katmanlı bir plan kurdum:
- Diske swap dosyası eklemek — asıl emniyet ağı (Windows’un pagefile’ı gibi).
- zram’ı biraz büyütmek — hızlı katmanı genişletmek (8 GB → 12 GB).
- earlyoom kurmak — sistem tamamen donmadan, en obur süreci otomatik kapatan bir koruma.
Mantık şu: RAM dolunca önce hızlı zram kullanılsın, o da dolunca fazlalık diske aksın, en kötü ihtimalde de earlyoom devreye girip sistemi kurtarsın.
Adım 3: Diske swap dosyası eklemek (asıl çözüm)#
Dosya sistemim btrfs olduğu için swap dosyasını rastgele oluşturamıyorsunuz; btrfs, swap dosyasının CoW kapalı (NOCOW), sıkıştırmasız ve deliksiz olmasını şart koşuyor. Neyse ki modern btrfs araçlarında bunu otomatik yapan bir komut var. 16 GB’lık bir swap dosyası oluşturdum:
# 1) Swap için ayrı bir subvolume (snapshot'lardan izole olsun diye)
sudo btrfs subvolume create /var/swap
# 2) 16 GB swap dosyası — NOCOW/sıkıştırma ayarlarını otomatik yapar
sudo btrfs filesystem mkswapfile --size 16g /var/swap/swapfile
# 3) Swap'i etkinleştir — öncelik 10 (zram'ın 100'ünden DÜŞÜK olmalı)
sudo swapon /var/swap/swapfile --priority 10
Önemli kural — öncelik (priority): Linux’ta yüksek öncelik önce kullanılır. zram’ın önceliği 100. Disk swap’e bilerek 10 verdim ki zram dolmadan diske düşülmesin. Yani hız için önce RAM, emniyet için sonra disk.
Kalıcı olması (her açılışta otomatik gelmesi) için /etc/fstab’a ekledim:
# fstab'a kalıcı satır ekle
echo '/var/swap/swapfile none swap defaults,pri=10 0 0' | sudo tee -a /etc/fstab
Kontrol ettim:
swapon --show
NAME TYPE SIZE USED PRIO
/dev/zram0 partition 8G ... 100
/var/swap/swapfile file 16G 0B 10
Artık toplam swap 8 GB’dan 24 GB’a çıkmıştı ve en önemlisi, RAM dolunca gidecek bir disk emniyeti vardı.
ext4 kullanıyorsanız#
Sizin diskiniz btrfs değilse işlem daha basit:
sudo fallocate -l 16G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile --priority 10
echo '/swapfile none swap defaults,pri=10 0 0' | sudo tee -a /etc/fstab
Adım 4: zram tavanını yükseltmek (8 GB → 12 GB)#
Fedora’nın varsayılan zram ayarı min(ram, 8192), yani 32 GB RAM’im olmasına rağmen zram’ı 8 GB’la sınırlıyordu. Hızlı katmanı biraz genişletmek için bunu 12 GB yaptım:
# zram-generator ayar dosyasını oluştur/güncelle
sudo tee /etc/systemd/zram-generator.conf <<'EOF'
[zram0]
zram-size = min(ram, 12288)
EOF
Bir de açılışta zram modülünün garanti yüklenmesi için şunu ekledim:
echo zram | sudo tee /etc/modules-load.d/zram.conf
Burada bir hata yaptım (dürüst not)#
Bu ayarı, bilgisayarı yeniden başlatmadan hemen devreye almak istedim:
sudo systemctl restart systemd-zram-setup@zram0.service
Ama komut hata verdi. Biraz uğraştıktan sonra sebebini anladım: zram-generator, sistem çalışırken anında değiştirilecek şekilde değil, yalnızca bilgisayar açılırken devreye girecek şekilde tasarlanmış. Boyut değişikliğini uygulamanın temiz yolu ya zram modülünü elle kaldırıp yeniden yüklemek ya da bilgisayarı yeniden başlatmaktı. Ben en temizini seçtim: ayarları yazdım ve yeniden başlatmayı en sona bıraktım. Kısacası her komut ilk denemede çalışmadı; doğrusunu denerken öğrendim.
Adım 5: earlyoom ile son emniyet#
Disk swap donmayı çözer ama ben bir kat daha güvence istedim. earlyoom, bellek kritik seviyeye inmeden en obur süreci otomatik kapatan küçük bir servis:
# earlyoom kur ve açılışta otomatik başlat
sudo dnf install -y earlyoom
sudo systemctl enable --now earlyoom
Fedora’nın hazır ayarlarıyla geliyor ve güzel yanı: kritik sistem süreçlerini (masaüstü, systemd, cryptsetup vb.) asla öldürmüyor, önce tarayıcı sekmeleri gibi büyük ve feda edilebilir süreçleri hedefliyor.
Adım 6: Değişiklikten sonra kontrol (en kritik aşama)#
Ayarları yapmak yetmez; gerçekten uygulandığından emin olmak lazım. Önce sistemi yeniden başlattım, çünkü asıl soru şuydu: “Bu ayarlar açılışta otomatik gelecek mi?”
Yeniden başlattıktan sonra tek komutla baktım:
swapon --show
NAME TYPE SIZE USED PRIO
/dev/zram0 partition 12G 0B 100
/var/swap/swapfile file 16G 0B 10
İşte kanıt: zram 12 GB olarak otomatik geldi ve disk swap de aktifti. Toplam 27 GB swap. Koruma servislerini de doğruladım:
systemctl is-active earlyoom systemd-oomd
free -h
Kurulumun doğruluğunu denetlemek#
Paranoyak biri olarak, btrfs swap dosyasının gerçekten kurallara uyduğunu da kontrol ettim. En önemlisi NOCOW bayrağı:
# 'C' harfini görmemiz gerekiyor (btrfs swap için zorunlu)
sudo lsattr /var/swap/swapfile
---------------C------ /var/swap/swapfile
C bayrağı vardı, yani NOCOW doğru ayarlanmış. Aslında en güçlü kanıt şu: btrfs çekirdeği çok katıdır — CoW’lu, sıkıştırılmış ya da delikli bir dosyayı swap olarak açmayı reddeder. Dosya swapon --show çıktısında aktif göründüğüne göre, çekirdek zaten tüm bu denetimlerden geçirmiş demektir.
Sonuç: Artık donmuyor#
Bu üç katmanlı kurulumdan sonra sistem, ağır yük altında donup güç düğmesine basmamı gerektirmek yerine kısa süre yavaşlıyor, sonra kendine geliyor. Özetle yaptığım şey:
- 16 GB disk swap ekledim → RAM dolunca taşma yeri (asıl çözüm).
- zram’ı 12 GB’a çıkardım → daha geniş hızlı katman.
- earlyoom kurdum → son emniyet freni.
- Toplam swap 8 GB → 27 GB oldu ve hepsi kalıcı.
Hızlı kontrol komutları (özet)#
Aynı sorunu yaşıyorsanız, önce durumunuza bakın:
swapon --show # Swap diskte mi, zram'da mı?
zramctl # zram detayları
free -h # RAM ve swap kullanımı
sudo journalctl -b -1 | grep -i oom-kill # Donma anında OOM var mıydı?
Eğer swap’iniz tamamen zram ise ve diskte hiç swap yoksa, büyük ihtimalle benimle aynı sorunu yaşıyorsunuz. Yukarıdaki adımlar işinizi görecektir.
Bu yazı, kendi başımdan geçen gerçek bir sorunu ve uyguladığım çözümü anlatıyor. Buradaki komutlar benim sistemimde işe yaradı, ama her sistem farklıdır. Uygulamadan önce önemli verilerinizi yedekleyin ve komutları kendi sisteminize göre (özellikle dosya sistemi farklıysa) uyarlayın.
Önemli: Yapacağınız tüm işlemler tamamen kendi sorumluluğunuzdadır. Bu adımları uygularken oluşabilecek veri kaybı, sistem arızası veya başka herhangi bir zarardan sorumlu değilim. Bir komutun ne yaptığından emin değilseniz, uygulamadan önce mutlaka araştırın ve elinizde güncel bir yedek olduğundan emin olun.