Owner's pending work, committed ahead of the pv1-2 change it underlies: - lab1.yaml: worker template lab1-worker-2g (2048 MiB, decision #16), MD rollout maxSurge 0 / maxUnavailable 1, ProxmoxCluster schedulerHints.memoryAdjustment 160 (#17) - cluster-autoscaler values: RBAC for proxmoxmachinetemplates, aggressive scale-down profile, Cilium startup-taint; runbook Steps 4-7 and troubleshooting rows - inflate test pods 512Mi; decisions #16/#17; session note on the memory overcommit - docs/future-tasks.md convention (CLAUDE.md, README) with the namespace-per-cluster task - AGENTS.md; allowlist entries in .claude/settings.json Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
3.5 KiB
3.5 KiB
Session: CAPMOX memory accounting and overcommit on pv1-1
Created: 2026-09-28 10:07 CEST
Question
can we configure capmox so that it works with real available memory instead of calculation what stopped vms would use if somebody would start them? also can we configure memory overprovisioning on proxmox node?
Context: during Step 7, new workers failed with cannot reserve …B of memory on node pv1-1. The
host had about 12.8 GiB actually available, but CAPMOX counted 168 MB. Later this deadlocked the
2 GiB worker rollout (see the phase-1 troubleshooting table).
What was checked (2026-09-28)
- CAPMOX source for v0.9.1 (the latest tag) and
main:pkg/proxmox/goproxmox/api_client.goGetReservableMemoryBytes;internal/service/scheduler/vmscheduler.go;api/v1alpha2/proxmoxcluster_types.goSchedulerHints;api/v1alpha2/proxmoxmachine_types.go;internal/webhook/proxmoxcluster_webhook.go.
pv1-1(read-only):qm list, node memory status;- KSM:
ksmtunedactive,/sys/kernel/mm/ksm/run= 0,pages_sharing= 0; - 8 GiB swap;
- VM 103 has no
balloon:line.
Findings
- No "real available memory" mode in any CAPMOX release.
mainis identical to v0.9.1. The reservable memory isnode total × memoryAdjustment/100minus the configuredmaxmemof every non-template VM (running or stopped) and every container. That's deliberate: real usage is racy, because VMs grow into their configured memory later. Using free memory would need an upstream change. - The only knob is
ProxmoxCluster.spec.schedulerHints.memoryAdjustment(percent, default 100):> 100allows bounded overcommit;0turns the memory check off completely (it then only checks request ≤ host total).- The ProxmoxCluster update webhook only validates the control-plane endpoint, so the hint can be changed on a live cluster. The scheduler reads it whenever it places a VM, and the stuck ProxmoxMachine retries.
- Sizing for
lab1: everything except the workers is 21 GiB configured (VMs 100, 102, 201, 1001, 2001, 160549). 5 workers × 2 GiB brings that to 31 GiB, and the host has 29.16 GiB, somemoryAdjustment ≥ 107. At 120 there's 35 GiB reservable, which fits max 5 workers with about 4 GiB to spare. - Proxmox itself enforces no memory overcommit limit. VMs can be started past physical RAM; CAPMOX
was the only admission control. On the PVE side, "overprovisioning" is about how the host copes:
- KSM:
ksmtunedis active but only merges below 20% free (KSM_THRES_COEF). Identical Ubuntu clones deduplicate well. It's currently idle because the host has about 44% free. - Host swap (8 GiB): a safety net, but slow.
- Ballooning (
balloon: <min>belowmemory, auto-balloon above 80% host use): not exposed by CAPMOX v0.9.1 (ProxmoxMachineSpechas no balloon field). It's also a poor fit for Kubernetes nodes: the guest keeps reporting full capacity while the balloon takes memory away, so the kubelet schedules against memory that isn't there.
- KSM:
Open questions
120 or 0?The owner chose 160 (decision #17): 46.7 GiB reservable, about 17.7 GiB headroom with today's VMs.- Is an upstream feature request worth filing (a free-memory mode, or excluding stopped VMs)?
Follow-ups
- Done:
schedulerHints.memoryAdjustment: 160onProxmoxCluster/lab1inconfigs/capi/lab1.yaml, decisions #17. Watch real host memory and KSMpages_sharingduring scale tests.