[pve-devel] [RFC ha-manager 3/3] manager/usage: cache static service stats to avoid overhead
Fiona Ebner
f.ebner at proxmox.com
Fri Nov 18 12:32:23 CET 2022
Benchmarked recompute_online_node_usage() again with ~300 HA services
(minimal containers) running on my virtual test cluster.
Timings before this patch were between 0.007 - 0.016 seconds
Timings after this patch were between 0.0035 - 0.006 seconds
So only about twice as fast unfortunately. Reducing the number of
recompute_online_node_usage() calls might be necessary after all.
Signed-off-by: Fiona Ebner <f.ebner at proxmox.com>
---
src/PVE/HA/Manager.pm | 1 +
src/PVE/HA/Resources/PVECT.pm | 1 +
src/PVE/HA/Resources/PVEVM.pm | 1 +
src/PVE/HA/Usage/Static.pm | 13 ++++++++++---
4 files changed, 13 insertions(+), 3 deletions(-)
diff --git a/src/PVE/HA/Manager.pm b/src/PVE/HA/Manager.pm
index 69bfbc3..c9a9f14 100644
--- a/src/PVE/HA/Manager.pm
+++ b/src/PVE/HA/Manager.pm
@@ -447,6 +447,7 @@ sub manage {
for (;;) {
my $repeat = 0;
+ $haenv->get_static_guest_stats(); # to cache the info
$self->recompute_online_node_usage();
foreach my $sid (sort keys %$ss) {
diff --git a/src/PVE/HA/Resources/PVECT.pm b/src/PVE/HA/Resources/PVECT.pm
index c10d024..4c295f3 100644
--- a/src/PVE/HA/Resources/PVECT.pm
+++ b/src/PVE/HA/Resources/PVECT.pm
@@ -155,6 +155,7 @@ sub remove_locks {
sub get_static_stats {
my ($class, $haenv, $id, $service_node, $cache) = @_;
+ # NOTE that cache might not contain the full config
my $conf = $cache->{$id} ||= PVE::LXC::Config->load_config($id, $service_node);
return {
diff --git a/src/PVE/HA/Resources/PVEVM.pm b/src/PVE/HA/Resources/PVEVM.pm
index ca7fbc4..b6234be 100644
--- a/src/PVE/HA/Resources/PVEVM.pm
+++ b/src/PVE/HA/Resources/PVEVM.pm
@@ -178,6 +178,7 @@ sub remove_locks {
sub get_static_stats {
my ($class, $haenv, $id, $service_node, $cache) = @_;
+ # NOTE that cache might not contain the full config
my $conf = $cache->{$id} ||= PVE::QemuConfig->load_config($id, $service_node);
my $defaults = PVE::QemuServer::load_defaults();
diff --git a/src/PVE/HA/Usage/Static.pm b/src/PVE/HA/Usage/Static.pm
index 73ce836..05b876d 100644
--- a/src/PVE/HA/Usage/Static.pm
+++ b/src/PVE/HA/Usage/Static.pm
@@ -20,6 +20,7 @@ sub new {
return bless {
'node-stats' => $node_stats,
'service-stats' => {},
+ 'service-stats-cache' => $haenv->get_static_guest_stats(1),
haenv => $haenv,
scheduler => $scheduler,
'service-counts' => {}, # Service count on each node. Fallback if scoring calculation fails.
@@ -65,13 +66,19 @@ my sub get_service_usage {
return $self->{'service-stats'}->{$sid} if $self->{'service-stats'}->{$sid};
- my (undef, $type, $id) = $self->{haenv}->parse_sid($sid);
+ my $haenv = $self->{haenv};
+
+ my (undef, $type, $id) = $haenv->parse_sid($sid);
my $plugin = PVE::HA::Resources->lookup($type);
- my $stats = eval { $plugin->get_static_stats($self->{haenv}, $id, $service_node); };
+ my $stats = eval {
+ $plugin->get_static_stats($haenv, $id, $service_node, $self->{'service-stats-cache'});
+ };
if (my $err = $@) {
# config might've already moved during a migration
- $stats = eval { $plugin->get_static_stats($self->{haenv}, $id, $migration_target); } if $migration_target;
+ if ($migration_target) {
+ $stats = eval { $plugin->get_static_stats($haenv, $id, $migration_target); };
+ }
die "did not get static service usage information for '$sid' - $err\n" if !$stats;
}
--
2.30.2
More information about the pve-devel
mailing list