From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from gate001.proxmox.com (gate001.proxmox.com [IPv6:2a0f:8001:1:32::40]) by lore.proxmox.com (Postfix) with ESMTPS id 773EC1FF0AD for ; Sun, 20 Sep 2026 18:57:25 +0200 (CEST) Received: from gate001.proxmox.com (localhost.localdomain [127.0.0.1]) by gate001.proxmox.com (Proxmox) with ESMTP id 6CFDA21580; Sun, 20 Sep 2026 18:57:23 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=UpAJ/p0f98tD349UcFAzq6/6lHg65qiHF8ZHfaack1gYql2tHSD4xsq37mwQwdYrecDk90M7s7we0az8gLazWWQW0puR59xs5jwiDmzP5xuC0+cBrMaP5lv8NM6cqUnV126tKbETe2S61cDMHvBNjIeodVqw6W7Q3DUmYQkoaaZ31NvDZgr2MiRdj9z+dYjC3rQjK54IiHi+Yw1PQk1HIYmCZYya+OBMV1D174N/knDdNxEyENniromJHvE4XiGIf7LxLIfmj/v8s6qUz00030SBm8OCnfm3WpTjhPud4vYihsLioYnOzDj065eMJoGca2xbpUVWXkk7xowoOe+QXA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=rEH4SJH8rZfbLXUMH4ygLN67CIdR1QJteU7n9aMNY6o=; b=R8WjEoa4KR/SXaF6V8pVNb8PZJtlGZAhmiIarcPWpyUyKs2dVvo6BjnM8foivWcndofMJ/XqaYrkciMNS/r6MgyleXLg2Ff0B2k1/D5GqJFmW6Kc6qe3f9uqTVTQepBtuCJAdXFRd4p9jN9sB0AkUUh/DJhFzJzuxHK2Aa46sL8Y+k5avNwZrSnrkvCQXpea2sKZC0a18olCS0Ze5ce3Z3WLvcPP1EXv4CE/aET+1OFB3l5yok9sep1RoIZ21KXCOg0GrJARta9E4fAxLwAAeeAN7Mbnxd7ZswXLAAWMFwc0IgXDbCneOLHEHicJ6l0C/SuuixAqVy4cJ8VvbUEBKA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=ryomherold.dk; dmarc=pass action=none header.from=ryomherold.dk; dkim=pass header.d=ryomherold.dk; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=RyomHerold.dk; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=rEH4SJH8rZfbLXUMH4ygLN67CIdR1QJteU7n9aMNY6o=; b=P7Kmb5VbyF4pM/VTDauSub0NutgTtdZbFvYgGabT9TR72yVwCskzLg2giAHawzeNGTj7FvVMBm7mYH0fkOAcOc9/Fi6hB9HX2aZEGWnBCs7U5iuD8ZeH1UuXBAPAP0/eZsDAT6PB3wTfOJsA9CTAvaGsP+7Yn+uyj4WkK5xlVlBwwsmoqyK3BIpufYrCIw5BKBHFDr0tNAxAX/PSjtW9I86ltz/xUYJlmmr5G7o+ne4GDAWf2Nu6Qf50n7hh8RSSsCYSJ5UEsnObWvRUoxhh7A8514PygMln+zF1TDznlUtMloCk4uSJ1qLOY5QDjBGsKiJzv1y4+j9TvaBNNcdMVQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=RyomHerold.dk; From: Michael Ryom To: pve-devel@lists.proxmox.com Subject: [PATCH ha-manager 2/7] env: dynamic service stats: use host-side memory footprint of guests Date: Sun, 20 Sep 2026 18:22:09 +0200 Message-ID: <20260920162220.574802-3-Michael@RyomHerold.dk> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260920162220.574802-1-Michael@RyomHerold.dk> References: <20260920162220.574802-1-Michael@RyomHerold.dk> Content-Transfer-Encoding: 8bit Content-Type: text/plain X-ClientProxiedBy: TL2P290CA0008.ISRP290.PROD.OUTLOOK.COM (2603:1096:950:2::11) To AS8PR10MB7231.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:20b:619::17) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AS8PR10MB7231:EE_|AM0PR10MB883391:EE_ X-MS-Office365-Filtering-Correlation-Id: a110282b-c7eb-4897-2e35-08df173369d7 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|23010399003|376014|1800799024|366016|10067099003|6133799003|22082099003|18002099003|56012099006; X-Microsoft-Antispam-Message-Info: abMt4/3lLo/Vj0xCUNB+3FMTbuxFmEVjcOAYLDur2e3i17CgRVrhYQwNFnbSuEXx9TyBTjUJGofuLsDirUb1j2o1tCdbJbcIbIdqWHxcodsVJfVUvSklbo/q8/xq+D0o671S33H5/Sc6/JBDXEykalRSyzjOL06iLbRZBE+JkvLpy2V0Eva8nt2/I148iOe6t0iuiZS44uCnbq/qYSjWI/QwteCDusMk+9EGFQ/9eofMdZW+7baCYg/kHjshzkfts/akh99MHeCCHZtZSqcDSZahcpWiOkDVHgbP2NjFz0cIxLrdymtjjKD00dr8bzTafCP+hxTHQpmNpovbGgqTi6n8u06B/ZWljx2F02FGuBG4p+bc8FCOJ7CLrYrhs8xaWjxVmrkEPc6mZo6LGaLXvvTuc0RExdLmJsJhk6lyENZL8OgJvzxwdS8R547/lZFaK4bnnZSvLTZgQ+ZrFltvIweX9eqqO6dNTGGzqz1lX24oMAFuGrbS4hd4fWL5VDScMwsh6EMUJzQphLDOcxvhxJqnLYjnK9TH03fqaXZoxvc/K9friV8WxTkzaKNu13hbiPbsbqbdp9q3FcAcAmDsL6YBaTMyZKO7zij1jEFRIbrK2O9/WW/EesrLjxnaPEisJXq/Kb/hwXDFbEEDGs4QVGu7kGNVfoskObLpVKKLKzY= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AS8PR10MB7231.EURPRD10.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(23010399003)(376014)(1800799024)(366016)(10067099003)(6133799003)(22082099003)(18002099003)(56012099006);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?K3uYrshmHvbQcDmp8reX7/ifJU6RaaYMMiY53oJMtwMxmue2bhTJXDdNDfc7?= =?us-ascii?Q?+PTcLtxbuSea8tS06btmYmGZBAqPBZQTDbnq4x3eUeqc0rX/sHTDnZ9Pqgbd?= =?us-ascii?Q?HIHxljWQKsxN/lqXGl8zgEP8xN9hVzq/Uu9FQ2y5Hq+CpX6enUweF7KkWJZD?= =?us-ascii?Q?/2P6U7re2fqhMEOmsx4gZx+FOju9MLJL938b8U2Ng/jUQ6Ccfy969Fy+eZkt?= =?us-ascii?Q?cov0GAcUnld+agoUyPyJRZIm8CMgO7GVv83q1/RzG0y1BOvcJmPlp9PtGhg/?= =?us-ascii?Q?k/N5W4scdQY9yLguQwp8iKdB462gN0yalzXkWDjPmrjBTdWwq858+GA64RSk?= =?us-ascii?Q?RZyvH7MApD+r3ChKEFpBoUv171RpOUg5CtT8mv0ha1J81Zp/EJsN+8AIb+2h?= =?us-ascii?Q?+5/X7Z4f+iiXlYTwmoYrFPBACUvMT1XjuiqnUl/dNjegbS7w3RZuzKkzJmLa?= =?us-ascii?Q?TRdpOOXhTWWpXD5ElZABHwYsKlV8avHVNOtTDpiHgmxkOEE+HoCa95F34YTF?= =?us-ascii?Q?lZ2GwiDEehLN0Ym9fmPtp2qRXLhndF3A64RPy+8ZhOFTDJqKcD2DJhNVGAgV?= =?us-ascii?Q?pyicUCf0gyJaifnU0RrRY3udZzWep3sD5z4Ax9i1fVXsr/C3gMVEWTMLH/IH?= =?us-ascii?Q?YrhmrWOcvuADCebWge78VY34Dm4iWtiCxQZaNpXzPqCXM/mdOeJlFUKgyBb6?= =?us-ascii?Q?ZdRLGacKAWjDi895oM7y8/1nfImIoN+AVkJSxe5k2N5BiMMrHZH7agrSVa/x?= =?us-ascii?Q?i/prFFmOTosEWs4E+kS2cY8dKceel2RmK8pETPgSMsjZ+jkJpiAP2dSPq1Zi?= =?us-ascii?Q?BKDX/wEZbF7N3p+UBKogLy4QtTgKJaSedVcYAoOP3/aKR/jFcSw7Cg76Z8d1?= =?us-ascii?Q?pI8mjkEyPEI8G/ZgIOW40EzCTLSDj26j5k3xqxpiRo50tQheAQl2UIBqBFjj?= =?us-ascii?Q?1ESTZW+aaAbVvvdVif5MppI1G0oBuGLL3hi+Bv4wPNtaSGniJ8sXRY7X0HM1?= =?us-ascii?Q?3FhiVZzQ3dT6YFymaIQjVoAQ04sspiQBAhkKhwodEbG6cMIXATJFLNJWXIYS?= =?us-ascii?Q?MY87EM6lUeB9K/tx0JX/kvbHZU+6kOKM1L9U37esNrAugzgUH6YNJA+3noiO?= =?us-ascii?Q?wYECnxUbD7taPz9HT7gEQl34M/FoIGbHtYrmhCxPcyNTR72Se3L9DBIs/XdQ?= =?us-ascii?Q?DHD1OUeNs9ZFv1TfBhJDZznUaQIWEYWtYWzyqCAu8mWeC97tjHAkYDk9c6Da?= =?us-ascii?Q?IraBSjAjQ7Qf6dvKY3TZpPoWobDPG7fqnD0PQ05uukTIq9O0i10LiDd3x7+M?= =?us-ascii?Q?Zszlj+3zf2dOEHNE17S9cZXkk38670Bx0xmQbUo5k+4bdpT1BOmJwMDUkxdV?= =?us-ascii?Q?adhwsVyuhkKch6JhnESpHa+kQj8r5jEYZaW0ILjrkbNFHlGakMi4/osw5CNU?= =?us-ascii?Q?iHpCzI6ctaeQ33flSDbJO44EiJ2CBb2UnBAjWKehC1PNkwnJ0vdfpgb/9sIq?= =?us-ascii?Q?+hrEZkpUJqYQEGnH9nVD5x1ujV6XORqAVY0ieHDgEbPr392wKamWojnl8lss?= =?us-ascii?Q?+5me1h1cpfHHNTVtf3ZhFjuQKeyTY1+xLZe8wHQ7krylEUVasif59Rb2ghDX?= =?us-ascii?Q?GxNpW+7osBX9I61+h64IapUaPI5XKrS01uCeMMaGxrsimpQwqR+kWadxiRpp?= =?us-ascii?Q?+iRulsY3FDReDRS8FDye4psDcaxeFi0gj95hZvinQ7+oZFf5r5QCjWbw1Njo?= =?us-ascii?Q?++WXIii2cA=3D=3D?= X-OriginatorOrg: RyomHerold.dk X-MS-Exchange-CrossTenant-Network-Message-Id: a110282b-c7eb-4897-2e35-08df173369d7 X-MS-Exchange-CrossTenant-AuthSource: AS8PR10MB7231.EURPRD10.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Sep 2026 16:22:49.9886 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 26a2499e-4646-4888-a695-c64736a56807 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: uNLLdlraG34JHucqQWzwcEKwG7H2YzYVPFRQYIixe9QrFEk5DN/qcVNEYqUZ5O8LfrkA3Q/BnihP+Ja91KCDvg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM0PR10MB883391 X-SPAM-LEVEL: Spam detection results: 0 DKIM_SIGNED 0.1 Message has a DKIM or DK signature, not necessarily valid DKIM_VALID -0.1 Message has at least one valid DKIM or DK signature DKIM_VALID_AU -0.1 Message has a valid DKIM or DK signature from author's domain DKIM_VALID_EF -0.1 Message has a valid DKIM or DK signature from envelope-from domain DMARC_PASS -0.1 DMARC pass policy RCVD_IN_DNSWL_NONE -0.0001 Sender listed at https://www.dnswl.org/, no trust SPF_HELO_PASS -0.001 SPF: HELO matches SPF record SPF_PASS -0.001 SPF: sender matches SPF record Message-ID-Hash: KULO52BLBXMIKTD3YKFGOEYYS4DJBZFI X-Message-ID-Hash: KULO52BLBXMIKTD3YKFGOEYYS4DJBZFI X-MailFrom: Michael@RyomHerold.dk 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: Michael Ryom X-Mailman-Version: 3.3.10 Precedence: list List-Id: Proxmox VE development discussion List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: The dynamic service stats used the 'mem' RRD column of the guests, which is the guest-reported memory usage (total_mem - free_mem) whenever the balloon driver is active, and can be considerably lower than the actual host-side footprint of the guest process (QEMU overhead, page cache still mapped, etc.). The node stats, on the other hand, always contain the full host view. The scheduler simulates a migration by subtracting exactly the service's stats from the source node and adding them to the target node. With the guest-reported value, the predicted post-migration state is systematically off by the difference between guest-reported and host-side usage (over 1 GiB for a mid-size VM). This bias is of the same order of magnitude as the trigger condition of the automatic load balancer on a two-node cluster with a single dominant resource, and contributes to a resource being moved back and forth. Use the 'memhost' column (host-side cgroup usage, without KSM) instead and fall back to 'mem' if it is unset: containers do not broadcast 'memhost', because their 'mem' already is the host-side cgroup value. Signed-off-by: Michael Ryom --- src/PVE/HA/Env/PVE2.pm | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/PVE/HA/Env/PVE2.pm b/src/PVE/HA/Env/PVE2.pm index 782d19d..8c2b03d 100644 --- a/src/PVE/HA/Env/PVE2.pm +++ b/src/PVE/HA/Env/PVE2.pm @@ -46,6 +46,7 @@ use constant { RRD_VM_INDEX_CPU => 6, RRD_VM_INDEX_MAXMEM => 7, RRD_VM_INDEX_MEM => 8, + RRD_VM_INDEX_MEMHOST => 15, }; # rrd entry indices for PVE nodes @@ -598,11 +599,22 @@ sub get_dynamic_service_stats { # NOTE the guests' broadcasted vmstatus() caps maxcpu at the node's maxcpu my $maxcpu = ($rrdentry->[RRD_VM_INDEX_MAXCPU] || 0.0) + 0.0; + # prefer the host-side memory footprint over 'mem', which is the + # guest-reported usage (total_mem - free_mem) when the balloon driver + # is active and can be considerably lower than what running the guest + # actually consumes on the node; the node stats contain the full host + # view, so mixing in the guest view makes the scheduler's prediction + # of the post-migration state systematically off + # + # 'memhost' is only broadcasted for VMs, for CTs 'mem' already is the + # host-side (cgroup) usage + my $mem = int($rrdentry->[RRD_VM_INDEX_MEMHOST] || $rrdentry->[RRD_VM_INDEX_MEM] || 0); + $stats->{$sid}->{usage} = { maxcpu => $maxcpu, cpu => (($rrdentry->[RRD_VM_INDEX_CPU] || 0.0) + 0.0) * $maxcpu, maxmem => int($rrdentry->[RRD_VM_INDEX_MAXMEM] || 0), - mem => int($rrdentry->[RRD_VM_INDEX_MEM] || 0), + mem => $mem, }; } -- 2.47.3