agentscope-ai / agentscope-ai/QwenPaw
[Performance]: Long-running qwenpaw-backend memory grows unbounded to 20GB+ (runtime accumulation, not startup leak)
- Lenguaje dominante
- Python
- Estrellas
- 34.9k
- Forks
- 3.1k
- Merge medio
- 1 d 15 h
- PR fusionados (30 d)
- 225
Descripción
## 现象
qwenpaw-backend 在连续运行约 2 天后(2026-08-21 03:18 启动 → 2026-08-23 23:00),进程内存从启动时的几百 MB 持续增长到 **20.7 GB**,最终拖慢整机。此问题与 #9(启动阶段 ReMe 内存泄漏)不同——**进程已成功启动且正常运行了 2 天,内存是在运行时逐步累积的**。

## 复现条件
- 持续使用 qwenpaw-backend 2 天以上,不重启进程
- 工作负载包含重度文件读写(大量 .md 策略文档)
- 多轮对话触发自动记忆重建
## 根因分析(4 个结构性问题)
### 1. auto_memory 每 N 轮全量重建 BM25 倒排索引,内存不释放
每次 `auto_memory_interval`(默认 5 轮)触发时,狍子会:
1. 读取 `mem_session/dialog/` 下所有历史对话 JSONL 文件
2. 在内存中重建 BM25 倒排索引
3. 调用 LLM 做摘要、推送到 inbox
4. **索引重建完成后,Python 进程的 RSS 堆不归还给 OS**
每重建一次就留下一块内存碎片,经多次累积后内存膨胀到 20GB。
**相关配置**:
```json
{
"auto_memory_interval": 5,
"embedding_model_config": {
"max_cache_size": 10000
}
}
```
### 2. dream_cron 每天 23:00 跑重度记忆整合任务
```json
{
"dream_cron": "0 23 * * *",
"dream_cron_enabled": true
}
```
这是一个后台内存整合任务,把所有记忆读入内存、做摘要、分类、合并。backend 运行 2 天至少触发 2 次 dream 任务,每次都是内存暴涨的推手。
### 3. .md 文件豁免上下文滚动裁剪
```json
{
"tool_result_pruning_config": {
"exempt_file_extensions": [".md"]
}
}
```
用户日常工作大量读写 .md 文件,这些文件的内容**不会被上下文滚动机制裁剪**,全部常驻内存。豁免列表越长,累积内存越严重。
### 4. 没有内存压力阈值守卫
狍子 backend 在跑任何重度操作(记忆重建、dream 整合、索引重建)之前,**从来不检查当前进程内存占用**。20GB 的时候它还在继续重建索引,直到系统 OOM 或用户手动杀进程。
## 临时缓解方案
修改 `config.json` 中的以下参数可显著降低内存增长速率:
| 参数 | 原值 | 建议值 | 效果 |
|---|---|---|---|
| `history_retention_days` | 30 | 7 | 旧对话索引快速清理 |
| `offload_retention_days` | 30 | 7 | 工具结果缓存保留缩短 |
| `auto_memory_interval` | 5 | 20 | 后台索引重建频率降低 4 倍 |
| `max_cache_size` | 10000 | 2000 | 缓存上限砍 80% |
| `goal.max_tokens` | 300000 | 128000 | 单会话 token 上限砍半 |
| `history_max_length` | 10000 | 4000 | 消息窗口上限砍半 |
## 建议修复方向
1. **加内存压力阈值**:在 auto_memory、dream、索引重建等重度操作前检查 `psutil.virtual_memory().percent`,超过阈值(如 80%)则跳过或推迟
2. **exempt 上限可配置**:对豁免文件加大小/数量上限,超过上限的自动裁剪
3. **auto_memory 索引重建用子进程**:重建完成后完全释放内存,不进主进程 RSS
4. **dream 整合任务显式触发 GC**:`gc.collect()` 后配合 `tracemalloc` 确认内存已归还
## 环境
- QwenPaw 版本:v2.1.0(桌面版,qwenpaw-backend.exe 125MB PyInstaller 打包)
- OS:Windows 11
- 运行模式:桌面端,本地工作区
- 工作负载:大量 .md 文件读写 + 长时间对话
Guía de contribución
Evaluación
Este issue todavía no se ha evaluado.