issue: v0.12.0: Some browser tabs enter an endless reinitialise loop (~10/s), `Session not found` on every socket `user_join`, saturating se

该问题通常出现在 Open WebUI v0.12.0 使用 Docker 部署、存在多个浏览器标签页时:部分标签页以约 10 次/秒的频率重复执行应用初始化流程,同时 socket 的 user_join 处理程序持续抛出 Session not found ,最终占满 CPU 与数据库连接池。优

快速结论:该问题通常出现在 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} 是否在循环中频繁被调用。

解决步骤

  1. 先确认当前 Open WebUI 版本,若仍为 v0.12.0,可优先尝试升级到 0.12.3 或更新的 release,然后重启容器观察循环是否消失。
  2. 升级后若仍有个别标签页循环,可让受影响用户关闭该用户的全部标签页,再重新打开一个标签页,验证循环是否停止。
  3. 若需立即止血,可撤销受影响用户的 token(生成新的 auth.session_stamp),使用户会话失效并重新登录。
  4. 排查 /api/tasks/chat/{id} 的放大效应:该接口当前会加载完整 chat 行及 chat JSON,可先用监控确认其调用频率与单次数据量;如需临时规避,可参考 Issue 中在 nginx 层 stub 该接口的做法,但需清楚这会影响任务功能。
  5. 收集日志中的 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,则说明循环已停止。可同时确认受影响标签页不再反复刷新初始化界面。

参考来源

open-webui/open-webui #32537

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 29501

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注