Re: [PATCH proxmox v3 09/40] resource-scheduling: implement rebalancing migration selection

Daniel Kral
2026-03-31T13:32:09Z

On Tue Mar 31, 2026 at 2:42 PM CEST, Michael Köppl wrote:
> On Mon Mar 30, 2026 at 4:30 PM CEST, Daniel Kral wrote:
>
> [snip]
>
>>
>> + /// Adds the resource stats to the node stats as if the resource is running on the node.
>> + pub fn add_running_resource(&mut self, resource_stats: &ResourceStats) {
>> + self.cpu += resource_stats.cpu;
>> + self.mem += resource_stats.mem;
>> + }
>> +
>> + /// Removes the resource stats from the node stats as if the resource is not running on the node.
>> + pub fn remove_running_resource(&mut self, resource_stats: &ResourceStats) {
>> + self.cpu -= resource_stats.cpu;
>
> From what I can gather, due to how the stats are collected, it could
> occur here that self.cpu < 0. I think it could make sense to do
> something like
>
> self.cpu = f64::max(0.0, self.cpu - resource_stats.cpu);
>
> here to avoid it affecting the node imbalance calculation.
>

Right, thanks!

Even though this shouldn't happen regularly, because for

- the static case node.cpu is made up of all the already running
resources 'cpu' properties summed, and
- the dynamic case node.cpu >= (sum of resources 'cpu'), as it should at
least include the reported resources 'cpu' and more because of other
running resources on the host (e.g. pve backend, zfs, etc.),

this would be a safer option to do regardless. I did a quick benchmark
with a theoretical 10,000 resources 48 nodes cluster and it did not
drastically change the runtime for the worse AFAICT.

I'll wait on more feedback for a v4 or send it as a follow-up depending
on how we apply these patches.

>> + self.mem = self.mem.saturating_sub(resource_stats.mem);
>> + }
>> +
>> /// Returns the current cpu usage as a percentage.
>> pub fn cpu_load(&self) -> f64 {
>> self.cpu / self.maxcpu as f64
>> @@ -38,6 +50,11 @@ impl NodeStats {
>> pub fn mem_load(&self) -> f64 {
>> self.mem as f64 / self.maxmem as f64
>> }
>> +
>> + /// Returns a combined node usage as a percentage.
>> + pub fn load(&self) -> f64 {
>> + (self.cpu_load() + self.mem_load()) / 2.0
>> + }
>> }
>
> [snip]