最近在用 OpenClaw Hermes 接 function_router 时观察了一下 session 状态的管理,发现单机单用户场景下有几个实际会遇到的问题,都集中在 _QWEN_SAVED_CONTEXTS 和 _QWEN_PENDING_UPSTREAM_TURNS 这两个 module-level dict 的生命周期上。
问题
1. session 状态无 TTL / 淘汰机制
这两个 dict 一旦写入就不会主动清理。OpenClaw 每个 chat 会换新 session_key,旧 key 的 context 永远留在内存里。长时间挂着服务,内存只增不减,需要重启才能回收。
_QWEN_SAVED_CONTEXTS: dict[str, list[dict[str, Any]]] = {}
_QWEN_PENDING_UPSTREAM_TURNS: dict[str, list[dict[str, str]]] = {}
2. fr_context_preserve=true 显式永不清理
这个配置开启后,开了之后也会出现 OOM。
3. stream finally 按整桶清,不按 index
proxy_upstream 的 stream 在 finally 里直接 del _QWEN_PENDING_UPSTREAM_TURNS[key] 清掉整个 bucket。绝大多数时候没问题,但有一种场景会丢数据:
- 用户中断第一个流式输出,立刻发第二个请求
- 第二个请求已经往同一 session 的 bucket 里写了新 turn
- 第一个 stream 的 finally 才执行,把第二个还没消费的 turn 一起抹掉
最近在用 OpenClaw Hermes 接 function_router 时观察了一下 session 状态的管理,发现单机单用户场景下有几个实际会遇到的问题,都集中在
_QWEN_SAVED_CONTEXTS和_QWEN_PENDING_UPSTREAM_TURNS这两个 module-level dict 的生命周期上。问题
1. session 状态无 TTL / 淘汰机制
这两个 dict 一旦写入就不会主动清理。OpenClaw 每个 chat 会换新 session_key,旧 key 的 context 永远留在内存里。长时间挂着服务,内存只增不减,需要重启才能回收。