mirror of
https://github.com/QwenLM/qwen-code.git
synced 2026-05-24 22:03:46 +00:00
* feat(cli): add memory diagnostics doctor command * fix(core): platform-aware maxRSS conversion and accurate risk message - Extract platform detection before building diagnostics so the correct unit conversion can be applied: multiply by 1024 on Linux (where process.resourceUsage().maxRSS is in KB) but leave the value unchanged on macOS/Windows (where it is already in bytes). - Correct the native-memory-pressure risk message to accurately state that the threshold is 2× heap used, not just "larger than heapUsed". - Add a dedicated test to assert that maxRSS is not multiplied on a non-Linux platform (darwin). All 3 core and 9 CLI tests pass; typecheck clean. Agent-Logs-Url: https://github.com/QwenLM/qwen-code/sessions/9b413337-68ed-4d5c-af99-0d42378900c3 * test(core): cover active request memory risk * fix(cli): address memory diagnostics review feedback * fix(cli): harden memory diagnostics review fixes * fix(memory-diagnostics): tighten risk thresholds and expand readable output - Add 64MB absolute floor on native-memory-pressure so cold processes don't trip the 2x ratio check; raise active-handles threshold from 100 to 256 - Show detachedContexts, nativeContexts, maxRSS, CPU times, smapsRollup availability, and v8HeapSpaces summary in the readable /doctor memory output - Validate unknown memory subcommand args with a usage hint instead of silently dropping them - Wrap human-readable strings in t(...) for i18n parity with the rest of doctor - Advertise the memory subcommand via /doctor argumentHint while keeping acceptsInput false so the parent still auto-submits - Document _getActiveHandles/_getActiveRequests as undocumented Node internals - Update tests for new thresholds, expanded output, unknown-arg path, and abort-during-json * fix(cli): harden memory doctor diagnostics * fix(core): correct maxRSS byte handling and heapRatio consistency - Remove incorrect * 1024 multiplier for maxRSS on Linux (Node.js >=14.10 returns bytes on all platforms) - Use v8HeapStats.usedHeapSize for heapRatio to avoid cross-API inconsistency - Update test expectations and rename "does not multiply" test * fix(cli): resolve rebase conflicts in memory diagnostics - Rename local formatMemoryDiagnostics to formatCoreDiagnostics to avoid naming conflict with the imported utility from memoryDiagnostics.js - Update Session.test.ts to use objectContaining for _meta field added in recent main commits - Align doctorCommand.test.ts assertions with current parent command state (argumentHint includes --sample/--snapshot from main) * fix(core): use null instead of undefined for optional probes, deduplicate active count helpers - optionalProbe/optionalSyncProbe now return null on failure so JSON.stringify preserves the keys instead of silently omitting them. - Merge getActiveHandlesCount/getActiveRequestsCount into a single parameterized getProcessInternalCount helper. - Update MemoryDiagnostics interface: v8HeapSpaces, openFileDescriptors, smapsRollup are now T | null instead of T | undefined. * fix(cli): finish memory diagnostics review fixes * fix(cli): address memory diagnostics review feedback --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
2 KiB
2 KiB
Memory Diagnostics Reference Design
Context
Issue #3000 tracks memory and performance diagnostics for long-running Qwen Code sessions. The first PR should establish a small, low-risk diagnostic surface before adding heavier profiling or retention changes.
The design is reference-first:
- Claude Code keeps memory diagnostics separate from heap snapshot generation.
Its diagnostics include process memory, V8 heap statistics, heap spaces,
resource usage, active handles/requests, file descriptors, Linux
smaps_rollup, and leak hints. - Codex focuses heavily on bounded retention and lazy loading for long-lived process state. Those ideas should guide later PRs that address conversation, command output, and history retention.
First PR Scope
Add a /doctor memory diagnostic path that captures a single point-in-time
snapshot:
process.memoryUsage()- V8 heap statistics and heap spaces
process.resourceUsage()- active handle/request counts
- open file descriptor count when
/proc/self/fdis available - Linux
smaps_rollupwhen available - basic risk hints for heap pressure, detached contexts, excessive handles, excessive requests, high file descriptor count, and native memory pressure
This command should be cheap enough to run in normal sessions and safe on platforms where Linux-only probes are unavailable.
Non-Goals
This PR intentionally does not:
- write heap snapshots
- run continuous polling
- change prompt/history retention
- change tool output retention
- alter module loading behavior
Those are follow-up PRs after the diagnostic baseline exists.
Follow-Up PRs
- Add explicit snapshot/export support for deeper local investigation.
- Add bounded retention for large command/tool outputs, using Codex's capped output retention as the main reference.
- Audit lazy loading and module startup paths after measurements identify hot spots.
- Add repeatable memory/performance benchmark scenarios for long-running sessions.