Skip to content

单个 Agent 任务执行时 EventQueue 过大导致后端完全无响应 #4

Description

@xiaolu-cmd

描述:

当一个 Agent 任务产生大量密集的工具调用时,内存中的 EventQueue 会膨胀到数千个事件(本次观察到 3700+),占满后端进程,导致所有
API 端点超时 —— 相当于内部 DoS。

复现步骤:

  1. 启动一个大型 agent 审计任务(如包含多个子任务的 CVE 分析)
  2. 观察后端日志中 EventQueue 的大小,会迅速增长到数千
  3. 在任务运行期间,访问任意其他页面(one-click-cve、admin、vulnerabilities、skills 等)

实际表现:

  • 前端 nginx 返回 504 Gateway Timeout(upstream 60s 超时)
  • 大量请求返回 499(客户端等不及主动断开)
  • 整个应用完全无法使用,直到手动重启后端
  • 后端日志出现 Stream completed with no content after N chunks, finish_reason=length/stop 警告

期望表现:

单个长时间运行的 agent 任务不应阻塞其他 API 请求,其余端点应保持正常响应。

环境信息:

  • 后端镜像: ghcr.io/larlarua/autocve-backend:v1.0.0
  • 未设置资源限制(CPU/Memory limits 均为 0,即无限制)
  • 虚拟机: 7.2GB 内存, 4 vCPU, 30GB 磁盘

补充发现:

  • 后端容器没有设置 CPU 和内存限制,单个任务可耗尽全部资源
  • 重启前 RestartCount 为 0,说明没有自动恢复机制
  • 磁盘 85% 满,docker builder prune 清理了 2GB+ 构建缓存

建议修复方向:

  1. 给 EventQueue 加上深度上限,超出时施加反压
  2. 将 agent 任务执行移到后台 worker(Celery/任务队列),不要阻塞 API 进程
  3. 给后端容器加上 Docker 资源限制(--memory、--cpus)
  4. 对单个任务的工具调用加上并发限制,防止事件风暴

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions