{ "meta": { "title": "Post-Install: Storage | ProxMenux Documentation", "description": "Storage optimizations in the ProxMenux Customizable post-install script: ZFS ARC sizing based on host RAM, zfs-auto-snapshot for periodic snapshots, and vzdump backup speed limits removal." }, "header": { "title": "Post-Install: Storage", "section": "Settings post-install Proxmox" }, "intro": { "title": "What this category covers", "body": "Four storage-related optimizations: tune the ZFS ARC cache size to a sensible fraction of host RAM, install and schedule ZFS auto-snapshots, enable ZFS autotrim on SSD/NVMe pools, and remove throttles from vzdump so backups run at full speed. All four are independent — pick the ones that match your setup. A fifth storage-adjacent optimization, Log2RAM, reduces SSD/NVMe wear by moving /var/log to a ramdisk — it lives on the Optional page because the ProxMenux Customizable menu groups it there." }, "trackedTitle": "All four are tracked in the Uninstall menu", "trackedBody": "Each of these options registers a tool in installed_tools.json, so they appear in Uninstall Optimizations. Reverting zfs_arc removes /etc/modprobe.d/99-zfsarc.conf and rebuilds initramfs; zfs_auto_snapshot reverses the cron schedule and offers to purge the package; zfs_autotrim sets autotrim=off on the pools it enabled; vzdump_speed restores /etc/vzdump.conf from the .bak the install created.", "arc": { "heading": "Optimize ZFS ARC size", "intro": "The Adaptive Replacement Cache (ARC) is ZFS’s in-memory read cache. Proxmox VE installations since 8.1 set a limit of 10% of RAM, capped at 16 GiB; older or upgraded hosts may differ. This option writes that same policy explicitly (RAM/10, capped at 16 GiB, with a 64 MiB floor) to its own file, which also covers older or upgraded hosts. Check existing settings and workload needs before changing it; a smaller cache is not always faster.", "sizingTitle": "Sizing rules", "headerRam": "Host RAM", "headerMax": "ARC cap", "rows": [ { "ram": "Formula", "max": "RAM / 10, capped at 16 GiB, with a 64 MiB floor" }, { "ram": "8 GB host", "max": "≈ 819 MiB (RAM/10)" }, { "ram": "16 GB host", "max": "≈ 1.6 GiB (RAM/10)" }, { "ram": "64 GB host", "max": "≈ 6.4 GiB (RAM/10)" }, { "ram": "≥ 160 GB host", "max": "16 GiB (cap)" } ], "after": "The file /etc/modprobe.d/99-zfsarc.conf contains a single directive — options zfs zfs_arc_max=…. This option does not tune other ZFS module parameters (zfs_arc_min, L2ARC prefetch/write throttle, TXG timeout). Before writing, a reconcile step scans other *.conf in /etc/modprobe.d/ that set zfs_arc_min / zfs_arc_max, backs them up to /usr/local/share/proxmenux/backups/zfs_arc/ with a manifest, and removes the conflicting zfs_arc_min / zfs_arc_max values (other options on those lines are kept), so only ProxMenux’s ARC file sets the limit. After writing, it runs update-initramfs -u -k all and, when applicable, proxmox-boot-tool refresh, so the limit also reaches the initramfs used by ZFS-on-root setups.", "rebootTitle": "Requires a reboot to take effect", "rebootBody": "ARC settings are read when the zfs kernel module loads. To make the cap take effect on ZFS-on-root hosts, ProxMenux regenerates the initramfs with update-initramfs -u -k all and, when applicable, refreshes the boot loader with proxmox-boot-tool refresh. A reboot is still required to pick up the new module parameter; the \"reboot required\" flag is set automatically.", "safeTitle": "Safe on non-ZFS hosts", "safeBody": "The function only writes the config when zpool list reports at least one imported ZFS pool. On ext4 / LVM-only Proxmox hosts, or on machines with the ZFS tools installed but no pool imported, ticking this option is a no-op — nothing gets written.", "verifyTitle": "Verification and manual rollback" }, "autoSnap": { "heading": "Install ZFS auto-snapshot", "intro": "Installs the zfs-auto-snapshot package and rewrites its cron schedules so snapshots are taken automatically at several intervals. A great no-effort safety net on top of your regular vzdump backups.", "cadenceTitle": "Snapshot cadence ProxMenux configures", "headerLabel": "Label", "headerRuns": "Runs", "headerKept": "Snapshots kept", "rows": [ { "label": "frequent", "runs": "every 15 min", "kept": "4" }, { "label": "hourly", "runs": "every hour", "kept": "1" }, { "label": "daily", "runs": "once a day", "kept": "1" }, { "label": "weekly", "runs": "once a week", "kept": "1" }, { "label": "monthly", "runs": "once a month", "kept": "1" } ], "conservativeTitle": "Conservative keep counts", "conservativeBody": "ProxMenux ships with conservative retention (just 4 frequent + 1 of each longer interval) so ZFS snapshot storage doesn't balloon. If you want longer retention, edit the numbers in /etc/cron.d/zfs-auto-snapshot, /etc/cron.hourly/zfs-auto-snapshot, etc. after the script runs.", "onlyZfsTitle": "Only useful on ZFS pools", "onlyZfsBody": "Installing the package on an ext4-only host is harmless but pointless — there are no ZFS datasets for it to snapshot. Skip this option if you don't use ZFS.", "verifyTitle": "Verification and manual rollback" }, "autotrim": { "heading": "Enable ZFS autotrim (SSD/NVMe pools)", "intro": "Enables the autotrim property on ZFS pools backed exclusively by SSDs or NVMe drives with TRIM support. The script conservatively skips pools containing a rotational device. Pools already set to autotrim=on are left unchanged.", "trimTitle": "What TRIM does, and why it matters on ZFS", "trimBody1": "SSDs / NVMe drives manage internal storage in fixed-size erase blocks that are much larger than the logical sectors the filesystem talks to. When a filesystem deletes a file, the drive doesn't know — it still thinks those sectors are in use, so its internal garbage collector keeps shuffling stale data around to free new erase blocks. TRIM is the standard command the OS uses to tell the drive \"these sectors are now free, you can erase them ahead of time\".", "trimBody2": "Without TRIM, SSD performance degrades over time as the drive runs out of pre-erased blocks and has to do erase-on-write, and write amplification increases — both shortening the drive's useful life. With TRIM enabled, the drive can keep a healthy pool of empty blocks ready to write into.", "trimBody3": "With autotrim=on, ZFS trims recently freed space in the background, grouping ranges before issuing commands. A periodic zpool trim <pool> is another option. Autotrim avoids a separate schedule, but its performance impact depends on the devices; periodic manual trim may suit some lower-end drives better.", "practicalTitle": "Why is this practical to enable?", "practicalItems": [ "Sustained write performance. TRIM can help a drive reclaim unused blocks efficiently. The benefit and any latency impact depend on the device and workload.", "Drive longevity. Avoiding unnecessary internal copying can reduce write amplification and NAND wear. It does not guarantee a specific increase in drive lifespan.", "No scheduled cron job to remember. Unlike a periodic zpool trim, autotrim is fire-and-forget — the pool handles it on its own." ], "whenTitle": "When is this necessary?", "whenIntro1": "Consider enabling it on ZFS pools made entirely of TRIM-capable SSD or NVMe devices. Check device behaviour and workload latency; a scheduled manual trim can be preferable on some hardware.", "whenIntro2": "The script skips it automatically on:", "whenSkipItems": [ "Pools containing any HDD (rotational) vdev — a conservative hardware filter used by this script.", "Drives without discard_granularity exposed in sysfs — usually old SSDs without TRIM, or pass-through paths where the OS can't see the underlying device.", "Pools where ZFS itself reports the property unsupported (rare; very old pools).", "Pools already set to autotrim=on (no-op)." ], "whenIntro3": "Not relevant on ext4-only hosts — there's nothing for ZFS to trim. The function exits with a friendly message in that case.", "recordedTitle": "Why only the pools ProxMenux changed are recorded", "recordedBody": "The function only writes a pool to its internal state file (/usr/local/share/proxmenux/zfs_autotrim_pools) when it actively flipped that pool from off to on. Pools you had on autotrim before running the script are left out of the list, so a future Uninstall doesn't turn off settings you configured yourself — only ProxMenux's own changes are reverted.", "manualTitle": "Manual equivalent (run on your server)", "manualIntro": "The full sequence the script runs against each pool is replicable by hand. This is what you would type if you wanted to do the same thing on a single pool without ProxMenux:", "verifyTitle": "Verification and manual rollback", "oneShotTitle": "Need a one-shot trim instead of continuous?", "oneShotBody": "Some operators prefer a manual trim during off-peak hours rather than continuous trim activity. Disable autotrim and schedule a cron job that runs zpool trim <pool> — same end goal, different cadence." }, "vzdump": { "heading": "Increase vzdump backup speed", "intro": "Writes bwlimit: 0 and ionice: 5 in the global vzdump configuration. Proxmox already defaults to no bandwidth limit, so this removes a cap only if one was configured. Compared with the default ionice: 7, the value 5 gives a higher best-effort I/O priority where the scheduler honours it. This can affect running guests and does not guarantee faster backups.", "changedTitle": "What gets changed in /etc/vzdump.conf", "backupTitle": "First run creates a .bak of vzdump.conf", "backupBody": "The first time this option runs, ProxMenux copies /etc/vzdump.conf to /etc/vzdump.conf.bak before touching it. Subsequent runs re-use that backup and won't overwrite it, so a hand-edited config from before the first apply stays recoverable. The changes to bwlimit and ionice are then made with sed, and any other options in the file (compress, pigz, tmpdir, exclude-path, etc.) are preserved.", "skipTitle": "When to skip this", "skipBody": "On a host with slow local storage and VMs that are latency-sensitive, removing the bandwidth cap can cause noticeable slowdowns during backups. If you've previously set a specific bwlimit for that reason, keep it — skip this option.", "verifyTitle": "Verification and manual rollback" }, "related": { "heading": "Related", "items": [ { "label": "ZFS Management commands", "href": "/docs/help-info/zfs-commands", "tail": " — zpool / zfs reference for ARC, snapshots, scrub." }, { "label": "Storage and Disks commands", "href": "/docs/help-info/storage-commands", "tail": " — generic block-device and Proxmox storage reference." }, { "label": "Backup and Restore commands", "href": "/docs/help-info/backup-commands", "tail": " — vzdump CLI reference for bandwidth and I/O-priority settings." }, { "label": "Uninstall Optimizations", "href": "/docs/post-install/uninstall", "tail": " — revert ARC / vzdump changes." }, { "label": "Log2RAM", "href": "/docs/post-install/optional#log2ram", "tail": " — reduces SSD/NVMe wear by ramdisk-backing /var/log; documented under Optional." }, { "label": "Customizable Post-Install", "href": "/docs/post-install/customizable", "tail": " — back to the parent menu." } ] } }