Signed-off-by: Christoph Heiss <c.he...@proxmox.com> --- Changes v1 -> v2: * Updated comment for ZfsBootdiskOptions::defaults_from() accordingly
proxmox-tui-installer/src/options.rs | 52 +++++++++++++++++++-- proxmox-tui-installer/src/setup.rs | 2 + proxmox-tui-installer/src/views/bootdisk.rs | 8 +++- 3 files changed, 56 insertions(+), 6 deletions(-) diff --git a/proxmox-tui-installer/src/options.rs b/proxmox-tui-installer/src/options.rs index abc8c7b..fbed8d9 100644 --- a/proxmox-tui-installer/src/options.rs +++ b/proxmox-tui-installer/src/options.rs @@ -1,7 +1,7 @@ use std::net::{IpAddr, Ipv4Addr}; use std::{cmp, fmt}; -use crate::setup::{LocaleInfo, NetworkInfo, RuntimeInfo}; +use crate::setup::{LocaleInfo, NetworkInfo, ProxmoxProduct, RuntimeInfo}; use crate::utils::{CidrAddress, Fqdn}; use crate::SummaryOption; @@ -190,21 +190,23 @@ pub struct ZfsBootdiskOptions { pub compress: ZfsCompressOption, pub checksum: ZfsChecksumOption, pub copies: usize, + pub arc_max: usize, pub disk_size: f64, pub selected_disks: Vec<usize>, } impl ZfsBootdiskOptions { - /// This panics if the provided slice is empty. - pub fn defaults_from(disks: &[Disk]) -> Self { - let disk = &disks[0]; + /// Panics if the disk list is empty. + pub fn defaults_from(runinfo: &RuntimeInfo) -> Self { + let disk = &runinfo.disks[0]; Self { ashift: 12, compress: ZfsCompressOption::default(), checksum: ZfsChecksumOption::default(), copies: 1, + arc_max: default_zfs_arc_max(crate::current_product(), runinfo.total_memory), disk_size: disk.size, - selected_disks: (0..disks.len()).collect(), + selected_disks: (0..runinfo.disks.len()).collect(), } } } @@ -451,6 +453,24 @@ impl InstallerOptions { } } +/// Calculates the default upper limit for the ZFS ARC size. +/// See also <https://bugzilla.proxmox.com/show_bug.cgi?id=4829> and +/// https://openzfs.github.io/openzfs-docs/Performance%20and%20Tuning/Module%20Parameters.html#zfs-arc-max +/// +/// # Arguments +/// * `product` - The product to be installed +/// * `total_memory` - Total memory installed in the system, in MiB +fn default_zfs_arc_max(product: ProxmoxProduct, total_memory: usize) -> usize { + if product != ProxmoxProduct::PVE { + // Use ZFS default for non-PVE + 0 + } else { + ((total_memory as f64) / 10.) + .round() + .clamp(64., 16. * 1024.) as usize + } +} + #[cfg(test)] mod tests { use super::*; @@ -460,6 +480,28 @@ mod tests { }; use std::{collections::HashMap, path::PathBuf}; + #[test] + fn zfs_arc_limit() { + const TESTS: &[(usize, usize)] = &[ + (16, 64), // at least 64 MiB + (1024, 102), + (4 * 1024, 410), + (8 * 1024, 819), + (150 * 1024, 15360), + (160 * 1024, 16384), + (1024 * 1024, 16384), // maximum of 16 GiB + ]; + + for (total_memory, expected) in TESTS { + assert_eq!( + default_zfs_arc_max(ProxmoxProduct::PVE, *total_memory), + *expected + ); + assert_eq!(default_zfs_arc_max(ProxmoxProduct::PBS, *total_memory), 0); + assert_eq!(default_zfs_arc_max(ProxmoxProduct::PMG, *total_memory), 0); + } + } + fn fill_setup_info() { crate::init_setup_info(SetupInfo { config: ProductConfig { diff --git a/proxmox-tui-installer/src/setup.rs b/proxmox-tui-installer/src/setup.rs index 7238131..25504fe 100644 --- a/proxmox-tui-installer/src/setup.rs +++ b/proxmox-tui-installer/src/setup.rs @@ -114,6 +114,7 @@ struct InstallZfsOption { #[serde(serialize_with = "serialize_as_display")] checksum: ZfsChecksumOption, copies: usize, + arc_max: usize, } impl From<ZfsBootdiskOptions> for InstallZfsOption { @@ -123,6 +124,7 @@ impl From<ZfsBootdiskOptions> for InstallZfsOption { compress: opts.compress, checksum: opts.checksum, copies: opts.copies, + arc_max: opts.arc_max, } } } diff --git a/proxmox-tui-installer/src/views/bootdisk.rs b/proxmox-tui-installer/src/views/bootdisk.rs index dbd13ea..e8322db 100644 --- a/proxmox-tui-installer/src/views/bootdisk.rs +++ b/proxmox-tui-installer/src/views/bootdisk.rs @@ -139,6 +139,11 @@ impl AdvancedBootdiskOptionsView { } fn fstype_on_submit(siv: &mut Cursive, disks: &[Disk], fstype: &FsType) { + let runinfo = siv + .user_data::<InstallerState>() + .map(|state| state.runtime_info.clone()) + .unwrap(); + siv.call_on_name("advanced-bootdisk-options-dialog", |view: &mut Dialog| { if let Some(AdvancedBootdiskOptionsView { view }) = view.get_content_mut().downcast_mut() @@ -150,7 +155,7 @@ impl AdvancedBootdiskOptionsView { )), FsType::Zfs(_) => view.add_child(ZfsBootdiskOptionsView::new( disks, - &ZfsBootdiskOptions::defaults_from(disks), + &ZfsBootdiskOptions::defaults_from(&runinfo), )), FsType::Btrfs(_) => view.add_child(BtrfsBootdiskOptionsView::new( disks, @@ -541,6 +546,7 @@ impl ZfsBootdiskOptionsView { compress, checksum, copies, + arc_max: 0, // use built-in ZFS default value disk_size, selected_disks, }, -- 2.42.0 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel