openclaw-test-heap-leaks

Analyser les fuites mémoire des tests pnpm dans OpenClaw, les OOM de Vitest, les pics RSS et les deltas de snapshots de tas.

Qu'est-ce que openclaw-test-heap-leaks ?

Cette compétence permet d'investiguer les problèmes de mémoire dans les tests OpenClaw exécutés avec Vitest. Elle guide l'utilisateur dans la reproduction des problèmes, la collecte de preuves de tas (snapshots, profils d'allocation), et la classification de la croissance mémoire (rétention de modules par les workers vs véritables fuites d'objets). Elle fournit des commandes spécifiques pour exécuter des profils mémoire, comparer des snapshots, et valider les correctifs grâce à un harnais dédié. Elle supporte les workflows de diagnostic pour les workers Vitest partagés, les fuites de fermeture dans les services longs, et l'analyse des retenues via les reteneurs et dominators. L'objectif est d'éviter les conclusions hâtives basées uniquement sur le RSS et de privilégier une approche systématique pour identifier et corriger les fuites mémoire réelles.

Compatible avec✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/clawdbot/clawdbot/tree/main/.agents/skills/openclaw-test-heap-leaks

Installed? Explore more Développement et programmation skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Fuites de Tas des Tests OpenClaw

Utilisez cette compétence pour les investigations mémoire des tests. Ne vous fiez pas uniquement au RSS lorsque des snapshots de tas sont disponibles. Considérez les deltas de noms de snapshots comme des indices de triage, non comme une preuve, jusqu'à ce que les reteneurs ou les dominators soutiennent l'appel.

Lisez d'abord ../openclaw-test-performance/SKILL.md pour les commandes actuelles de performance des tests et le routage des preuves.

Pour les correctifs d'exécution (par exemple, les fuites de fermeture dans les services à longue durée comme la passerelle), voir Validation des correctifs d'exécution ci-dessous — cela utilise un harnais dédié plutôt que le workflow de profilage de test unitaire.

Workflow

  1. Reproduisez d'abord la forme défaillante.

    • Faites correspondre le point d'entrée réel et le budget de workers. Pour une large base unitaire rapide avec RSS max par configuration et chronométrage par fichier principal, commencez par :

      pnpm test:perf:groups \
        --config test/vitest/vitest.unit-fast.config.ts \
        --allow-failures \
        --output .artifacts/test-perf/unit-fast-memory.json
      
    • Pour un fichier suspecté, relancez ce fichier avec un seul worker et collectez les preuves wall/RSS : /usr/bin/time -l pnpm test <fichier> --maxWorkers=1 --reporter=verbose.

    • L'exécution actuelle de pnpm test est planifiée par scripts/test-projects.mts. Enregistrez la configuration ou le fragment (shard) Vitest affiché et préservez cette forme lorsque le rapport est spécifique à une configuration ou à un budget de workers.

  2. Collectez les preuves de tas les plus solides disponibles.

    • Exécutez pnpm test:perf:profile:runner -- --output-dir .artifacts/test-perf/vitest-runner-profile -- <fichier> pour obtenir un profil CPU ainsi qu'un profil de tas par échantillonnage de l'exécuteur unitaire. Ouvrez le profil de tas dans DevTools et inspectez les plus grandes familles d'allocations.
    • La sortie .heapprofile par échantillonnage n'est pas un .heapsnapshot ; ne la passez pas à l'utilitaire de delta de snapshot.
    • Lorsqu'un harnais dédié ou un autre producteur connu émet des fichiers .heapsnapshot répétés, comparez les snapshots du même PID avec .agents/skills/openclaw-test-heap-leaks/scripts/heapsnapshot-delta.mjs.
    • Si aucun snapshot ou profil de tas n'est disponible, la croissance du RSS est une preuve de triage utile, mais maintenez la classification de la fuite comme non concluante.
  3. Classez la croissance avant de choisir un correctif.

    • Si la croissance est dominée par les chaînes source transformées par Vite/Vitest, Module, system / Context, le bytecode, les tableaux de descripteurs ou les maps de propriétés, traitez-la comme une croissance probable du graphe de modules retenus dans les workers à longue durée.
    • Si la croissance est dominée par les objets de l'application, les caches, les buffers, les handles de serveur, les timers, l'état des mocks, l'état SQLite ou des objets d'exécution similaires, traitez-la comme une fuite probable de nettoyage ou de cycle de vie.
    • Si les noms sont ambigus, ne tirez pas de conclusion définitive et inspectez les reteneurs/dominators dans DevTools pour les principaux deltas.
  4. Corrigez la bonne couche.

    • Pour une croissance probable des modules transformés retenus dans les workers partagés :
      • Inspectez la configuration Vitest propriétaire et le découpage des processus dans scripts/test-projects.test-support.mjs. Corrigez la durée de vie du processus ou la propriété du projet uniquement lorsque la preuve de même forme montre que la rétention du worker partagé en est la cause.
      • test/vitest/vitest.unit-fast-isolated.config.ts est destiné aux tests avec état audités qui nécessitent un nouveau graphe de modules. Ne l'utilisez pas comme une liste générique de points chauds mémoire.
    • Pour les véritables fuites :
      • Corrigez le test impliqué ou le chemin de nettoyage d'exécution.
      • Recherchez les afterEach/afterAll manquants, les lacunes de réinitialisation de module, l'état global retenu, les handles de base de données non libérés ou les écouteurs/timers qui survivent au fichier.
  5. Vérifiez avec la preuve la plus directe.

    • Relancez la même commande groupée ou ciblée et confirmez que la tendance du RSS max ou que l'OOM est réduite.
    • Lorsqu'un producteur dédié émet des profils de tas ou des snapshots, répétez le même producteur et comparez les artefacts équivalents.
    • Pour les modifications de routage ou de configuration, vérifiez que la configuration ou le fragment Vitest attendu démarre et que les tests affectés se terminent.

