Skip to content

perf(edge): EventLog 截断与全量回放停顿,等待持久化负载证据 #2304

Description

@DeliciousBuding

当前结论(2026-09-06 收口)

观测已由 #2308 落地;结构性重构保持 DEFERRED。 该 issue 跟踪的是 EventLog,不是 FileStore / SQLite 的公共锁。后两者的独立候选见 #2256

已有本地 ARM64 / ext4 测量证明了停顿机制和规模上界,但没有证明实际持久化负载下的发生频率;不能将未配置 EventLog 的实例上“计数为零”当作无需优化的证据,也不指定已退役的实例作为采样目标。

已有测量(历史证据,不是本轮重跑)

truncateLocked:截断工作在 Append 的锁内完成

默认超过 50 MiB 后保留尾部 75%,重新读取并写回约 37.5 MiB。所有 publisher/replay 共用 EventLog 自己的 l.mu

maxSize keepBytes 触发截断的 Append
2 MiB 1.5 MiB 42 ms
4 MiB 3 MiB 77 ms
8 MiB 6 MiB 155 ms
50 MiB 默认 37.5 MiB 约 0.97 s,线性外推;独立对照中实测 952 / 966 ms 的截断停顿

每增加约 12.5 MiB 新事件触发一次截断。按当时约 660 bytes/event 的夹具估算,约每 1.9 万条一次;这不是现场事件速率。

ReadFrom:全量与常见 tail replay 不同

replay 形态(45 MiB 日志) 墙钟
tail 50 条 0.75 ms
tail 500 条 7.3 ms
cursor=0 全量,约 7 万条 1,095 ms

并发测量中 Append 的最大等待接近 replay 全程。较差形态出现在冷启动、首次全量连接或 cursor 早于存活窗口;不能将其描述为所有重连均冻结一秒。

下一次有效取证条件

  1. 选择明确启用 AGENTHUB_EVENT_LOG_PATH 的隔离 staging 或已授权持久化实例;先证明配置与日志写入真实生效。
  2. 收集日志尺寸、事件速率、replay 形态、gap/截断次数与耗时。指标为:
    • edge_event_log_truncations_total
    • edge_event_log_truncate_failures_total
    • edge_event_log_gaps_total
    • edge_event_log_truncate_duration_seconds_total
    • edge_event_log_truncate_last_duration_seconds
  3. 满足任一既定触发条件再评估结构性方案:截断耗时占比 rate(edge_event_log_truncate_duration_seconds_total[1h]) > 0.005、最近一次截断 >0.5 s、gap 持续出现,或 truncate failures 增长。必须注明采样时窗和负载,不拿一次人工压满日志的测试冒充现场频率。

约束

原始测量过程与理由保留在此前评论及 #2301 / #2308;本 issue 仅保留结构性决策与下一次有效取证入口。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions