For non-PVE products, this defaults to 50% of available system memory (aka. ZFS default).
Signed-off-by: Christoph Heiss <c.he...@proxmox.com> --- Proxmox/Install/RunEnv.pm | 20 +++++++++++++------- proxinstall | 24 +++++++++++------------- test/zfs-arc-max.pl | 26 +++++++++++++------------- 3 files changed, 37 insertions(+), 33 deletions(-) diff --git a/Proxmox/Install/RunEnv.pm b/Proxmox/Install/RunEnv.pm index c393f67..25a8b49 100644 --- a/Proxmox/Install/RunEnv.pm +++ b/Proxmox/Install/RunEnv.pm @@ -310,20 +310,26 @@ sub query_installation_environment : prototype() { our $ZFS_ARC_MIN_SIZE_MIB = 64; # MiB # See https://bugzilla.proxmox.com/show_bug.cgi?id=4829 -our $ZFS_ARC_MAX_SIZE_MIB = 16 * 1024; # 16384 MiB = 16 GiB -our $ZFS_ARC_SYSMEM_PERCENTAGE = 0.1; # use 10% of available system memory by default +our $ZFS_ARC_PVE_MAX_SIZE_MIB = 16 * 1024; # 16384 MiB = 16 GiB +our $ZFS_ARC_PVE_SYSMEM_PERCENTAGE = 0.1; # use 10% of available system memory for PVE as default +our $ZFS_ARC_DEFAULT_SYSMEM_PERCENTAGE = 0.5; # 50% of available system memory otherwise # Calculates the default upper limit for the ZFS ARC size. # Returns the default ZFS maximum ARC size in MiB. sub default_zfs_arc_max { - # Use ZFS default on non-PVE - return 0 if Proxmox::Install::ISOEnv::get('product') ne 'pve'; + my $percentage = $ZFS_ARC_DEFAULT_SYSMEM_PERCENTAGE; + my $max_mib = get('total_memory'); - my $default_mib = get('total_memory') * $ZFS_ARC_SYSMEM_PERCENTAGE; + if (Proxmox::Install::ISOEnv::get('product') eq 'pve') { + $percentage = $ZFS_ARC_PVE_SYSMEM_PERCENTAGE; + $max_mib = $ZFS_ARC_PVE_MAX_SIZE_MIB; + } + + my $default_mib = get('total_memory') * $percentage; my $rounded_mib = int(sprintf('%.0f', $default_mib)); - if ($rounded_mib > $ZFS_ARC_MAX_SIZE_MIB) { - return $ZFS_ARC_MAX_SIZE_MIB; + if ($rounded_mib > $max_mib) { + return $max_mib; } elsif ($rounded_mib < $ZFS_ARC_MIN_SIZE_MIB) { return $ZFS_ARC_MIN_SIZE_MIB; } diff --git a/proxinstall b/proxinstall index 01d4cfe..97e9462 100755 --- a/proxinstall +++ b/proxinstall @@ -1167,20 +1167,18 @@ my $create_raid_advanced_grid = sub { $spinbutton_copies->set_value($copies); push @$labeled_widgets, ['copies', $spinbutton_copies]; - if ($iso_env->{product} eq 'pve') { - my $total_memory = Proxmox::Install::RunEnv::get('total_memory'); + my $total_memory = Proxmox::Install::RunEnv::get('total_memory'); - my $spinbutton_arc_max = Gtk3::SpinButton->new_with_range( - $Proxmox::Install::RunEnv::ZFS_ARC_MIN_SIZE_MIB, $total_memory, 1); - $spinbutton_arc_max->set_tooltip_text('Maximum ARC size in megabytes'); - $spinbutton_arc_max->signal_connect('value-changed' => sub { - my $w = shift; - Proxmox::Install::Config::set_zfs_opt('arc_max', $w->get_value_as_int()); - }); - my $arc_max = Proxmox::Install::Config::get_zfs_opt('arc_max'); - $spinbutton_arc_max->set_value($arc_max); - push @$labeled_widgets, ['ARC max size', $spinbutton_arc_max, 'MiB']; - } + my $spinbutton_arc_max = Gtk3::SpinButton->new_with_range( + $Proxmox::Install::RunEnv::ZFS_ARC_MIN_SIZE_MIB, $total_memory, 1); + $spinbutton_arc_max->set_tooltip_text('Maximum ARC size in megabytes'); + $spinbutton_arc_max->signal_connect('value-changed' => sub { + my $w = shift; + Proxmox::Install::Config::set_zfs_opt('arc_max', $w->get_value_as_int()); + }); + my $arc_max = Proxmox::Install::Config::get_zfs_opt('arc_max'); + $spinbutton_arc_max->set_value($arc_max); + push @$labeled_widgets, ['ARC max size', $spinbutton_arc_max, 'MiB']; push @$labeled_widgets, ['hdsize', $hdsize_btn, 'GB']; return $create_label_widget_grid->($labeled_widgets);; diff --git a/test/zfs-arc-max.pl b/test/zfs-arc-max.pl index 74cb9b5..a554d56 100755 --- a/test/zfs-arc-max.pl +++ b/test/zfs-arc-max.pl @@ -22,13 +22,13 @@ sub mock_product { } my %default_tests = ( - 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 + 16 => [64, 64, 64], # at least 64 MiB in any case + 1024 => [102, 512, 512], + 4 * 1024 => [410, 2048, 2048], + 8 * 1024 => [819, 4096, 4096], + 150 * 1024 => [15360, 76800, 76800], + 160 * 1024 => [16384, 81920, 81920], + 1024 * 1024 => [16384, 524288, 524288], # maximum of 16 GiB for PVE ); while (my ($total_mem, $expected) = each %default_tests) { @@ -41,16 +41,16 @@ while (my ($total_mem, $expected) = each %default_tests) { ); mock_product('pve'); - is(Proxmox::Install::RunEnv::default_zfs_arc_max(), $expected, - "$expected MiB should be zfs_arc_max for PVE with $total_mem MiB system memory"); + is(Proxmox::Install::RunEnv::default_zfs_arc_max(), $expected->[0], + "$expected->[0] MiB should be zfs_arc_max for PVE with $total_mem MiB system memory"); mock_product('pbs'); - is(Proxmox::Install::RunEnv::default_zfs_arc_max(), 0, - "zfs_arc_max should default to `0` for PBS with $total_mem MiB system memory"); + is(Proxmox::Install::RunEnv::default_zfs_arc_max(), $expected->[1], + "$expected->[1] MiB should be zfs_arc_max for PBS with $total_mem MiB system memory"); mock_product('pmg'); - is(Proxmox::Install::RunEnv::default_zfs_arc_max(), 0, - "zfs_arc_max should default to `0` for PMG with $total_mem MiB system memory"); + is(Proxmox::Install::RunEnv::default_zfs_arc_max(), $expected->[2], + "$expected->[2] MiB should be zfs_arc_max for PMG with $total_mem MiB system memory"); } my @clamp_tests = ( -- 2.42.0 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel