[pve-devel] [PATCH manager 1/4] API2Tools: rrd: remove O(n^2) lookup for keys
Daniel Kral
d.kral at proxmox.com
Fri Sep 5 15:57:52 CEST 2025
On Fri Sep 5, 2025 at 1:51 PM CEST, Dominik Csapak wrote:
> the idea was that we get any of the 'new' versions on lookup, but that
> lead to iterating through possibly all keys. Since that was called for
> each resource in e.g. /cluster/resources api call, the runtime was
> O(n^2) for the number of resources.
>
> To avoid that, simply look up the currently only valid key here which
> makes this lookup much cheaper.
>
> In my test setup with ~10000 guests, it reduces the time for a call
> to /cluster/resources from ~22s to ~400ms
>
> Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
> ---
> NOTE: this is only a workaround and Aaron is working to making this
> whole part unnecessary, but for now i think this is a good stop-gap
>
> PVE/API2Tools.pm | 7 +++----
> 1 file changed, 3 insertions(+), 4 deletions(-)
>
> diff --git a/PVE/API2Tools.pm b/PVE/API2Tools.pm
> index abe73fa2..863f5f55 100644
> --- a/PVE/API2Tools.pm
> +++ b/PVE/API2Tools.pm
> @@ -52,10 +52,9 @@ sub get_rrd_key {
> return "pve2.3-${type}/${id}";
> }
>
> - # if no old key has been found, we expect on in the newer format: pve-{type}-{version}/{id}
> - # We accept all new versions, as the expectation is that they are only allowed to add new colums as non-breaking change
> - for my $k (keys %$rrd) {
> - return $k if $k =~ m/^pve-\Q${type}\E-\d\d?.\d\/\Q${id}\E$/;
> + my $key = "pve-${type}-9.0/${id}";
> + if (defined($rrd->{$key})) {
> + return $key;
> }
> }
>
Quickly tested this, because I experienced that in a 1500 guests 3-node
cluster too and at least this patch reduced the time for
/cluster/resources from 657.7±39.3 ms to 65.7±6.2 ms with 10 samples,
nice!
Didn't have a mixed-version cluster available currently, so I couldn't
test what @Aaron pointed out in another thread.
Else, consider this:
Tested-by: Daniel Kral <d.kral at proxmox.com>
More information about the pve-devel
mailing list