[pve-devel] [PATCH qemu-server 06/10] memory: use 64 slots && static dimm size with max is defined

Alexandre Derumier aderumier at odiso.com
Fri Dec 9 20:27:22 CET 2022


default kernel vhost config only support 64 slots by default,
for performance since 2015.

Original memory hotplug code was done before, using qemu
max supported 255 slots.

To reach max mem (4TB), we used incremental dimm size.

Instead of dynamic memory size, use 1 static dimm size, compute
from max memory/64.

Fix:
https://bugzilla.proxmox.com/show_bug.cgi?id=3446
https://bugzilla.proxmox.com/show_bug.cgi?id=1426
Signed-off-by: Alexandre Derumier <aderumier at odiso.com>
---
 PVE/QemuServer/Memory.pm | 31 ++++++++++++++++++++-----------
 1 file changed, 20 insertions(+), 11 deletions(-)

diff --git a/PVE/QemuServer/Memory.pm b/PVE/QemuServer/Memory.pm
index b847742..8bbbf07 100644
--- a/PVE/QemuServer/Memory.pm
+++ b/PVE/QemuServer/Memory.pm
@@ -140,14 +140,15 @@ sub foreach_dimm{
     my ($conf, $vmid, $memory, $sockets, $func) = @_;
 
     my $dimm_id = 0;
-    my $current_size = 0;
+    my $current_size = get_static_mem($conf);
     my $dimm_size = 0;
 
-    if($conf->{hugepages} && $conf->{hugepages} == 1024) {
-	$current_size = 1024 * $sockets;
+    my $confmem = PVE::QemuServer::parse_memory($conf->{memory});
+    if ($confmem->{max}) {
+       $dimm_size = $confmem->{max}/64;
+    } elsif($conf->{hugepages} && $conf->{hugepages} == 1024) {
 	$dimm_size = 1024;
     } else {
-	$current_size = 1024;
 	$dimm_size = 512;
     }
 
@@ -164,7 +165,7 @@ sub foreach_dimm{
 	    &$func($conf, $vmid, $name, $dimm_size, $numanode, $current_size, $memory);
 	    return  $current_size if $current_size >= $memory;
 	}
-	$dimm_size *= 2;
+	$dimm_size *= 2 if !$confmem->{max};
     }
 }
 
@@ -175,7 +176,12 @@ sub foreach_reverse_dimm {
     my $current_size = 0;
     my $dimm_size = 0;
 
-    if($conf->{hugepages} && $conf->{hugepages} == 1024) {
+    my $confmem = PVE::QemuServer::parse_memory($conf->{memory});
+    if ($confmem->{max}) {
+       $dimm_id = 63;
+       $current_size = $confmem->{max};
+       $dimm_size = $confmem->{max}/64;
+    } elsif ($conf->{hugepages} && $conf->{hugepages} == 1024) {
 	$current_size = 8355840;
 	$dimm_size = 131072;
     } else {
@@ -197,6 +203,7 @@ sub foreach_reverse_dimm {
 	    return  $current_size if $current_size <= $memory;
 	}
 	$dimm_size /= 2;
+	$dimm_size /= 2 if !$confmem->{max};
     }
 }
 
@@ -263,7 +270,7 @@ sub qemu_memory_hotplug {
 		    die $err;
 		}
 		#update conf after each succesful module hotplug
-		my $mem = {};
+		my $mem = { max => $MAX_MEM };
 		$mem->{current} = $current_size;
 		$conf->{memory} = PVE::QemuServer::print_memory($mem);
 		PVE::QemuConfig->write_config($vmid, $conf);
@@ -289,7 +296,7 @@ sub qemu_memory_hotplug {
 		}
 
 		#update conf after each succesful module unplug
-		my $mem = {};
+		my $mem = { max => $MAX_MEM };
 		$mem->{current} = $current_size;
 		$conf->{memory} = PVE::QemuServer::print_memory($mem);
 
@@ -322,8 +329,9 @@ sub config {
     my $memory = get_current_memory($conf);
 
     my $static_memory = get_static_mem($conf);
+    my $confmem = PVE::QemuServer::parse_memory($conf->{memory});
 
-    if ($hotplug_features->{memory}) {
+    if ($hotplug_features->{memory} || defined($confmem->{max})) {
 	die "NUMA needs to be enabled for memory hotplug\n" if !$conf->{numa};
 	my $MAX_MEM = get_max_mem($conf);
 	die "Total memory is bigger than ${MAX_MEM}MB\n" if $memory > $MAX_MEM;
@@ -334,7 +342,8 @@ sub config {
 	}
 
 	die "minimum memory must be ${static_memory}MB\n" if($memory < $static_memory);
-	push @$cmd, '-m', "size=${static_memory},slots=255,maxmem=${MAX_MEM}M";
+	my $slots = $confmem->{max} ? 64 : 255;
+	push @$cmd, '-m', "size=${static_memory},slots=$slots,maxmem=${MAX_MEM}M";
 
     } else {
 	push @$cmd, '-m', $static_memory;
@@ -403,7 +412,7 @@ sub config {
 	}
     }
 
-    if ($hotplug_features->{memory}) {
+    if ($hotplug_features->{memory} || $confmem->{max}) {
 	foreach_dimm($conf, $vmid, $memory, $sockets, sub {
 	    my ($conf, $vmid, $name, $dimm_size, $numanode, $current_size, $memory) = @_;
 
-- 
2.30.2





More information about the pve-devel mailing list