Heuristiques

  • N'appelez pas tout une fuite. La croissance dans un projet Vitest partagé non isolé peut être un problème de durée de vie du worker plutôt qu'une fuite d'objet applicatif.
  • scripts/test-projects.mts, scripts/test-group-report.mts et scripts/run-vitest-profile.mts sont les points d'entrée actuels pour l'exécution, le RSS groupé et le profilage.
  • Les lignes [test] starting ... identifient la configuration ou le fragment Vitest à reproduire.
  • .artifacts/vitest-shard-timings.json stocke les durées des configurations/fragments pour l'ordonnancement. Ce n'est pas un manifeste de point chaud mémoire ou de comportement au niveau fichier.
  • Lorsque les mêmes familles d'objets retenus croissent sur plusieurs intervalles dans le même PID de worker, faites confiance aux snapshots plutôt qu'à l'intuition, puis confirmez les appels ambigus avec des preuves de reteneurs.

Comparaison de Snapshots

  • Comparaison directe :
    • node .agents/skills/openclaw-test-heap-leaks/scripts/heapsnapshot-delta.mjs before.heapsnapshot after.heapsnapshot
  • Sélection automatique des snapshots les plus anciens/les plus récents par PID dans une même voie :
    • node .agents/skills/openclaw-test-heap-leaks/scripts/heapsnapshot-delta.mjs --lane-dir <snapshot-directory>
  • Drapeaux utiles :
    • --top 40
    • --min-kb 32
    • --pid 16133

Lisez d'abord les deltas positifs les plus importants. Une forte croissance positive dans les artefacts de transformation de modules indique un problème de durée de vie du processus partagé ou de propriété du projet ; une forte croissance positive dans les objets d'exécution suggère une véritable fuite. Si les noms seuls ne suffisent pas, ouvrez la même paire de snapshots dans DevTools et inspectez les reteneurs/dominators pour les premières lignes avant de déclarer la cause racine.

Validation des correctifs d'exécution (pas la mémoire des tests)

Le workflow ci-dessus est destiné à diagnostiquer la croissance mémoire des workers Vitest. Pour valider qu'un correctif d'exécution/fermeture libère réellement l'état capturé, utilisez le harnais dédié :

  • pnpm leak:embedded-run — exécute scripts/embedded-run-abort-leak.ts. Boucle N exécutions avortées dans une portée en forme de fonction imitant runEmbeddedAttempt, écrit des snapshots de tas et rapporte un verdict RÉUSSI/ÉCHEC sur la croissance de rétention en utilisant FinalizationRegistry pour le comptage d'instances suivies plus le delta RSS.

