· kaynak Hacker News – Front Page (native)
NixOS, ayrıntılı LowEndSpirit rehberiyle 96MB boşta çalışacak ve 512MB içinde yeniden derlenecek şekilde ayarlandı
LowEndSpirit'de yayımlanan bir yazı, kernel ayarları, modül budama ve zram kullanılarak NixOS 26.05'in 288MB'lık boşta bellek kullanımının ve 896MB'lık yeniden derleme ihtiyacının nasıl 96MB boşta kullanımına ve 371MB'lık yeniden derleme zirvesine düşürüldüğünü ele alıyor.
Hacker News ana sayfasına kadar yükselen LowEndSpirit forumundaki bir yazı, NixOS 26.05'i 96MB RAM ile boşta çalışacak ve 512MB'lık bir VPS üzerinde kendini yeniden derleyebilecek şekilde küçültme sürecini adım adım anlatıyor. İş için yarım gün ayıran yazar, işin üç güne yakın sürdüğünü ve rehberin planlanmış bir makaleden çok çalışma notlarından doğduğunu belirtiyor.
Sistemin başlangıç noktası
Gönderiye göre, standart bir cloud-init kurulumu 1024MB RAM ile ancak çalışıyor, 288MB kullanılmış durumda ve 89 kernel modülü yüklü olarak bekliyordu. Aynı sürüme basit bir yeniden derleme 896MB gerektiriyordu; 768MB'de ise nix-build, 505MB anonim bellek ayrılmışken OOM yöneticisi tarafından sonlandırıldı.
Ayarlar yapıldıktan sonra aynı sistem, 512MB'lık bir VPS üzerinde 96MB kullanımla boşta bekliyor ve 7.3'e kernel geçişi dahil tam bir channel güncellemesi ile yeniden derleme, 371MB zirveyle ve hiç OOM sonlandırması olmadan tamamlanıyor. Yazar bu sayıları, ikinci açılıştan birkaç dakika sonra, kimse oturum açmamışken, kendi derleme ortamı test araçlarıyla ölçmüş ve bazı rakamların yalnızca megabyte hassasiyetinde kaydedildiğini hatırlatıyor.
Kernel komut satırı kazançları
Erken kazanımların bir kısmı açılış parametrelerinden geliyor. NixOS kerneli varsayılan olarak bellek ayırma profilleme etkin geliyor ve yazar, takip tablolarını yaklaşık 6MB olarak ölçüp sysctl.vm.mem_profiling=never ile geri kazanmış. sysctl öneki olmadan düz bir mem_profiling=never'in hiçbir işe yaramadığını, çünkü kernelin geçersiz parametreyi olduğu gibi userspace'e aktardığını belirtiyor.
Diğer parametreler 2MB'lık KFENCE havuzunu devre dışı bırakıyor, kdamond ve kauditd iş parçacıklarını kaldırıyor ve bir misafir sistemin hiç kullanmayacağı KSM ve TPM desteğinin başlatılmasını kara listeye alıyor. 2GB'lık bir test VM'inde tüm komut satırı seti, önbellek olmayan belleği 128MB'dan 121MB'a düşürdü ve kernel iş parçacıklarını 64'ten 59'a indirdi.
Gönderiye göre en büyük tek değişiklik transparent_hugepage=never oldu. Huge page'ler madvise modundayken kernel, vm.min_free_kbytes'ı 41108'e yükseltiyor; kapalıyken bu değer 3710'da kalıyor ve workload'ın hiç elde edemediği bellek ayrılmış oluyor. THP'yi kapatmak 2GB'da 52MB serbest bıraktı ve 896MB'de 103MB daha fazla bellek kullanılabilir hale getirdi; ancak yazar, üretim sistemlerinde bunu açık tutmak için geçerli nedenler olabileceğini not düşüyor.
Modüllerin ve initrd'nin budanması
Rehber, bir KVM misafirinin hiç görmediği donanımları kara listeye alıyor: floppy, PS/2 fare, AGP, networkd tarafından içeri çekilen kablosuz ağ yapılandırması ve benzeri sürücüler; bunlardan biri 8MB'lık bir kernel slab'ını tutuyordu. switch-root sırasında istenen modüller için düz kara liste işe yaramadığından, bunlar /bin/false kurulumlarıyla değiştiriliyor.
initrd, virtio_pci, virtio_blk ve ext4'e indiriliyor ve küçük bir derivation, system.modulesTree'yi değiştirerek ses, GPU, kablosuz ağ, USB, fiziksel NIC ve depolama HBA sürücülerini kaldırıyor ama tutulan her şeyin bağımlılıklarını koruyor. Bu, diskteki modül ağacını 162MB'dan 45MB'a indirdi ve nixos-rebuild içinde çalıştığı için kernel güncellemeleri de aynı işlemi otomatik olarak görüyor.
Userspace kıyımları
Servis tarafında gönderi, systemd-resolved'ı devre dışı bırakıyor; bu servisin 8.3MB PSS değeri vardı ve daha önce tüm arayüzlerde LLMNR ve mDNS dinliyordu; cloud-init ise düz bir resolv.conf yazıyor. 4.6MB'lık systemd-timesyncd, açılışta ve saatlik zamanlayıcıda çalışan tek seferlik bir busybox ntpd ile değiştirilmiş; yazar bunun çoğu KVM sunucusunda işe yarayacağını düşünüyor. sshd, 3.9MB'lık dinleyicisi yalnızca oturumlar sırasında var olacak şekilde socket-activated hale getiriliyor; ancak yazar, SSH'un genel bir IP'de açık olduğu sunucularda bunun atlanmasını öneriyor. 1.8MB'lık systemd-oomd kaldırılıyor ve tek seferlik bir servis, networkd'nin LLDP socket'ini boştayken durdurmak için cloud-init'in ağ dosyalarına LLDP=no yazıyor. Bellekte kalanlar ise systemd, udevd, nsncd, networkd, journald, logind, dbus-broker ve tek bir getty; toplamda yaklaşık 40MB'lık userland PSS.
Bir yeniden derlemeyi 512MB'a sığdırmak
Yerinde yeniden derlemeyi mümkün kılan iki değişiklik var. Birincisi, belleğin yüzde 100'ünde, disk swap olmadan 512MB ile sınırlı, zstd sıkıştırmalı zram; buna, kernelin sayfa önbelleğini atmak yerine soğuk anonim sayfaları sıkıştırması için yüksek bir swappiness eşlik ediyor. 512MB'lık bir yeniden derleme sırasında zram, gerçek RAM'de 116MB'ta zirve yaptı. İkincisi, Boehm çöp toplayıcısının ortam değişkenleri Nix değerlendirmesini ayarlıyor: 2GB'lık bir VM'de değerlendirme stok haliyle 599MB'ta zirve yaparken, GC ayarları bunu 548MB'a indirdi. Yazar, değerlendirme belleğini anlamlı şekilde azaltan başka bir şey bulamadı.
Ağırlıklı olarak disk için yapılan bir closure kırpımı, closure'ı 963MB'dan 910MB'a, sıkıştırılmış imajı ise 607MB'dan 477MB'a indirdi. Yazar, disk küçültme seçeneklerini bilinçli olarak TierHive şablonundan çıkardı ve okurları ayrı bir Nixcademy rehberine yönlendirdi; çünkü böyle varsayılanlar son kullanıcıları şaşırtabilirdi.
Geriye kalan zayıf nokta sürüm atlamaları: 512MB üzerinde 26.05'ten unstable'a geçme denemesi, nix-build OOM tarafından sonlandırılmadan yaklaşık 30 dakika çalıştı; ancak eski nesil çalışmaya devam etti ve ikinci deneme, indirmeler zaten önbellekte olduğu için tamamlandı.
Neden önemli
NixOS'un genellikle cömert kaynaklar gerektirdiği varsayılır ve bu rehber tabanın beklendiğinden çok daha düşük olduğunu gösteriyor; bu da ucuz VPS paketleri, gömülü sistemler ve belleğe göre faturalanan her şey için önemli. NixOS yapılandırması bildirimsel olduğu için bu ince ayarlar yeniden derlemeler arasında korunuyor ve modül ağacı budama işlemi kernel güncellemelerinde kendini otomatik olarak yeniden uyguluyor. Gönderi ayrıca, Linux sistemleri genelinde geçerli olan, varsayılan bellek ayırma profilleme ve THP kaynaklı bellek ayırmaları gibi gizli maliyetleri de belgeliyor. Okurlar, sayıların tek bir kişinin KVM misafirlerindeki çalıştırmalarından geldiğini ve bazı seçimlerin belirtilen üretim trade-off'ları taşıdığını göz önünde bulundurmalı.
- #nixos
- #linux
- #memory-optimization
- #virtualization
- #kernel