ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Dapr v1.17 Actor 性能基准解析:激活、Reminder、Timer 与高并发压测实测报告

Dapr v1.17 Actor 性能基准解析:激活、Reminder、Timer 与高并发压测实测报告 Dapr v1.17 Actor 性能基准解析激活、Reminder、Timer 与高并发压测实测报告【免费下载链接】daprDapr is a portable runtime for building distributed applications across cloud and edge, combining event-driven architecture with workflow orchestration.项目地址: https://gitcode.com/GitHub_Trending/da/dapr本文基于 Dapr 仓库 tests/perf/report/charts/v1.17.0/actors/README.md 的性能报告结合 tests/perf 目录下的真实压测源码系统解读 Dapr Actor 运行时在 v1.17 版本下的激活Activation、Actor ID 高并发路由、Reminder 注册与触发、带状态 Timer 等五大场景的实测数据。读者将掌握如何阅读这些性能图表、理解 p50/p90/p99 指标的业务含义并了解每项测试在仓库中的实现位置与压测方式可据此在自己的环境中复现验证。一、报告概览一次 100% 成功率的 Actor 压力测试Dapr 是一个可移植的分布式应用运行时Actor 是其核心编程模型之一。v1.17 的 Actor 性能报告覆盖了激活、Reminder、Timer 和高并发 Actor ID 压力四大类共五个测试场景所有测试均以100% 成功率完成、零 Pod 重启这是衡量运行时稳定性的最直接证据对应源码中的require.Equal(t, 0, restarts)断言参见 tests/perf/actor_activation/actor_activation_test.go 与 tests/perf/actor_id_scale/actor_id_scale_test.go。测试场景关键指标结果Actor 激活HTTP500 QPSp50 / p90 / p992.30 / 2.98 / 6.89 ms30,000 次激活 100% 成功Actor ID 压力高并发吞吐 / p50 / p90 / p959,443 req/s20.19 / 61.62 / 76.36 ms76,000 请求峰值 462 VUReminder 注册HTTPQPS / p50 / p90 / p99667 QPS35.99 / 55.86 / 74.47 ms40,039 次注册全部返回 HTTP 204Reminder 触发吞吐每秒触发数15,463 个/秒累计 100,000 次触发带状态 TimerHTTP220 QPSp50 / p90 / p995.79 / 11.35 / 18.76 ms13,200 请求 100% 成功二、如何正确阅读这份性能报告在深入各项数据之前先掌握报告使用的度量口径避免误读延迟百分位p50 / p90 / p99反映单次请求耗时的分布。p50 是典型体验中位数p99 表示 99% 的请求低于该值即只有 1% 的请求更慢。p50 与 p90 之间差距越小说明延迟越稳定。VUVirtual Users压力测试中的并发虚拟用户每个 VU 独立发送请求模拟真实的多客户端并发访问。Reminder 注册延迟调度未来回调的 HTTP API 响应时间即登记一个回调要多久。Reminder 触发吞吐回调登记完成后单位时间内实际触发执行的回调数量。这两个 Reminder 指标在报告中被刻意区分——注册是持久化 调度的同步开销触发是分发执行的异步吞吐二者不可混为一谈详见下文第五、六节。报告中每个测试场景还附带一组完整图表命名规则为TestXxx_指标.png位于 tests/perf/report/charts/v1.17.0/actors 目录下常见指标包括summary该场景整体结果汇总qps/throughput请求速率与吞吐曲线duration_breakdown/tail_latency耗时构成与尾延迟histogram_count/histogram_percent延迟直方图次数 / 百分比resource_cpu/resource_memory应用与 Sidecar 的资源占用data_volume/payload_size/header_size数据量与报文大小connection_stats连接状态统计三、Actor 激活性能30,000 次激活的毫秒级响应3.1 实测数据TestActorActivateHTTP目标 500 QPS中位数p502.30 msp902.98 msp996.89 ms共完成 30,000 次激活100% 成功每秒激活 500 个 Actor 实例每次激活都需要运行时创建并注册一个新的 Actor中位数响应仅 2.30 ms。p50 到 p90 的窄带分布2.30 ms → 2.98 ms表明在持续负载下激活延迟高度一致。3.2 源码层面的测试实现该场景由 tests/perf/actor_activation/actor_activation_test.go 中的TestActorActivate实现压测参数通过perf.Params构造详见 tests/perf/test_params.gop : perf.Params( perf.WithQPS(500), // 目标 500 QPS perf.WithConnections(8), // 8 个客户端连接 perf.WithDuration(1m), // 持续 1 分钟 perf.WithPayload({}), // 空 JSON 负载 )压测目标端点是 Dapr 的 Actor 调用 HTTP API每次请求携带一个随机 UUID 作为 Actor ID从而触发新的 Actor 激活endpoint : fmt.Sprintf(http://127.0.0.1:3500/v1.0/actors/DemoActorTimer/{uuid}/method/noOp)测试通过 Fortio 客户端p.StdClient false发起负载并由测试框架断言性能达标参见源码 L175-L180require.Equal(t, 0, daprResult.RetCodes.Num400) // 无 400 错误 require.Equal(t, 0, daprResult.RetCodes.Num500) // 无 500 错误 require.Equal(t, 0, restarts) // 零 Pod 重启 require.True(t, daprResult.ActualQPS float64(p.QPS)*0.99) // 实际 QPS 不低于目标的 99% require.True(t, daprResult.DurationHistogram.Percentiles[2].Value*1000 15) // p90 15ms require.True(t, daprResult.DurationHistogram.Percentiles[3].Value*1000 35) // p99 35ms实际报告中的 p902.98 ms与 p996.89 ms远低于 15 ms / 35 ms 的断言阈值说明激活路径在此次运行中表现优异且留有充分余量。下图为该场景的汇总图表完整图表见 tests/perf/report/charts/v1.17.0/actors/TestActorActivate_summary.png四、Actor ID 高并发压力9,443 req/s 的放置与路由考验4.1 实测数据TestActorIdStress高并发持续吞吐9,443 req/s累计76,000 请求p5020.19 msp9061.62 msp9576.36 ms100% 通过峰值 462 VU该测试同时针对大量不同 Actor ID 发起请求峰值并发虚拟用户达 462重点考验 Dapr 的Actor 放置Placement与路由子系统——即请求如何被路由到持有对应 Actor 的 Sidecar。p90–p95 延迟抬升至 61–76 ms 是预期的排队效应放置服务需要在大批 Actor 之间协调路由。4.2 k6 压测脚本与调度策略该场景使用 k6 压测ramping-vus渐变并发执行器源码见 tests/perf/actor_id_scale/actor_id_scale_test.go部署了10 副本的测试应用Replicas: 10比激活测试的单副本更贴近多副本生产形态也因此更能暴露放置路由的并发压力testApps : []kube.AppDescription{ { AppName: serviceApplicationName, ImageName: perf-actorfeatures, Replicas: 10, // 10 副本扩大放置路由压力面 AppPort: 3000, DaprCPULimit: 4.0, ... AppEnv: map[string]string{ TEST_APP_ACTOR_TYPE: actorType, // 场景内 Actor 类型为 scale-id }, }, }并发模型由 tests/perf/actor_id_scale/test.js 定义从 0 个 VU 在 8 秒内分三档爬升至 500scenarios: { idStress: { executor: ramping-vus, startVUs: 0, stages: [ { duration: 2s, target: 100 }, // 0 → 100 VU { duration: 2s, target: 300 }, // 100 → 300 VU { duration: 4s, target: 500 }, // 300 → 500 VU ], gracefulRampDown: 0s, }, }, thresholds: { checks: [rate1], // 请求成功率必须为 100% http_req_duration: [p(95)90], // p95 延迟必须低于 90ms },每个 VU 通过exec.scenario.iterationInTest使用不断递增的 Actor ID调用PUT /v1.0/actors/{type}/{id}/method/{method}保证每一次迭代都命中一个全新的 Actor 实例从而最大化放置与路由的压力。k6 的 threshold 设定了两个硬性门槛成功率 100% 且 p95 延迟 90 ms报告中的 p9576.36 ms通过该阈值校验。补充说明该测试在源码中当前被标记为t.Skip(skipping due to flakiness)参见 tests/perf/actor_id_scale/actor_id_scale_test.go即此场景曾在某些环境出现过抖动而被临时跳过但 v1.17 报告中的运行结果依然有效可视为该场景在本次基准环境下的真实表现。五、Reminder 注册性能40,000 次持久化调度的代价5.1 实测数据TestActorReminderRegistrationPerformanceHTTP持续667 QPS共40,039 次 Reminder 注册100% 成功全部返回 HTTP 204p5035.99 msp9055.86 msp9974.47 ms每次 Reminder 注册都要求Scheduler调度器持久化并调度一次未来的回调。在 667 QPS 下完成 4 万 次注册且零失败说明调度子系统能够可靠承接高并发注册量。35.99 ms 的中位数反映了持久化调度的固有成本——Reminder 在 API 返回前已被持久化这份延迟正是可靠性的代价。5.2 源码层面的注册流程测试位于 tests/perf/actor_reminder/actor_reminder_test.go注册端点直接使用 Dapr 的 Reminder HTTP APIendpoint : fmt.Sprintf(http://127.0.0.1:3500/v1.0/actors/%v/{uuid}/reminders/myreminder, actorType) p.TargetEndpoint endpoint p.Payload {dueTime:24h,period:24h} // 24 小时后触发、每 24 小时周期重复目标 QPS 设定为 3000targetQPS连接数 24持续 1 分钟。断言采用只防退化策略——实际 QPS 低于目标时才校验偏差高于目标则无需检查参见源码 L165-L169if daprResult.ActualQPS targetQPS { assert.InDelta(t, targetQPS, daprResult.ActualQPS, 120) }同时断言无 400/500 错误、零 Pod 重启。测试随后time.Sleep(90 * time.Second)等待 Reminder 触发并采集指标。六、Reminder 触发吞吐每秒 15,463 次的异步分发6.1 实测数据TestActorReminderTriggerPerformance每秒触发 15,463 个 Reminder累计 100,000 次触发一旦注册完成Reminder 以每秒 1.5 万 的速率被触发。报告明确指出注册延迟数十毫秒级与触发吞吐每秒数千级的分离是刻意设计——调度工作前置完成后分发阶段可以极速进行。6.2 触发场景的构造方式该测试同样位于 tests/perf/actor_reminder/actor_reminder_test.go使用 50 个并发 goroutine 批量注册 20,000 个 Reminder每个 Reminder 的触发参数极具挑战性reminder : actorReminderRequest{ DueTime: ptr.Of(time.Now().Add(time.Second * dueTime).Format(time.RFC3339)), // dueTime 450s 后到期 Period: ptr.Of(1ms), // 触发周期仅 1ms Ttl: ptr.Of(5ms), // 存活 5ms最多触发约 5 次 }由于 TTL 为 5 ms、周期为 1 ms每个 Reminder 最多触发约 5 次因此测试最终等待触发总数达到reminderCount * 5 100,000次t.Logf(Waiting for %d reminders to trigger, reminderCount*5) ... require.EventuallyWithT(t, func(c *assert.CollectT) { ... assert.GreaterOrEqual(c, gotCount, reminderCount*5) }, 100*time.Second, 100*time.Millisecond)触发 QPS 的计算方式为qps : float64(reminderCount*5) / done.Seconds()并以targetTriggerQPS 10200为防退化基准偏差容限 3340。报告实测 15,463 次/秒显著高于该目标。七、带状态 Timer单次往返完成回调与状态读写7.1 实测数据TestActorTimerWithStatePerformanceHTTP220 QPSp505.79 msp9011.35 msp9918.76 ms13,200 个请求100% 成功带状态的 Actor Timer 每个请求融合了两类操作触发 Timer 回调 读写 Actor 状态。5.79 ms 的中位数反映了这种复合操作在 220 QPS 下的表现——Timer 分发与状态访问在单次往返内完成且尾延迟一致p99 仅 18.76 ms。7.2 测试结构测试位于 tests/perf/actor_timer/actor_timer_test.go与激活测试同构部署 4 副本的 Java Actor 服务Replicas: 4镜像perf-actorjava由 Fortio 压测客户端通过http://127.0.0.1:3500/v1.0/actors/DemoActorTimer/{uuid}/method/noOp端点驱动。其资源采集与断言逻辑与激活测试一致GetAppUsage/GetSidecarUsage/GetTotalRestarts分别采集应用与 Sidecar 的 CPU、内存及重启次数。下图为 Reminder 注册场景的汇总图可直观看到 667 QPS 下延迟的分布形态完整图表见 tests/perf/report/charts/v1.17.0/actors/TestActorReminderRegistrationPerformance_summary.png八、如何在本地复现这套 Actor 性能测试报告中的所有图表均由仓库自带的性能测试框架生成可以在本地集群复现。完整流程记录在 tests/docs/running-perf-tests.md核心步骤概述如下准备集群与环境使用 Kind / Minikube 等 Kubernetes 集群make setup-kind可创建带本地镜像仓库的 Kind 集群创建dapr-tests命名空间并导出DAPR_REGISTRY、DAPR_TAG、DAPR_NAMESPACE等环境变量。构建并部署运行时执行make build-linux、make docker-build、make docker-push、make docker-deploy-k8s将本地构建的 Dapr 运行时部署到集群Apple Silicon 需先export TARGET_ARCHarm64。注册组件与配置make setup-app-configurations、make setup-test-components注册测试应用配置与默认组件。构建测试应用镜像make build-perf-app-all与make push-perf-app-all构建并推送压测应用如perf-actorjava、perf-actorfeatures、perf-tester。运行测试make test-perf-all运行全部性能测试也可通过export DAPR_PERF_TESTactor_id_scale只跑指定场景k6 类测试还需先make setup-test-env-k6安装 k6-operator。生成图表将gotestsum的 JSON 报告作为输入生成与本文同款图表cd tests/perf/report go run . -input path-to-report.json[.gz] -version output-folder压测负载的关键参数可通过环境变量覆盖默认值参见 tests/perf/test_params.go 与运行文档环境变量作用默认值DAPR_PERF_QPS目标请求速率QPS1DAPR_PERF_CONNECTIONS客户端连接数1DAPR_TEST_DURATION测试持续时间1mDAPR_PAYLOAD_SIZE随机负载大小KB0DAPR_SIDECAR_CPU_LIMIT/DAPR_SIDECAR_MEMORY_LIMITSidecar 资源上限4.0 / 512MiDAPR_SIDECAR_CPU_REQUEST/DAPR_SIDECAR_MEMORY_REQUESTSidecar 资源预留0.5 / 250Mi需要强调的是这些数值是在仓库维护的基准环境AKS / Kind 集群资源规格见各测试文件中kube.AppDescription的 CPU/内存限制下测得的换环境后绝对数值会变化报告的真正价值在于相对量级、稳定性特征窄尾延迟、零重启以及注册慢、触发快这类架构性结论。九、小结v1.17 的 Actor 性能报告给出了四个值得长期关注的结论激活路径轻量稳定500 QPS 下 p50 仅 2.30 ms且 p50→p90 几乎无发散适合作为 Actor 调用的常态性能基线。多 Actor ID 高并发下路由是主要排队点p90/p95 抬升源于放置服务在大批 Actor 间的协调属预期行为而非异常。Reminder 的注册/触发分离是刻意设计注册为可靠性付费持久化 调度数十毫秒触发则充分并行化每秒万级吞吐。带状态 Timer 的复合操作开销可控回调 状态读写融合在一次往返中220 QPS 下 p99 仍低于 20 ms。这些结论均有对应的压测源码与图表支撑读者可循 tests/perf/actor_activation/actor_activation_test.go、tests/perf/actor_id_scale/actor_id_scale_test.go、tests/perf/actor_reminder/actor_reminder_test.go、tests/perf/actor_timer/actor_timer_test.go 及 tests/perf/report/charts/v1.17.0/actors 下的全套图表目录自行深入验证。【免费下载链接】daprDapr is a portable runtime for building distributed applications across cloud and edge, combining event-driven architecture with workflow orchestration.项目地址: https://gitcode.com/GitHub_Trending/da/dapr创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表