Modes :

  • closure-extracted (par défaut) — forme du correctif de production (assistant à la portée du module).
  • closure-inline — forme avant correctif (fermeture à l'intérieur de la portée de l'exécuteur). Utilisez-le comme un test de sensibilité : s'il réussit, vous avez cassé le harnais, pas corrigé un bug.
  • synthetic-leak — retient délibérément via un compartiment au niveau du module. Utilisez-le pour confirmer que le harnais peut détecter les fuites avant de faire confiance à un RÉUSSI sur un véritable correctif.

Les snapshots atterrissent dans .tmp/embedded-run-abort-leak/. Diffusez avec le même script que ci-dessus :

node .agents/skills/openclaw-test-heap-leaks/scripts/heapsnapshot-delta.mjs \
  .tmp/embedded-run-abort-leak/baseline-*.heapsnapshot \
  .tmp/embedded-run-abort-leak/batch-N-*.heapsnapshot --top 30

Lorsque vous corrigez une autre fuite d'exécution, ajoutez un nouveau harnais à côté de celui-ci plutôt que de l'adapter. La fonction de l'appareillage doit imiter la portée lexicale de la fonction où se trouve la fuite, pas être une boucle d'abandon générique.

Attentes de Sortie

Lorsque vous utilisez cette compétence, indiquez :

  • La commande de reproduction exacte.
  • Quelle configuration Vitest ou quelle cible a été reproduite, et quel PID a été comparé lorsque des snapshots étaient disponibles.
  • Les familles d'objets retenus dominantes du profil de tas ou du delta de snapshot, lorsqu'elles sont disponibles.
  • Si le problème est probablement une véritable fuite ou une croissance probable du module retenu par le worker partagé, plus si les reteneurs/dominators l'ont confirmé.
  • Le correctif concret ou le patch de réduction d'impact.
  • Ce que vous avez vérifié, et ce que la surcharge de snapshot vous a empêché de vérifier.

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

1password

Set up and use 1Password CLI for sign-in, desktop integration, and reading or injecting secrets.

acp-router

Route plain-language requests for Claude Code, Cursor, Copilot, OpenClaw ACP, OpenCode, Gemini CLI, Qwen, Kiro, Kimi, iFlow, Factory Droid, Kilocode, or explicit ACP harness work into either OpenClaw ACP runtime sessions or direct acpx-driven sessions ("telephone game" flow). For coding-agent thread requests, read this skill first, then use only `sessions_spawn` for thread creation. Codex chat binding defaults to the native Codex app-server plugin unless ACP is explicit or background spawn needs ACP.

add-model-provider

Add and live-prove a model provider with non-interactive config one-liners, without exposing credentials.

agent-transcript

Requested GitHub PR/issue agent transcripts: redact, trim, preview, and insert safely.

apple-notes

Create, view, edit, delete, search, move, or export Apple Notes via the memo CLI on macOS.

apple-reminders

List, add, edit, complete, or delete Apple Reminders and reminder lists via remindctl.

auto-qa

Run OpenClaw-wide autonomous QA and live/stress campaigns across independent subsystem lanes, with verified fixes and a resumable evidence report.

autoreview

Structured code review through the shared OpenClaw agent-skills installation.

bear-notes

Create, search, and manage Bear notes via grizzly CLI.

blacksmith-testbox

Run Blacksmith Testbox for CI-parity checks, secrets, hosted services, migrations, or builds local cannot reproduce.

block-kit

Use proactively for structured or interactive Slack replies, and when asked to author or validate native Slack Block Kit JSON.

blogwatcher

Monitor blogs and RSS/Atom feeds for updates using the blogwatcher CLI.

blucli

BluOS CLI (blu) for discovery, playback, grouping, and volume.

bluebubbles

Send and manage iMessages via BlueBubbles, including attachments, tapbacks, edits, replies, and groups.

browser-automation

Use when controlling web pages with the OpenClaw browser tool, especially multi-step flows, login checks, tab management, or recovery from stale refs/timeouts.

camsnap

Capture frames or clips from RTSP/ONVIF cameras and local webcams, including USB pan/tilt/zoom control.

canvas

Present HTML on connected OpenClaw node canvases, navigate/eval/snapshot, and debug canvas host URLs.

channel-message-flows

Use when running QA Lab channel message flow evidence.

clawdtributor

Clawtributor PRs here, last week or another window: discover conversation refs, recheck GitHub, rank by impact.

clawhub

Search ClawHub for plugins by default, or skills when explicitly requested; install, verify, update, uninstall, publish, or sync skills.

Skills associés