NixOS'ta Şifreli Swap Çilesi: 90 Saniyelik Boot Gecikmesi ve Zram Çözümü
NixOS mimarisini güncellerken bazen en küçük güvenlik dokunuşları bile boot sürecini felç edebilir. Son yaptığım değişikliklerde, disk üzerindeki fiziksel swap (takas) alanını şifrelemek amacıyla randomEncryption.enable = true parametresini aktif etmiştim. Teorik olarak her boot’ta rastgele anahtarla şifrelenen güvenli bir swap alanı elde edecektim.
Fakat pratikte işler planlandığı gibi gitmedi. Sistem boot edilirken ekran bir anda donuyor ve dev-mapper servisinin zaman aşımına uğramasını beklemeye başlıyordu.
Hatanın Anatomisi: 90 Saniyelik Devmapper Blokajı
Sistemin açılışındaki bu gizemli yavaşlamayı analiz etmek için systemd-analyze araçlarını çalıştırdım:
systemd-analyze blame | head -5
systemd-analyze critical-chain
Çıkan tablo korkunçtu: graphical.target hedefine ulaşılması tam 1 dakika 33 saniye sürüyordu. journalctl loglarını incelediğimde ise suçlu hemen kendini belli etti:
Timed out waiting for device /dev/mapper/dev-disk-byx2dpartuuid-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Sorun Neydi?
NixOS, hardware.nix içinde tanımladığım /dev/disk/by-partuuid/... adresindeki fiziksel swap alanını (nvme0n1pX) dm-crypt ile şifreli olarak açmaya çalışıyordu. Ancak erken boot (initrd) aşamasında cryptsetup veya aygıt zamanlaması (device timing) uyuşmazlığı nedeniyle bu cihaz hazır hale gelemiyor, systemd ise cihazı mount edebilmek için varsayılan 90 saniyelik zaman aşımı (timeout) süresi boyunca tüm boot sürecini askıya alıyordu.
90 saniye bittiğinde systemd cihazı mount etmekten vazgeçiyor, boot tamamlanıyor ancak masaüstüne ulaşmamız işkenceye dönüşüyordu.
Fiziksel Swap vs. Zram: LLM ve Ollama Perspektifi
Sistemimde 32 GB fiziksel RAM bulunuyor. Bu donanım seviyesinde, özellikle yerel yapay zeka modelleri (Ollama / local LLM) koştururken swap ihtiyacını nasıl yönetmeliydim?
NixOS konfigürasyonumda zaten zram aktifti:
# system.nix içinde zram yapılandırması
zramSwap = {
enable = true;
algorithm = "zstd";
memoryPercent = 100; # RAM boyutuna yakın sanal sıkıştırılmış alan
};
Bu yapılandırma, RAM’in bir kısmını zstd algoritmasıyla sıkıştırarak sanal bir takas (swap) alanı oluşturuyor.
Ollama Performansına Etkisi
Ollama gibi yerel LLM araçları, modelleri öncelikle GPU’nun VRAM’ine yükler. Model katmanları (layer’lar) VRAM kapasitesine göre bölünerek RAM’e offload edilir.
- Eğer sistem RAM’i de dolarsa ve sistem fiziksel disk swap alanına yazmaya başlarsa, NVMe SSD ne kadar hızlı olursa olsun okuma/yazma hızları RAM’in yanına bile yaklaşamayacağı için token üretim hızı (t/s) yerlerde sürünür.
- zram kullanıldığında ise offload edilen veriler disk yerine yine RAM içinde kalarak sıkıştırılır. RAM’den RAM’e sıkıştırma/açma hızı, diske yazmaktan katbekat daha hızlıdır.
Bu senaryoda disk üzerindeki 32 GB’lık fiziksel swap alanı hem boşa yer kaplıyor, hem boot’u 90 saniye geciktiriyor, hem de aktif olduğunda performansı baltalıyordu.
Çözüm: Fiziksel Swap’a Veda
Çözüm son derece basitti: Zram zaten tüm swap görevini üstlendiği için bozuk ve yavaş olan fiziksel swap alanını tamamen devre dışı bırakmak.
hosts/nixos/hardware.nix dosyasındaki şifreli swap tanımını iptal ettim:
# hardware.nix
# Eski şifreli fiziksel swap kaldırıldı, zram yeterli.
swapDevices = [];
Değişikliği sisteme uyguladıktan sonra:
just sync "fix(boot): fiziksel swap kaldirildi — randomEncryption 90s timeout sorunu cozuldu, zram yeterli"
just rebuild
Sonuç
Sistem yeniden başlatıldığında 90 saniyelik devmapper bekleme süresi tamamen ortadan kalktı. Sistem zram sayesinde kararlılığından hiçbir şey kaybetmeden, saniyeler içinde doğrudan masaüstüne ulaşabilir hale geldi.
Bazen en iyi optimizasyon, sisteme yeni bir şey eklemek değil, artık gereksizleşen eski yükleri deklaratif olarak söküp atmaktır.
Kaynaklar
- NixOS Options Search — swapDevices.randomEncryption
- NixOS Options Search — zramSwap
- NixOS Manual — Swap Devices
İlgili:
- NixOS 26.05: Systemd-initrd ve Impermanence Mimarisine Geçiş
- NixOS: Siber-Kalkan, pnpm Göçü ve Sıfır Entropi Mimarisi