{ config, lib, service_configs, pkgs, ... }: let # Total RAM in bytes (from /proc/meminfo: 65775836 KiB). totalRamBytes = 65775836 * 1024; # Hugepage reservations that the kernel carves out before ZFS can use them. hugepages2mBytes = service_configs.hugepages_2m.total_pages * 2 * 1024 * 1024; hugepages1gBytes = 3 * 1024 * 1024 * 1024; # 3x 1G pages for RandomX (xmrig.nix) totalHugepageBytes = hugepages2mBytes + hugepages1gBytes; # ARC max: 60% of RAM remaining after hugepages. Leaves headroom for # application RSS (PostgreSQL, qBittorrent, Jellyfin, Grafana, etc.), # kernel slabs, and page cache. arcMaxBytes = (totalRamBytes - totalHugepageBytes) * 60 / 100; in { boot.zfs.package = pkgs.zfs_2_4; boot.initrd.kernelModules = [ "zfs" ]; boot.kernelParams = [ "zfs.zfs_txg_timeout=30" "zfs.zfs_arc_max=${toString arcMaxBytes}" ]; boot.supportedFilesystems = [ "zfs" ]; boot.zfs.extraPools = [ service_configs.zpool_ssds service_configs.zpool_hdds ]; services.sanoid = { enable = true; datasets."${service_configs.zpool_ssds}" = { recursive = true; autoprune = true; autosnap = true; hourly = 5; daily = 7; monthly = 3; yearly = 0; }; datasets."${service_configs.zpool_ssds}/services/sql" = { recursive = true; autoprune = true; autosnap = true; hourly = 12; daily = 2; monthly = 0; yearly = 0; }; datasets."${service_configs.zpool_ssds}/services/jellyfin/cache" = { recursive = true; autoprune = true; autosnap = true; hourly = 0; daily = 0; monthly = 0; yearly = 0; }; datasets."${service_configs.zpool_ssds}/services/monero" = { recursive = true; autoprune = true; autosnap = true; hourly = 0; daily = 0; monthly = 0; yearly = 0; }; datasets."${service_configs.zpool_ssds}/services/p2pool" = { recursive = true; autoprune = true; autosnap = true; hourly = 0; daily = 0; monthly = 0; yearly = 0; }; datasets."${service_configs.zpool_hdds}" = { recursive = true; autoprune = true; autosnap = true; hourly = 0; daily = 0; monthly = 0; yearly = 0; }; }; services.zfs = { autoScrub.enable = true; trim.enable = true; }; }