From 72dfbb43cd28fd447af7f40ae7defa2a9bfd6b22 Mon Sep 17 00:00:00 2001 From: Ryan Hughes Date: Mon, 27 Jul 2026 09:47:05 -0400 Subject: [PATCH] Additional zram + swap tuning --- .../zram-generator.conf.d/90-omarchy.conf | 20 +++++-------------- etc/sysctl.d/99-omarchy-sysctl.conf | 17 ++++++++++++++-- etc/tmpfiles.d/omarchy-zswap.conf | 4 ++++ 3 files changed, 24 insertions(+), 17 deletions(-) create mode 100644 etc/tmpfiles.d/omarchy-zswap.conf diff --git a/default/systemd/zram-generator.conf.d/90-omarchy.conf b/default/systemd/zram-generator.conf.d/90-omarchy.conf index 77d1add7..c85a8d67 100644 --- a/default/systemd/zram-generator.conf.d/90-omarchy.conf +++ b/default/systemd/zram-generator.conf.d/90-omarchy.conf @@ -1,19 +1,9 @@ -# Compressed swap in RAM, sized the way Fedora has shipped it since F34: all of -# memory, capped at 8G. Fedora weighed the worry that incompressible pages would -# tie up RAM against five years of desktops reporting no trouble from it, which -# is more field evidence than we could gather on our own. -# -# The cap is what bounds the downside. A browser-heavy desktop can drive zstd -# down near 1.1:1, where the device backs far less than it advertises, and 8G -# keeps that bounded on any machine large enough to notice. The disk swapfile -# sits behind it at pri=0 for everything past that. -# -# Fedora spells this zram-fraction = 1.0 with max-zram-size = 8192; both keys -# are deprecated in favour of zram-size, which computes the same numbers. +# Compressed swap in RAM. zstd averages around 3:1, so even a full device +# occupies roughly a third of RAM. Any smaller cap spills reclaim to the disk +# swapfile, which on encrypted installs pages back through LUKS. [zram0] -zram-size = min(ram, 8192) +zram-size = ram compression-algorithm = zstd -# Above the pri=0 that omarchy-hibernation-setup gives the disk swapfile, so -# zram absorbs everything until it's full. +# Above the pri=0 that omarchy-hibernation-setup gives the disk swapfile. swap-priority = 100 diff --git a/etc/sysctl.d/99-omarchy-sysctl.conf b/etc/sysctl.d/99-omarchy-sysctl.conf index d5ae09ea..1cce6d7f 100644 --- a/etc/sysctl.d/99-omarchy-sysctl.conf +++ b/etc/sysctl.d/99-omarchy-sysctl.conf @@ -7,8 +7,13 @@ net.ipv4.tcp_mtu_probing=1 # Anything above 100 tells the kernel that evicting an anonymous page is # cheaper than dropping a page-cache page it would have to re-read from disk. # With a compressed RAM device that is true, so the disk-era default of 60 -# leaves the page cache starved. -vm.swappiness=180 +# leaves the page cache starved. Stop at 150: every page swapped still costs +# a compression now and a decompression on fault-back. +vm.swappiness=150 + +# Halve the eagerness to drop dentry/inode cache, which is costly to rebuild +# and can't spill to zram. Not lower: 0 can OOM. +vm.vfs_cache_pressure=50 # Read one page per swap-in fault. The default of 8 pays for a seek that zram # doesn't have, and every extra page costs a separate decompression. @@ -21,3 +26,11 @@ vm.watermark_boost_factor=0 # Keep ~1.25% of memory free instead of 0.1%, so kswapd reclaims in the # background rather than letting allocations stall in direct reclaim. vm.watermark_scale_factor=125 + +# Cap dirty pages at 64M/256M instead of the default 10%/20% of RAM, which +# lets gigabytes of writeback pile up and flush in stalling bursts. +vm.dirty_background_bytes=67108864 +vm.dirty_bytes=268435456 + +# With bursts bounded above, the flusher can wake every 15s instead of 5s. +vm.dirty_writeback_centisecs=1500 diff --git a/etc/tmpfiles.d/omarchy-zswap.conf b/etc/tmpfiles.d/omarchy-zswap.conf new file mode 100644 index 00000000..9a12fd16 --- /dev/null +++ b/etc/tmpfiles.d/omarchy-zswap.conf @@ -0,0 +1,4 @@ +# Arch's kernel enables zswap by default, which in front of swap-on-zram just +# double-compresses pages and breaks zramctl accounting. Boot-only (w!), so +# flipping it on by hand for an experiment sticks until reboot. +w! /sys/module/zswap/parameters/enabled - - - - N