From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [IPv6:2a01:7e0:0:424::9]) by lore.proxmox.com (Postfix) with ESMTPS id AB7C71FF138 for ; Wed, 18 Mar 2026 23:35:15 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id CD6C7B93A; Wed, 18 Mar 2026 23:35:27 +0100 (CET) Message-ID: <42858bd4-6d25-4d38-ba20-b1f2b9c5a208@proxmox.com> Date: Wed, 18 Mar 2026 23:34:52 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Beta Subject: Re: [RFC ha-manager 16/21] sim: hardware: add set-dynamic-stats for services To: Dominik Rusovac References: <20260217141437.584852-1-d.kral@proxmox.com> <20260217141437.584852-30-d.kral@proxmox.com> Content-Language: en-US From: Thomas Lamprecht In-Reply-To: <20260217141437.584852-30-d.kral@proxmox.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1773873250026 X-SPAM-LEVEL: Spam detection results: 0 AWL -1.076 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment RCVD_IN_VALIDITY_CERTIFIED_BLOCKED 0.408 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. RCVD_IN_VALIDITY_RPBL_BLOCKED 0.819 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. RCVD_IN_VALIDITY_SAFE_BLOCKED 0.903 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Message-ID-Hash: NTYFTTPI5MBZPZ4GT64GFEJZMZBDW7P6 X-Message-ID-Hash: NTYFTTPI5MBZPZ4GT64GFEJZMZBDW7P6 X-MailFrom: t.lamprecht@proxmox.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: pve-devel@lists.proxmox.com X-Mailman-Version: 3.3.10 Precedence: list List-Id: Proxmox VE development discussion List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: Am 17.02.26 um 15:17 schrieb Daniel Kral: > From: Dominik Rusovac > > This adds command set-dynamic-stats, to simulate the cpu load (cpu) and > memory usage (mem in MiB) of a service, as well as command > set-static-stats, to configure the number of cores (maxcpu) and RAM > (maxmem in MiB) of a service. In addition to using the designated > command, dynamic service stats can be specified beforehand in file > dynamic_service_stats. > > Upon calling set-dynamic-stats on some service, the dynamic stats of the > node this very service is running on will be aggregated accordingly. > > Signed-off-by: Dominik Rusovac > Signed-off-by: Daniel Kral > --- > src/PVE/HA/Sim/Hardware.pm | 130 +++++++++++++++++++++++++++++++++++++ > 1 file changed, 130 insertions(+) > > diff --git a/src/PVE/HA/Sim/Hardware.pm b/src/PVE/HA/Sim/Hardware.pm > index ec135e09..910f9718 100644 > @@ -744,6 +796,7 @@ sub get_cfs_state { > # service lock/unlock [lockname] > # service add [] [] > # service set-static-stats > +# service set-dynamic-stats > # service delete > sub sim_hardware_cmd { > my ($self, $cmdstr, $logid) = @_; > @@ -911,6 +964,24 @@ sub sim_hardware_cmd { > } else { > die "sim_hardware_cmd: unknown target stat '$target' for '$action' command"; > } > + } elsif ($action eq 'set-dynamic-stats') { > + my ($target, $val) = ($params[0], $params[1]); > + > + if (!$target) { > + die "sim_hardware_cmd: missing target stat for '$action' command"; > + } elsif ($target eq "cpu") { > + die "sim_hardware_cmd: missing value for '$action $target' command" > + if !$val; > + > + $self->set_dynamic_service_stats($sid, { $target => 0.0 + $val }); > + } elsif ($target eq "mem") { > + die "sim_hardware_cmd: missing value for '$action $target' command" > + if !$val; > + > + $self->set_dynamic_service_stats($sid, { $target => $val * 1024**2 }); > + } else { > + die "sim_hardware_cmd: unknown target stat '$target' for '$action' command"; > + } > } elsif ($action eq 'delete') { > > $self->delete_service($sid); > @@ -1135,6 +1206,27 @@ sub get_static_service_stats { FWIW, we could avoid some code duplication between dynamic and static set and reduce the test cmd's needed by applying something like below on top at this point. The change below basically leverage's the rather fresh perl 5.40's "for loop with multiple iteration variables" [0] (which is fine to use for PVE 9, we won't backport this to PVE 8 - where the perl version would be to old - anyway), and merging the two branches for set-static-stats and set-dynamic-stats commands by using a hash for mapping the conversions of the different stats/cmds (could be written maybe even nicer). Then such chains like: info 220 cmdlist: execute service vm:103 set-dynamic-stats cpu 3.9 info 220 cmdlist: execute service vm:103 set-dynamic-stats mem 6517 info 220 cmdlist: execute service vm:104 set-dynamic-stats cpu 6.7 info 220 cmdlist: execute service vm:104 set-dynamic-stats mem 8001 info 220 cmdlist: execute service vm:105 set-dynamic-stats cpu 1.8 info 220 cmdlist: execute service vm:105 set-dynamic-stats mem 1201 info 220 cmdlist: execute service vm:106 set-dynamic-stats cpu 2.1 info 220 cmdlist: execute service vm:106 set-dynamic-stats mem 1211 info 220 cmdlist: execute service vm:107 set-dynamic-stats cpu 0.9 info 220 cmdlist: execute service vm:107 set-dynamic-stats mem 1191 could become: info 220 cmdlist: execute service vm:103 set-dynamic-stats cpu 3.9 mem 6517 info 220 cmdlist: execute service vm:104 set-dynamic-stats cpu 6.7 mem 8001 info 220 cmdlist: execute service vm:105 set-dynamic-stats cpu 1.8 mem 1201 info 220 cmdlist: execute service vm:106 set-dynamic-stats cpu 2.1 mem 1211 info 220 cmdlist: execute service vm:107 set-dynamic-stats cpu 0.9 mem 1191 I.e., get basically cut in half without really loosing expressiveness (IMO). [0]: https://perldoc.perl.org/perlexperiment#for-loop-with-multiple-iteration-variables ----8<---- diff --git a/src/PVE/HA/Sim/Hardware.pm b/src/PVE/HA/Sim/Hardware.pm index dc95593..e0a1cce 100644 --- a/src/PVE/HA/Sim/Hardware.pm +++ b/src/PVE/HA/Sim/Hardware.pm @@ -795,8 +795,8 @@ sub get_cfs_state { # service stop # service lock/unlock [lockname] # service add [] [] -# service set-static-stats -# service set-dynamic-stats +# service set-static-stats [maxcpu ] [maxmem ] +# service set-dynamic-stats [cpu ] [mem ] # service delete sub sim_hardware_cmd { my ($self, $cmdstr, $logid) = @_; @@ -946,41 +946,29 @@ sub sim_hardware_cmd { $params[2] || 0, ); - } elsif ($action eq 'set-static-stats') { - my ($target, $val) = ($params[0], $params[1]); + } elsif ($action eq 'set-static-stats' || $action eq 'set-dynamic-stats') { + die "sim_hardware_cmd: missing target stat for '$action' command" + if !@params; - if (!$target) { - die "sim_hardware_cmd: missing target stat for '$action' command"; - } elsif ($target eq "maxcpu") { - die "sim_hardware_cmd: missing value for '$action $target' command" - if !$val; + my $conversions = $action eq 'set-static-stats' + ? { maxcpu => sub { 0.0 + $_[0] }, maxmem => sub { $_[0] * 1024**2 } } + : { cpu => sub { 0.0 + $_[0] }, mem => sub { $_[0] * 1024**2 } }; - $self->set_static_service_stats($sid, { $target => 0.0 + $val }); - } elsif ($target eq "maxmem") { + my %new_stats; + for my ($target, $val) (@params) { die "sim_hardware_cmd: missing value for '$action $target' command" - if !$val; + if !defined($val); + + my $convert = $conversions->{$target} + or die "sim_hardware_cmd: unknown target stat '$target' for '$action' command"; - $self->set_static_service_stats($sid, { $target => $val * 1024**2 }); - } else { - die "sim_hardware_cmd: unknown target stat '$target' for '$action' command"; + $new_stats{$target} = $convert->($val); } - } elsif ($action eq 'set-dynamic-stats') { - my ($target, $val) = ($params[0], $params[1]); - if (!$target) { - die "sim_hardware_cmd: missing target stat for '$action' command"; - } elsif ($target eq "cpu") { - die "sim_hardware_cmd: missing value for '$action $target' command" - if !$val; - - $self->set_dynamic_service_stats($sid, { $target => 0.0 + $val }); - } elsif ($target eq "mem") { - die "sim_hardware_cmd: missing value for '$action $target' command" - if !$val; - - $self->set_dynamic_service_stats($sid, { $target => $val * 1024**2 }); + if ($action eq 'set-static-stats') { + $self->set_static_service_stats($sid, \%new_stats); } else { - die "sim_hardware_cmd: unknown target stat '$target' for '$action' command"; + $self->set_dynamic_service_stats($sid, \%new_stats); } } elsif ($action eq 'delete') {