agentscope-ai / agentscope-ai/QwenPaw

[Performance]: Long-running qwenpaw-backend memory grows unbounded to 20GB+ (runtime accumulation, not startup leak)

Abierto
#7,222 3 comentarios 0 reacciones 1 asignado Reclamado por @jinliyl Ver en GitHub
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 天,内存是在运行时逐步累积的**。

![image](https://github.com/user-attachments/assets/placeholder)

## 复现条件

- 持续使用 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

Abrir la guía de contribución

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.