issue: Missing chat index can cause high sqlite mem usage and cpu usage

该报错发生在 Open WebUI v0.11.0 使用 SQLite 数据库且数据库规模较大(如 1.30 GB、约 15k 聊天记录)时,高并发发送消息会导致 CPU 飙升至 1500% 并触发 OOM 崩溃。优先排查数据库索引缺失问题,可尝试应用 issue: Missing chat ind

快速结论:该报错发生在 Open WebUI v0.11.0 使用 SQLite 数据库且数据库规模较大(如 1.30 GB、约 15k 聊天记录)时,高并发发送消息会导致 CPU 飙升至 1500% 并触发 OOM 崩溃。优先排查数据库索引缺失问题,可尝试应用 issue: Missing chat index can cause high sqlite mem usage and cpu usage 对应的补丁版本。

适用环境:Docker 部署的 Open WebUI v0.11.0;macOS Sonoma 14.8.7 (x86-64);SQLite 数据库存放于本地 SSD 并通过 bind mount 挂载;无 Ollama 实例;内存 16 GB(Docker 分配 10 GB)。

最快修复方案:暂无确认的一步修复方案。Issue 讨论中提到 dev 分支包含多项性能改进,但测试表明问题仍然存在。可优先尝试应用 Issue #27663 中的补丁(修改 TIMER_POLL_INTERVAL=60 并安装对应 PR 版本),实测表明该补丁可显著降低基线内存占用(从 1.9 GiB 降至 0.9 GiB)。

注意事项:补丁方案仅为测试验证,尚未合并到正式版本;该方案降低了内存占用但仍需进一步验证高并发场景下的稳定性。设置 DATABASE_ENABLE_SQLITE_WAL=True 可能有助于减少数据库锁竞争,但并未在 Issue 中作为最终解决方案确认。

问题场景

用户通过 Docker Desktop 在 macOS 上运行 Open WebUI v0.11.0,SQLite 数据库已增长至 1.30 GB(约 15k 聊天记录)。在三个不同聊天窗口同时发送消息时,CPU 占用从正常水平骤升至 500%,随后稳定在 1500% 并使系统完全卡死,最终进程被 OOM 或看门狗杀死(退出码 137)。即使用户只发送单条消息,也会导致单核 CPU 达到 100%。该问题在 v0.11.0 之前的版本中完全不存在。

报错原文

issue: Missing chat index can cause high sqlite mem usage and cpu usage

open-webui exited with code 137 (restarting)

database is locked

py-spy top: 95+% CPU in _connection_worker_thread (aiosqlite)
GIL: 4%

原因分析

可能原因:Open WebUI v0.11.0 在 SQLite 数据库中缺少 chat 表的必要索引,导致高并发读取聊天记录时 SQLite 执行全表扫描,产生大量 CPU 和内存消耗。PySpy 分析显示 95% 以上的 CPU 消耗集中在 aiosqlite 的 _connection_worker_thread,而 GIL 仅占 4%,表明问题不是 Python 代码本身的 CPU 密集计算,而是 SQLite C 层在反复扫描和读取大表。另一个 database is locked 错误提示数据库锁竞争也是加重因素。该问题已确认与 #27622 相关,维护者确认并标记为 bug。

环境排查

  • 确认 Open WebUI 版本为 v0.11.0(或更高版本)
  • 检查 SQLite 数据库文件大小(1.30 GB 以上时风险显著增加)
  • 确认是否设置了 TIMER_POLL_INTERVAL 环境变量(测试中设置为 60 仍然复现)
  • 确认 DATABASE_USER_ACTIVE_STATUS_UPDATE_INTERVAL 的值
  • 确认是否启用 DATABASE_ENABLE_SQLITE_WAL=True(建议开启)
  • 确认 Docker 分配的内存上限(10 GB 仍会触发 OOM)
  • 数据库存放位置:本地 SSD 而非网络存储

解决步骤

  1. 备份现有 SQLite 数据库文件,防止修复过程中数据丢失。
  2. 尝试切换到 dev 分支或最新开发版本,测试是否包含性能改进(注意:测试表明 dev 分支 52145eede9940abbb2fc6d2a5bce8b9e955530d6 仍存在问题)。
  3. 可优先尝试应用 #27663 的补丁:
    设置环境变量 TIMER_POLL_INTERVAL=60,并安装包含该 PR 补丁的版本。
  4. 同时设置 DATABASE_USER_ACTIVE_STATUS_UPDATE_INTERVAL=60DATABASE_ENABLE_SQLITE_WAL=True 以降低数据库压力。
  5. 为 Docker 容器设置明确的内存上限(测试中使用 6 GB),防止 Docker VM 完全锁死无法监控。
  6. 安装 py-spy 工具到容器中(apt-get install py-spy 或 pip 安装),运行 py-spy top -p 1 -r 25 --nonblocking 监控 CPU 热点,确认是否仍集中在 aiosqlite。
  7. 如果补丁无效,回退到 v0.11.0 之前的稳定版本,等待包含索引修复的正式版本发布。

验证方法

通过 htop(宿主机和容器内同时观察)或 docker stats 监控 CPU 和内存。测试方法:启动服务后,在四个不同聊天窗口依次提交消息,观察是否出现 CPU 飙升至 500% 以上或内存持续攀升至上限。应用补丁后,基线内存应显著下降(从 1.9 GiB 降至约 0.9-1.3 GiB)。同时使用 py-spy top 确认 CPU 热点是否不再集中在 _connection_worker_thread。若连续提交多条消息后系统响应正常且无 OOM 退出,即可认为问题已解决。

参考来源

open-webui/open-webui #27745
关联 Issue:#27622

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 19938

发表回复

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