all lists on lists.proxmox.com
 help / color / mirror / Atom feed
From: Daniel Kral <d.kral@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [PATCH ha-manager 14/16] lrm: read service config once per work iteration
Date: Mon, 20 Jul 2026 14:37:03 +0200	[thread overview]
Message-ID: <20260720123705.216089-15-d.kral@proxmox.com> (raw)
In-Reply-To: <20260720123705.216089-1-d.kral@proxmox.com>

Make update_lrm_status() read and parse the HA resources config once per
work() iteration.

This significantly reduces the time spent reading and parsing the HA
resource config every time run_workers() is called and every time a LRM
worker's result is collected with handle_service_exitcode().

This does not change the current behavior as the HA resource config and
vmlist, which are used for the return value of the read_service_config()
in the PVE2 environment, are only updated after every cfs_update().
However, cfs_update() is only called before each work() iteration in
PVE::HA::LRM::do_one_iteration() and in PVE::HA::Env::PVE2::after_fork()
and handle_service_exit_code() is only called from
resource_command_finished(), which in turn is only called from the main
thread and not the worker threads (i.e., after_fork() is not called).

A test startup of 768 HA resources on a single node at the same time
showed ~1,250% less calls to checked_resources_config() (from 10,333 to
82 calls) and ~14,320% less calls to parse_sid() (from 15,639,537 to
109,198 calls).

Additionally, this reduces the inclusive average execution time per call
for several subroutines where the HA resource config was read within:

+---------------------------+---------------+--------------+
|        Subroutine         | Before Change | After Change |
+---------------------------+---------------+--------------+
| check_active_workers      | 327ms         | 11.6ms       |
| resource_command_finished | 22.7ms        | 2.81ms       |
| handle_service_exitcode   | 21.1ms        | 10µs         |
+---------------------------+---------------+--------------+

The profiling was done on a physical host with Devel::NYTProf 6.14 [0].

[0] https://metacpan.org/pod/Devel::NYTProf

Signed-off-by: Daniel Kral <d.kral@proxmox.com>
---
 src/PVE/HA/LRM.pm | 14 +++++++++-----
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/src/PVE/HA/LRM.pm b/src/PVE/HA/LRM.pm
index 1a093e8e..5f77580c 100644
--- a/src/PVE/HA/LRM.pm
+++ b/src/PVE/HA/LRM.pm
@@ -41,6 +41,9 @@ sub new {
         mode => 'active',
         cluster_state_update => 0,
         active_idle_rounds => 0,
+        # service_config in current work() iteration
+        # does contain all HA resources, users must filter for the assigned node
+        service_config => {},
         # service_status from manager_status in current work() iteration
         # does contain all HA resources, users must filter for the assigned node
         service_status => {},
@@ -213,10 +216,11 @@ sub flush_lrm_status {
 =head3 $self->update_lrm_status()
 
 Updates the internal LRM status properties to reflect the state given by the
-C<L<manager_status|PVE::HA::Env::read_manager_status()>>.
+C<L<manager_status|PVE::HA::Env::read_manager_status()>> and
+C<L<checked service_config|PVE::HA::Env::read_service_config()>>.
 
 The internal LRM status properties that are updated are C<node_status>,
-C<service_status>, and C<shutdown_request>.
+C<service_config>, C<service_status>, and C<shutdown_request>.
 
 Returns 1 if the update was successful, otherwise returns undef.
 
@@ -232,6 +236,7 @@ sub update_lrm_status {
         $haenv->log('err', "updating service status from manager failed: $err");
         return undef;
     } else {
+        $self->{service_config} = $haenv->read_service_config();
         $self->{service_status} = $ms->{service_status} || {};
         my $nodename = $haenv->nodename();
         $self->{node_status} = $ms->{node_status}->{$nodename} || 'unknown';
@@ -658,13 +663,12 @@ sub work {
 sub run_workers {
     my ($self) = @_;
 
-    my $haenv = $self->{haenv};
+    my ($haenv, $sc) = $self->@{qw(haenv service_config)};
 
     my $starttime = $haenv->get_time();
 
     # number of workers to start, if 0 we exec the command directly without forking
     my $max_workers = $haenv->get_max_workers();
-    my $sc = $haenv->read_service_config();
 
     my $worker = $self->{workers};
     # we only got limited time but want to ensure that every queued worker is scheduled
@@ -909,7 +913,7 @@ sub handle_service_exitcode {
     my $haenv = $self->{haenv};
     my $tries = $self->{restart_tries};
 
-    my $sc = $haenv->read_service_config();
+    my $sc = $self->{service_config};
 
     my $max_restart = 0;
 
-- 
2.47.3





  parent reply	other threads:[~2026-07-20 12:39 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-20 12:36 [PATCH-SERIES ha-manager 00/16] some sid parsing and LRM speedup improvements Daniel Kral
2026-07-20 12:36 ` [PATCH ha-manager 01/16] make tidy Daniel Kral
2026-07-20 12:36 ` [PATCH ha-manager 02/16] resources: remove commented ipaddr resource type Daniel Kral
2026-07-20 12:36 ` [PATCH ha-manager 03/16] tree-wide: use the term vmid instead of name when referring to VMs/CTs Daniel Kral
2026-07-20 12:36 ` [PATCH ha-manager 04/16] api: resources: remove unused return values at parse_sid callsites Daniel Kral
2026-07-20 12:36 ` [PATCH ha-manager 05/16] make parse_sid always return an array Daniel Kral
2026-07-20 12:36 ` [PATCH ha-manager 06/16] config: use early returns in parse_sid Daniel Kral
2026-07-20 12:36 ` [PATCH ha-manager 07/16] config: make update_single_resource_config_inplace only allow sids Daniel Kral
2026-07-20 12:36 ` [PATCH ha-manager 08/16] introduce separate parse_vmid_or_sid helper subroutine Daniel Kral
2026-07-20 12:36 ` [PATCH ha-manager 09/16] drop the unmodified sid return array entry value from parse_sid Daniel Kral
2026-07-20 12:36 ` [PATCH ha-manager 10/16] lrm: document and initialize LRM instance properties Daniel Kral
2026-07-20 12:37 ` [PATCH ha-manager 11/16] lrm: rename update_lrm_status to flush_lrm_status Daniel Kral
2026-07-20 12:37 ` [PATCH ha-manager 12/16] lrm: rename update_service_status to update_lrm_status Daniel Kral
2026-07-20 12:37 ` [PATCH ha-manager 13/16] lrm: update the service status once per work iteration Daniel Kral
2026-07-20 12:37 ` Daniel Kral [this message]
2026-07-20 12:37 ` [PATCH ha-manager 15/16] lrm: compute valid service uids hash set " Daniel Kral
2026-07-20 12:37 ` [PATCH ha-manager 16/16] lrm: prune non-existent HA resources from results " Daniel Kral

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260720123705.216089-15-d.kral@proxmox.com \
    --to=d.kral@proxmox.com \
    --cc=pve-devel@lists.proxmox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal