v2 单机并发

当前 Server 可以在一个进程内服务多个用户,但部署时仍只使用一个 worker。并发的作用是让一个任务等待模型或存储时,其他任务继续推进;它不会让数据库写入自动变成并行,也不保证增加名额就能提高吞吐。

提交与租约

租约(lease)表示某个 worker 当前有权执行这个 Run;fencing 检查用于拒绝过期 worker 的写入。写入一旦通过检查并进入保护区,调度器会保留这次写入的有效性,直到它结束。

内存及文件 Scheduler 的 execute_fenced 只在检查和更新保护记录时短暂持有全局锁,不在整个存储写入期间阻塞其他 Run。

  • 不同 Run 可以并行提交,同一 Run 顺序执行。
  • 提交中的 Run 不回收、不取消或释放租约,不提前腾出租户名额。
  • 写入期间可续租;进入保护区的写入保留原租约权威。
  • 提交成功、失败或反复取消后清理保护标记;关闭等待已进入保护区的写入退出。
  • 等待 claim 会在相关租约到期时醒来,不依赖其他请求通知。

文件调度器状态落盘仍是原子顺序写入,SQL SessionStore 的 writer 仍顺序执行事务。调度层减少跨 Session 串行等待,不改变存储自己的保证。

Server 配置

Server 保持长驻 Application;普通聊天与 managed Applications 使用独立队列和共享 SchedulerQuotaGroup,总额度不随包数量成倍增长。

环境变量 默认值 作用
SAGE_SERVER_MAX_CONCURRENT_RUNS 8 正在执行的根 Run 总上限
SAGE_SERVER_MAX_CONCURRENT_RUNS_PER_USER 2 原子用户执行配额
SAGE_SERVER_MAX_PENDING_RUNS 1024 共享等待队列上限

以下是可调整的单机验收起点,不是容量承诺:

SAGE_SERVER_MAX_CONCURRENT_RUNS=32
SAGE_SERVER_MAX_CONCURRENT_RUNS_PER_USER=4
SAGE_SERVER_MAX_PENDING_RUNS=1024

模型限流或数据库成为瓶颈时应降低执行并发,观察排队与 P95/P99 延迟;增加队列长度不等于提高吞吐。直接使用 Builder 时,execution.scheduler 配置对应 max_concurrent_runs、max_concurrent_runs_per_tenant 和 max_pending_items。Job 额度见资源管理。

验证与部署边界

python -m pytest tests/sagents/v2/test_single_host_fencing.py
python scripts/v2/benchmark_v2_single_host.py --sessions 64 --writes 8 --io-ms 2
python scripts/v2/benchmark_v2_single_host.py --sessions 128 --writes 8 --io-ms 2

测试覆盖跨 Run 并行、同 Run 顺序、续租、回收、配额、取消、关闭和 Dispatcher → LeaseFencedSessionStore → SessionStoreCoordinator 协调路径。基准模拟慢异步存储,不包含真实模型或数据库;历史通过数量和合成延迟不是生产容量保证。

Server 仍要求单 worker。持久化、租约 fencing、进程内事件订阅及 JobRuntime 是不同保证;不能因使用 MySQL 就宣称支持多进程或多宿主执行。


Sage documentation for the current repository layout. Source available under the MIT license.

This site uses Just the Docs, a documentation theme for Jekyll.