快速结论:该问题通常出现在 Open WebUI v0.12.0 使用 Docker 部署、存在多个浏览器标签页时:部分标签页以约 10 次/秒的频率重复执行应用初始化流程,同时 socket 的 user_join 处理程序持续抛出 Session not found,最终占满 CPU 与数据库连接池。优先确认版本,并将先尝试升级到更新版本(维护者指出 0.12.0 已不是最新修复版本)。
适用环境:Docker 安装;Open WebUI v0.12.0;Ubuntu 24.04.4 LTS(GNU/Linux 7.0.0-1014-gcp x86_64);浏览器 Version 152.0.7977.82(Official Build,arm64)。Issue 中未提供 Ollama 版本或 Python/CUDA 信息。
最快修复方案:暂无确认的一步修复方案。维护者在评论中明确表示 “0.12.0 ≠ 0.12.3” 并提示不要对旧版本报告问题,因此可优先尝试升级到 0.12.3 或更新的 release,再观察是否仍出现同样的循环请求。
注意事项:Issue 中用户报告重启容器无效、将用户角色设为 pending 也无法停止循环;撤销用户 token(生成新的 auth.session_stamp)可以停止循环,关闭所有标签页后重新打开一个通常也能为该用户中止循环,但这些都属于临时缓解措施,并非根因修复。用 nginx 对 /api/tasks/chat/{id} 返回 {"task_ids":[]} 只是规避该接口加载完整 chat JSON 的放大效应,会影响任务相关功能,不建议作为长期方案。升级是否彻底解决该问题,Issue 中没有明确验证结论。
问题场景
用户在 Docker 中运行 Open WebUI v0.12.0,并配置了若干 MCP 用于取数和可视化。在浏览器中同时打开多个标签页,并重启 Open WebUI 容器后,部分标签页卡在反复初始化:每秒数次循环请求 /api/version、/api/v1/chats/、/api/v1/chats/pinned、/api/v1/folders/ 与 /api/v1/folders/shared、/api/tasks/chat/{id},以及时有时无的 /_app/version.json。每个循环都伴随服务端 user_join 的 Session not found 错误。
报错原文
File "/app/backend/open_webui/socket/main.py", line 539, in user_join
await sio.save_session(sid, {'user': socket_user, 'token': auth['token']})
File ".../socketio/async_server.py", line 365, in save_session
eio_session = await self.eio.get_session(eio_sid)
...
KeyError: 'Session not found' (eio_sid is None)
sqlalchemy.exc.TimeoutError: QueuePool limit ... reached
原因分析
最直接的现象是部分标签页陷入 socket 重连与应用初始化循环:客户端重新执行初始化请求,服务端 user_join 在保存 session 时获取到的 eio_sid 为 None,随后抛出 KeyError: 'Session not found'。维护者关联到 #32338(登录后未刷新页面、socket 断开后紧接重连的回归问题)和 #8805(WebSocket 层无法正确处理需要重新认证的场景),说明可能原因集中在 socket 会话失效后的客户端重连/重初始化逻辑,而非单纯的代理断开 WebSocket——用户已确认 nginx timeout 为 300s 且未看到 polling transport。
循环请求身份校验(is_valid_token → get_auth_by_id)会持续消耗事件循环,叠加每次 /api/tasks/chat/{id} 加载完整 chat JSON(案例中为 1–11 MB)的查询开销,最终导致 CPU 满载和 QueuePool limit 超时,影响所有用户。用户观察到该问题与具体用户或对话无关,空闲服务器启动后也可能立即出现,因此不能只归因于负载。
环境排查
- 确认 Open WebUI 版本:Issue 明确针对 v0.12.0,维护者提示 0.12.0 与 0.12.3 不同,应先确认是否仍停留在旧版本。
- 确认安装方式为 Docker,并记录容器是否重启过、重启后循环是否立即复现。
- 确认浏览器版本与标签页数量,尤其是是否多个标签页同时保持登录会话。
- 检查服务端日志中
user_join是否持续出现Session not found,以及是否出现sqlalchemy.exc.TimeoutError: QueuePool limit ... reached。 - 确认反代是否配置了 WebSocket 超时(案例中 nginx 为 300s),并确认是否存在 polling transport。
- 确认是否存在大体积 chat(工具输出、HTML 嵌入等),并观察
/api/tasks/chat/{id}是否在循环中频繁被调用。
解决步骤
- 先确认当前 Open WebUI 版本,若仍为 v0.12.0,可优先尝试升级到 0.12.3 或更新的 release,然后重启容器观察循环是否消失。
- 升级后若仍有个别标签页循环,可让受影响用户关闭该用户的全部标签页,再重新打开一个标签页,验证循环是否停止。
- 若需立即止血,可撤销受影响用户的 token(生成新的
auth.session_stamp),使用户会话失效并重新登录。 - 排查
/api/tasks/chat/{id}的放大效应:该接口当前会加载完整 chat 行及 chat JSON,可先用监控确认其调用频率与单次数据量;如需临时规避,可参考 Issue 中在 nginx 层 stub 该接口的做法,但需清楚这会影响任务功能。 - 收集日志中的
Session not found计数与/api/version请求计数,以及 py-spy 中is_valid_token→get_auth_by_id的占比,作为是否仍存在循环的证据。
验证方法
观察一段时间内服务端日志:若 user_join 不再持续抛出 Session not found,/api/version 等初始化请求不再以每秒数次频率重复出现,两个 worker 的 CPU 不再持续 100%,且不再出现 QueuePool limit ... reached,则说明循环已停止。可同时确认受影响标签页不再反复刷新初始化界面。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。
![[CI Failure]: Multimodal Processor shards - test_tensor_schema[naver-hyperclovax/HyperCLOVAX-SEED-Think-32B] - upstream model_type hyperclov](https://www.chat-gpts.plus/wp-content/uploads/2026/10/56397-752fb663-768x403.jpg)
![[CI Failure]: (MI355) Core Operation Kernels Shard 1: kernels/test_concat_mla_q.py::test_concat_mla_q_fp8_nope_and_rope](https://www.chat-gpts.plus/wp-content/uploads/2026/10/58134-1ff93b69-768x403.jpg)
