Kratos压测不能只用kratos run默认配置,因其HTTP/gRPC服务器未调优:Read/WriteTimeout为0导致连接队列耗尽、无MaxConcurrentStreams限制引发内存飙升、INFO日志和缺失KeepAlive加剧性能瓶颈。

直接上结论:Kratos 服务压测不能只跑 kratos run 默认配置,不调优的 HTTP/gRPC 服务在 k6 下 1000 并发就容易出现连接超时、CPU 飙高、gRPC UNAVAILABLE 错误——这不是框架不行,而是默认参数没对齐生产流量模型。
kratos run 启动的服务为什么压测会崩
Kratos 的 kratos run 是开发态快捷命令,它背后启动的是未调优的 http.Server 和 grpc.Server 实例,默认参数面向单机调试,不是高并发场景:
-
http.Server.ReadTimeout/WriteTimeout为 0(即无限等待),压测中慢请求堆积导致连接队列耗尽 -
grpc.Server默认无MaxConcurrentStreams限制,单连接可承载大量 stream,但内存和 goroutine 消耗陡增 - 日志级别为
INFO,高频请求下log.Info成为性能瓶颈(尤其带 traceid 的结构化日志) - 默认未启用
KeepAlive参数,长连接复用率低,k6 模拟大量短连接时 TCP 握手开销显著
k6 压测 Kratos gRPC 接口的关键配置
k6 对 Kratos gRPC 服务压测效果远好于 HTTP,但必须显式配置 TLS 和流控参数,否则会大量报错 rpc error: code = Unavailable desc = transport is closing:
- 使用
grpc.Client时必须设置keepalive:在 k6 脚本里传入{ "keepalive_time_ms": 30000, "keepalive_timeout_ms": 10000 } - 禁用 TLS 验证(仅限内网压测):k6 不支持自签名证书链校验,需加
tls_skip_verify: true,否则连接失败 - 避免在 VU(virtual user)内反复创建 client:应在
setup()中初始化一次 client,全局复用,否则 goroutine 泄漏 - gRPC 方法调用必须用
client.invoke(),不能用client.call()(后者是旧版 API,已弃用且不兼容 Kratos v2.10+)
HTTP 压测时如何避免 Accept/Content-Type 自动协商拖慢速度
Kratos 默认开启 Accept 和 Content-Type 自动协商,对每个请求都做 MIME 类型匹配和编码选择。压测时这个逻辑会成为热点:
- 在
http.Server初始化时显式关闭:传入http.WithMiddleware()之外的选项http.WithNotAcceptableHandler(nil)和http.WithUnsupportedMediaTypeHandler(nil) - 压测脚本中固定 header:
headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' },跳过协商路径 - 若接口只返回 JSON,可在路由注册时用
http.Middleware强制设置Content-Type: application/json; charset=utf-8,省去 runtime 判断
真实压测中容易被忽略的 Kratos 组件开销
很多人只关注 handler 逻辑,却忘了 Kratos 默认启用的中间件在高压下会放大延迟:
-
tracing中间件默认采集所有 span,压测时 OpenTelemetry exporter 会批量上报,造成 goroutine 阻塞;建议压测时设tracing.WithSampler(tracing.NeverSample()) -
recovery中间件在 panic 时会打印完整 stack,高频错误下 I/O 开销极大;压测前应替换为轻量版recovery.Recovery(recovery.WithLogger(nil)) -
metrics默认每秒采集 Prometheus 指标,http_requests_totalcounter 更新是原子操作,但高并发下仍占约 3–5% CPU;可临时关闭或降低采集频率
最常被漏掉的是 wire 生成的依赖注入树——压测环境若未用 wire.Build 分离 dev/prod 构建,会导致 logger、tracer 等组件在每次请求中重复初始化,goroutine 数量随 QPS 线性增长。



















