{ config, service_configs, pkgs, ... }: { boot.zfs.package = pkgs.zfs; boot.initrd.kernelModules = [ "zfs" ]; boot.kernelParams = [ "zfs.zfs_txg_timeout=120" # longer TXG open time = larger sequential writes # vdev I/O scheduler: feed more concurrent reads to the block scheduler so # mq-deadline has a larger pool of requests to sort and merge into elevator sweeps. # Default async_read_max is 3 — far too few for effective coalescence. # 32 was empirically optimal (64 overwhelmed the drives, 3 gave near-zero merges). "zfs.zfs_vdev_async_read_max_active=32" "zfs.zfs_vdev_async_read_min_active=4" # Merge reads within 128 KiB of each other (default 32 KiB). On HDDs, reading a # 128 KiB gap is far cheaper than a mechanical seek (~8 ms). "zfs.zfs_vdev_read_gap_limit=131072" # Allow ZFS to aggregate I/Os up to 4 MiB (default 1 MiB), matching the # libtorrent piece extent size for larger sequential disk operations. "zfs.zfs_vdev_aggregation_limit=4194304" ]; 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; }; }