Skip to content

perf: optimize large account pool selection and precise health invalidation - #925

Merged
chenyme merged 1 commit into
mainfrom
perf
Aug 14, 2026
Merged

perf: optimize large account pool selection and precise health invalidation#925
chenyme merged 1 commit into
mainfrom
perf

Conversation

@chenyme

@chenyme chenyme commented Aug 14, 2026

Copy link
Copy Markdown
Owner

概述

优化大账号池下的账号选择、并发状态读取与缓存失效路径,降低选号阶段的 CPU、内存及 Redis 压力,同时保持模型能力、额度、账号等级、优先级、粘性会话和故障转移语义不变。

主要改动

  • 大号池达到 3000 个可用候选时,默认启用有界分段选号。
  • 每次优先检查 64 个候选,连续 4 个窗口不可用后回退完整账号池。
  • 分段选号支持粘性会话,首次绑定不再强制构建全池计划。
  • 补齐上游额度已知/可用、模型能力、账号等级和优先级排序,避免性能优化改变原有路由顺序。
  • 将账号失败与恢复改为账号级健康状态失效事件,不再因单个账号冷却而清空整个 Provider 候选缓存。
  • 多实例失效事件按账号独立合并,避免不同账号的冷却状态被覆盖。
  • last_used_at 更新从健康状态写入中拆分,普通成功请求不再触发路由缓存重建。
  • 内存与 Redis 并发快照改为稀疏结果,只保存存在活动租约的账号。
  • 缩减路由 Overlay SQL 查询字段,避免大号池读取无用列。
  • 保留完整池回退和最终原子并发门禁,不通过延长缓存时间掩盖性能问题。

配置兼容性

routing:
  segmentedSelectorEnabled: true
  segmentedSelectorMinCandidates: 3000
  segmentedSelectorWindowSize: 64
  • 新部署默认启用。
  • 小于 3000 个候选的账号池行为不变。
  • 已持久化并明确关闭该功能的部署仍保持关闭,不会被自动覆盖。
  • 未修改 SQLite 同步级别、连接缓存大小或数据库 Schema。

性能验证

本地 Apple M4 Pro、10,000 个候选账号微基准:

路径 耗时 内存 分配次数
完整池选号 约 2.13 ms 约 1.67 MB 19,951
分段选号 约 1.51 ms 约 0.20 MB 159

正常分段路径下,首轮动态并发状态读取从 10,000 个账号缩小至 64 个;极端满载时仍会自动回退完整池,保证可用性。

验证

  • go test ./... -count=1
  • 关键路由、失效、运行时和关系数据库包通过 go test -race
  • go vet ./...
  • pnpm lint
  • pnpm build
  • git diff --check

未在真实生产 PostgreSQL + Redis 大池中复现原报告的具体首字时间,因此性能数据仅代表本地选号微基准,不将其表述为生产端到端结果。

@chenyme
chenyme merged commit 2050ded into main Aug 14, 2026
9 checks passed
@chenyme
chenyme deleted the perf branch August 16, 2026 05:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant