blade-agent 内存分析

PID 4176527 · RSS 862 MB · 运行 3 天 · bladeai 服务器 · 2026-06-16

内存构成估算

~850M RSS 总量
Embedding 模型常驻 ~300 MB
Python 运行时 + 依赖库 ~150 MB
全局字典泄漏 ~100-200 MB
会话历史 ~100-200 MB
其他(连接池、Chroma、sqlite) ~50 MB

1. Embedding 模型常驻内存

~300 MB

最大的单一消耗。Mem0 通过 HuggingFace 加载本地 embedding 模型,权重常驻不释放。

# host/src/blade_agent/host/memory/service.py:85-150
Memory.from_config() → 加载 google/embeddinggemma-300m
# host/src/blade_agent/host/memory/modelscope.py:6
model_path = "google/embeddinggemma-300m"

优化建议:如果 memory 功能使用频率低,改用远程 embedding API 可省 300M

2. 无上限全局字典(泄漏)

~100-200 MB

多个全局 dict 只增不减,进程运行越久泄漏越多。

位置类型问题
server/deps.py:61 _background_sessions
dict[str, Task]
Task 持有完整 session 状态,finally 可能未执行
routes/prod_workspaces.py:72 _workspace_user_token_cache
dict[tuple, str]
无 TTL、无 maxsize、无 eviction
socketio_handlers.py:296 _gis_analysis_session_locks
dict[str, Lock]
Lock 创建后从不删除
sessions/payload_log_store.py:58 _queues + _workers
dict[str, Queue/Task]
session 结束后不清理

优化建议:加 TTL/LRU、session 断开时主动清理对应 key

3. 会话历史常驻

~100-200 MB

每个 session 把完整对话历史加载到内存中,多个活跃 session 同时存在时开销很大。

# host/src/blade_agent/host/sessions/history.py:71-73
_raw_entries: list[dict[str, Any]] # 完整对话
_by_id: dict[str, dict[str, Any]] # ID 索引
_ordered_ids: list[str] # 排序索引

线上当前有多个 blade-user 容器活跃,每个对应一个 session。

优化建议:改为惰性加载,或只保留最近 N 轮在内存中

4. Python 运行时 + 依赖库

~150 MB

不可压缩的基础开销,import 时即分配。

共享库RSS
libpython3.12.so5.5 MB
libcrypto.so.35.1 MB
_rust.abi3.so (pydantic/tokenizers)4.0 MB
numpy _multiarray_umath3.5 MB
scipy openblas1.8 MB
pydantic_core + 其他~10 MB

以上仅 .so 部分,Python module 对象 / 类型元数据 / 代码对象等占大头

5. 其他

~50 MB
  • • Chroma 向量数据库连接 + 内存索引
  • • SQLite 连接(SessionIndex)
  • • 图片/PDF 处理临时缓冲(BytesIO,峰值可达几十 MB)
  • • asyncio 事件循环 + 17 个线程栈
  • • service token cache、model capabilities cache 等小缓存

额外发现:3 个 blade-agent 进程同时运行

PIDRSS启动时间状态
4176527862 MBJun 13当前活跃
3264767203 MBMay 13残留进程
1347352188 MBMay 14残留进程

3 个进程合计占用 ~1.25 GB。清理两个残留进程可回收 ~390 MB。

优化建议(按收益排序)

1

Embedding 模型改远程 API

省 ~300 MB,改动集中在 memory/service.py 的 config

2

全局字典加清理机制

_workspace_user_token_cache 加 LRU/TTL;session 断开时清理 locks/queues/workers

3

会话历史惰性加载

只保留最近 N 轮在内存中,其余按需从 SQLite 读取

4

清理残留进程

kill 两个 5 月的老进程,立刻回收 ~390 MB