尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

GoFr 如何用 k6 对服务做在线压测并分析 p50/p95/p99 延迟与错误率

GoFr 如何用 k6 对服务做在线压测并分析 p50/p95/p99 延迟与错误率 GoFr 如何用 k6 对服务做在线压测并分析 p50/p95/p99 延迟与错误率【免费下载链接】gofrAn opinionated GoLang framework for accelerated microservice development. Built in support for databases and observability.项目地址: https://gitcode.com/GitHub_Trending/go/gofr对 GoFr 服务做性能验证时任务是在线运行一次压测并且能够回答三个问题p50/p95/p99 延迟各是多少、错误率是否可接受、吞吐能稳定到多高。GoFr 自带 Prometheus 指标面/metrics默认METRICS_PORT2121和 pprof 端点k6 提供客户端视角的延迟分位数与断言两者配合即可完成一次客户端数据 服务端真值的可核对压测。适用前提待测 GoFr 服务已运行并可访问业务接口能返回 200服务保持METRICS_PORT未被禁用默认2121设置为0会关闭 metrics 服务此时服务端真值和 pprof 都不可用本机已安装 k6。压测脚本阶梯加压 阈值断言按 Load Testing 指南 中的示例编写script.js。脚本采用阶梯式加压30 秒从 0 爬升到 50 并发、保持 2 分钟、再阶跃到 200 并发保持 2 分钟、最后 30 秒降载。thresholds把一次运行直接变成通过/不通过的判定p95 必须小于 300ms、p99 小于 800ms、失败率非 2xx 与超时小于 1%。import http from k6/http; import { check, sleep } from k6; export const options { stages: [ { duration: 30s, target: 50 }, // ramp up { duration: 2m, target: 50 }, // steady { duration: 30s, target: 200 }, // step up { duration: 2m, target: 200 }, // steady { duration: 30s, target: 0 }, // ramp down ], thresholds: { http_req_duration: [p(95)300, p(99)800], http_req_failed: [rate0.01], }, }; export default function () { const res http.get(https://api.example.com/orders/42); check(res, { status is 200: (r) r.status 200 }); sleep(1); }执行前需要替换的地方只有一处https://api.example.com/orders/42是文档示例地址替换为你自己 GoFr 服务的真实接口例如http://服务地址:8000/你的路由。阈值p(95)300、p(99)800、rate0.01是文档示例给的目标值是否合适取决于你的 SLO可自行调整但结构不变。执行压测并判定通过与否运行压测k6 run --out jsonresults.json script.js--out jsonresults.json把逐事件结果落盘便于事后分析与归档。判定依据有两层k6 自身按thresholds给出通过/不通过并在报告中输出 p50/p95/p99、失败率、RPS 等汇总客户端分位数与服务端指标对照见下节。文档明确指出如果客户端与服务端延迟出现明显偏差先怀疑网络或压测器本身而不是应用。判读结果时遵守文档的口径报告延迟分位数元组p50、p95、p99 错误率 吞吐而不是平均延迟——平均值会掩盖长尾。另外测试要跑得足够长以观察数值是否稳定前 30 秒通常包含预热warmup产生的波动文档建议把这段时间内的数据与稳态区分看待。压测期间抓取 GoFr 服务端指标GoFr 在METRICS_PORT默认 2121暴露 Prometheus 格式的/metrics端点参见 Observability。压测运行期间对它做抓取得到服务端真值。文档列出的有用指标序列HTTP 请求延迟直方图按路由维度的 p50/p95/p99请求计数与状态码分布出站 HTTP 服务的熔断器状态app_http_circuit_breaker_state0 为 Closed1 为 Open见 Circuit BreakerGo 运行时go_goroutines、go_gc_duration_seconds、process_resident_memory_bytes。文档示例的监控面板示例截图其中的具体数值是该次运行的结果不是固定预期——可以看到 Response Time SLA90/95/99/99.9 分位、Request Latency Distribution、状态码分布以及按路由列出 p90/p95/p99/p99.9 的 Route Level SLA 表文档给出的对照标准一次 3 分钟的压测应该在 Grafana 面板上有对应时间段的曲线若客户端延迟与服务端延迟背离问题在网络或压测器一侧。延迟升高时按什么顺序排查文档给出了固定的排查顺序延迟上升时依次检查应用 CPU——CPU 打满说明是计算瓶颈。GoFr 已自动在 metrics 端口挂载标准net/http/pprof处理器/debug/pprof/、/debug/pprof/profile、/debug/pprof/heap等无需自己注册直接抓取go tool pprof http://host:2121/debug/pprof/profile其中host换成服务实际主机。生产环境应把该端口限制在内部网络因为它会暴露 goroutine 与堆 profile。进入 pprof 交互界面后用top查看消耗最多的函数用list function_name查看具体函数源码级的消耗详见 pprof 调试指南。数据库——慢查询、连接池耗尽、锁等待。检查 SQL 数据源的池统计与数据库侧指标文档特别指出MaxOpenConns常是元凶。下游服务——GoFr 出站 HTTP 客户端指标能显示是哪个下游变慢熔断器状态变化通过app_http_circuit_breaker_state可见。GC——长 GC 暂停通常与热路径上的内存分配相关观察go_gc_duration_seconds。网络——压测器推不动流量或 NLB/ALB 有连接数限制。可以把压测器挪到集群内部再跑一次做对比。控制压测环境的风险与位置避免自我 DoS文档列出的三条限制不要把压测指向共享的生产数据库拉起一个专用命名空间使用与生产相同的 Helm 值但独立的数据源将vus虚拟用户数压到任何无法 mock 的、有速率限制的下游服务的连接上限以下。从真实位置压测从开发者笔记本跑 k6 会走公网链路适合端到端 SLO 检查如果目标是GoFr 本身有多快应在同一集群内用一个无资源限制 Pod 跑压测器直接打 Service 的 ClusterIP把应用与边缘链路的抖动隔离开。建立基线并留存报告每次运行都要记录测试场景请求配比、加压曲线、总时长、服务版本镜像 SHA、p50/p95/p99 延迟与错误率、峰值时的资源占用CPU%、内存、DB 连接数、git commit 与开关状态。文档明确说明它不发布任何基准数值——这些完全取决于你的硬件、负载与依赖回归只有在与基线对比时才看得出来。建议每月以及每个重要版本重复同一场景保留 k6/vegeta 输出与 Prometheus 快照。可选分支如果只测稳定的 GET 流量文档给出更轻量的 vegeta 单命令方式vegeta attackvegeta report -typehist结果可经vegeta plot可视化需要脚本化场景、阈值断言时选 k6。echo GET https://api.example.com/orders/42 | \ vegeta attack -rate100 -duration2m | \ vegeta report -typehist[0,10ms,50ms,100ms,500ms,1s]上述 URL 同样是文档示例替换为你的接口即可。完成判据一次压测任务完成的标准k6 运行结束且阈值判定明确pass/failresults.json已保存同一时间窗内/metrics抓到的服务端延迟分位数与客户端 p50/p95/p99 已对照且无无法解释的偏差若未通过阈值已按 CPU → 数据库 → 下游 → GC → 网络的顺序定位到具体一项而不是只留下变慢了的结论。【免费下载链接】gofrAn opinionated GoLang framework for accelerated microservice development. Built in support for databases and observability.项目地址: https://gitcode.com/GitHub_Trending/go/gofr创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表