Node-Agent CPU-Spike: blinder qemu-agent-Ping jeder VM jede Runde + toter Guest-Agent (VM ohne agent) → pvesh-Flut; Agent-Flag/Backoff/Cache + CPU-Cap #38
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Root Cause (per Live-Analyse einer betroffenen Node verifiziert)
Kein Busy-Loop — eine
pvesh/qm-Subprozess-Flut aus dem VM-Identity-Scan, massiv verschärft durch eine VM mit totem qemu-guest-agent.Befund aus dem Live-Dump (kh-gera):
stime(90 s) ≫utime(59 s) → Kernel-/Subprozess-lastig, nicht Compute.identity_scan begin141×/153 s (~1/s) über VMs 100–105, je mitpvesh/qm-Calls (ping,uname -r, get-osinfo, network-get-interfaces).pvesh= schwergewichtiger Perl-Subprozess → dutzende Spawns/s.guest-ping ... got timeout; jede Runde 2 timeout-gebundene Calls (pvesh guest-ping→qm-Fallback →identity_scan abort).tokio-rt-worker(Blocking-Pool) mit stark steigenden TIDs, in R → Blocking-Threads stauen sich an timeout-blockierten Calls. Erklärt „nach Neustart paar Stunden Ruhe, dann 100%" (Pool wächst über Stunden).Code:
Node-Agent/src/data.rs:71-86— der Kommentar gibt es zu: statt der Agent-Flag-Prüfung wird auf jeder laufenden VM blind qemu-agent-ping versucht.data_loopselbst ist sauber serialisiert (spawn_blocking(collect).await), abercollectscannt jede Runde alle (bis 12) laufenden VMs voll, und tote Agents kosten 2 QMP-Timeouts/Runde.Sofort-Mitigation (Betrieb)
qm set <vmid> --agent 0oder guest-agent im Gast starten → nimmt die QMP-Timeouts raus.systemctl set-property --runtime theprox-agent CPUQuota=40%.scan_intervalder Node erhöhen.Fix (Code)
1. Agent-Flag respektieren statt blind pingen (Kern)
In
collect(data.rs) nur VMs scannen, deren PVE-Configagent: 1hat. Das Flag einmal aus/qemu/<vmid>/configlesen und cachen (es ändert sich praktisch nie) — der im Kommentar „gesparte" Round-trip ist genau die Ursache. VMs ohne Agent-Flag gar nicht erst pingen.2. Backoff für nicht antwortende Guest-Agents
VMs, deren
guest-pingfehlschlägt, mit exponentiellem Cooldown versehen (z. B. nach Fehlschlag N Runden überspringen, Cap z. B. 10 min) statt jede Runde erneut in den Timeout zu laufen. Pro-VM-State imSharedState/AgentState halten.3. pvesh-Churn senken (Cache)
OS/Kernel/IP je VM cachen und nur selten (z. B. alle paar Minuten) neu via
identity_scanholen — proscan_interval-Tick nur den günstigen ping/Statuscheck, nicht den vollen 4-Call-Scan. Reduziert Perl-Subprozess-Spawns drastisch.4. QMP-Ping-Timeout kürzen
Den guest-ping-Timeout im Agent kurz halten (z. B. 2–3 s), damit ein toter Agent nicht lange blockiert.
5. Resource-Cap als Defense-in-Depth (ursprünglicher Scope)
CPUQuota/MemoryMaxin der systemd-Unit (_make_install_script_rust) — bleibt als Sicherheitsnetz, deckelt jeden künftigen Ausreißer.6. Backend nicht gegen unerreichbare VMs pollen
Prüfen, ob das Backend (Security/Overview/Modal)
vm.scan/qm.agent.*gegen VMs mit totem Agent wiederholt triggert — falls ja, ebenfalls Backoff/Skip.Akzeptanz
pvesh/qm-Spawn-Rate deutlich gesenkt (Cache); CPU bleibt niedrig auch über Tage.Branch
fix/agent-scan-backoff-and-captheProx-Node Agent CPU Overheadto Node-Agent CPU-Overhead absichern — systemd CPUQuota/MemoryMax-Limits in der UnitNode-Agent CPU-Overhead absichern — systemd CPUQuota/MemoryMax-Limits in der Unitto Node-Agent CPU-Spike: blinder qemu-agent-Ping jeder VM jede Runde + toter Guest-Agent (VM ohne agent) → pvesh-Flut; Agent-Flag/Backoff/Cache + CPU-Cap