veilor-os/docs
veilor-org 7d2b94b5be feat(hardening): add memory-pressure tuning for zram-only stack
veilor-os runs zram-only swap (THREAT-MODEL.md — no key leak from
disk swap). With kernel defaults that policy bites: once zram fills
there is no overflow tier, the kernel waits until total exhaustion
to trigger OOM, then picks a victim by oom_score and frequently
kills plasmashell or the foreground terminal instead of the leaking
browser tab. Mouse locks for minutes during the thrash window.

Three co-dependent layers:

1. systemd-oomd enabled — PSI-based pre-OOM killer fires at cgroup
   boundaries before the kernel reaper. Fedora's systemd-oomd-defaults
   ship sane thresholds for user.slice; installed in kickstart and
   layered in bluebuild containerfile, enabled in both unit-toggle
   blocks.

2. zram bumped 8 GiB lzo-rle (Fedora default) -> 16 GiB zstd. zstd
   gives ~3:1 (~48 GiB effective) at negligible CPU cost on any
   post-2018 x86_64. 8 GiB filled in practice on 32+ GiB laptops
   running Chromium + LSP + chat clients.

3. /etc/sysctl.d/95-memory-pressure.conf:
   - vm.swappiness=180 (zram is RAM-fast, swap early; default 60
     assumes HDD)
   - vm.watermark_scale_factor=125 (kswapd reclaim starts ~1.25%
     headroom vs default 0.1%; ~400 MiB head start on 32 GiB)
   - vm.page-cluster=0 (no read-ahead; pointless on RAM-backed swap,
     wastes decompress)

Without any one of the three the system still wedges briefly: oomd
without zram tuning waits for PSI to climb; zram tuning without oomd
gets victim selection wrong.

Verified by new test/boot-checklist.md "Memory pressure" section.
Inline rationale headers in both overlay files so the why survives
doc drift. Trigger event: onyx (Fedora 43, not veilor-os) thrashed
2026-05-11; same defaults shipped to veilor-os, fixed here too.
2026-05-12 10:17:00 +01:00
..
research/2026-05-05-agent-wave docs: 9-agent research wave findings — v0.5.32 blocker map 2026-05-05 14:52:53 +01:00
BUILD.md veilor-os v0.1 scaffold — kickstart + hardening + 3-mode power + DuckSans-ready KDE black theme 2026-04-30 03:43:33 +01:00
CLI.md v0.6: pre-stage veilor-update + veilor-doctor CLI tools (#11) 2026-05-02 04:39:33 +01:00
HARDENING.md feat(hardening): add memory-pressure tuning for zram-only stack 2026-05-12 10:17:00 +01:00
INSTALL-V07.md bluebuild: switch base to ghcr.io/secureblue/kinoite-main-hardened 2026-05-06 17:15:54 +01:00
INSTALL.md veilor-os v0.1 scaffold — kickstart + hardening + 3-mode power + DuckSans-ready KDE black theme 2026-04-30 03:43:33 +01:00
INSTALLER.md feat(installer): pre-stage gum-based UX assets for v0.5.1 (#7) 2026-05-02 04:38:18 +01:00
POWER.md veilor-os v0.1 scaffold — kickstart + hardening + 3-mode power + DuckSans-ready KDE black theme 2026-04-30 03:43:33 +01:00
PROOF-OF-WORK.md bluebuild: switch base to ghcr.io/secureblue/kinoite-main-hardened 2026-05-06 17:15:54 +01:00
ROADMAP.md docs(changelog,roadmap): refresh state 2026-05-08 2026-05-08 00:49:36 +01:00
STRATEGY.md bluebuild: switch base to ghcr.io/secureblue/kinoite-main-hardened 2026-05-06 17:15:54 +01:00
THREAT-MODEL.md sec: polish THREAT-MODEL.md for v0.7 public launch 2026-05-06 16:10:03 +01:00