ARTICLE DETAIL

资讯详情

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

Hey压测HTTPS服务:TLS握手开销对延迟的影响及3种快速排除方法

Hey压测HTTPS服务:TLS握手开销对延迟的影响及3种快速排除方法 Hey压测HTTPS服务TLS握手开销对延迟的影响及3种快速排除方法【免费下载链接】heyHTTP load generator, ApacheBench (ab) replacement项目地址: https://gitcode.com/GitHub_Trending/he/heyhey 是一款轻量级 HTTP 压测工具ApacheBenchab的现代替代品原生支持 HTTPS 与 HTTP/2。本文面向新手讲清楚 hey 压测 HTTPS 服务时TLS 握手开销如何体现在延迟指标里以及如何用-disable-keepalive对比法快速量化并排除它对压测结果的影响。为什么 HTTPS 压测的延迟总是比 HTTP 偏高 每建立一条新的 HTTPS 连接客户端和服务端都要先完成一次TLS 握手TCP 三次握手1 个 RTTTLS 握手TLS 1.2 通常需要 2 个 RTTTLS 1.3 缩短到 1 个 RTT之后才能真正发送 HTTP 请求也就是说一条冷连接的延迟天然比复用中的连接多出 12 个网络往返时间。同机房压测时一次握手大约 25ms跨地域压测则可能到 3080ms——如果每个请求都新建连接这部分开销会直接叠加进你的平均延迟。hey 的延迟分阶段指标看懂 DNSdialuphey 用httptrace给每个请求做分阶段埋点见 requester/requester.go最终报告里包含 5 个阶段的平均值、最快值和最慢值阶段指标含义是否包含 TLS 握手DNSdialupDNS 解析 TCP 建连 TLS 握手仅新连接✅ 核心指标DNS-lookup仅 DNS 解析耗时❌req write写完整请求的耗时❌resp wait从发完请求到收到首字节的等待❌服务端响应时间resp read读完响应体的耗时❌默认报告模板定义在 requester/print.go。这里有一个新手最容易踩的坑DNSdialup只在连接未被复用时才被计时requester/requester.go 中if !connInfo.Reused的判断。hey 默认开启 keep-alive连接会被反复复用所以大多数请求的握手开销被摊销掉了DNSdialup平均值会显得很小——但这不代表握手不存在只是没被逐次计入。另外两点值得了解见 requester/requester.gohey 默认设置InsecureSkipVerify: true跳过 TLS 证书校验——压测时不会因自签证书报错但 hey 的结果不能用于验证证书有效性每主机的空闲连接池上限是min(并发数, 500)并发-c超过 500 后会有连接频繁新建额外触发握手。3 条命令测出 TLS 握手开销对比法 核心思路其他条件完全一致只切换是否复用连接两组DNSdialup平均值的差就近似等于单次 TLSTCP 握手开销。第 1 步默认 keep-alive 压测握手被摊销代表真实用户场景hey -n 1000 -c 50 https://api.example.com第 2 步加-disable-keepalive每个请求都新建连接完整暴露握手开销hey -n 1000 -c 50 -disable-keepalive https://api.example.com该参数的说明见 hey.go禁用 keep-alive 后不同请求之间不再复用 TCP 连接。第 3 步对比两组的 DNSdialup 平均值差值 ≈ 一次握手耗时下面是一份示例输出本地测试环境的典型量级供参考指标keep-alive默认-disable-keepalive差值DNSdialup 平均0.0002s0.0031s≈ 3ms / 次握手resp wait 平均0.0048s0.0052s基本不变可以看出关闭复用后resp wait服务端响应时间几乎没变涨的全是建连阶段——这就是 TLS 握手开销的指纹。如需逐请求数据做进一步分析用-o csv导出字段说明见 requester/print.gohey -n 1000 -c 50 -z 30s -o csv -disable-keepalive https://api.example.com tls_off.csvCSV 第 2 列DNSdialup就是每次请求的连接建立耗时可以自行统计分位数。4 种降低 TLS 握手对延迟影响的方法✅ 保持默认 keep-alive让连接复用摊销握手成本。压测时不要随手加-disable-keepalive它只用于量化握手开销本身。⚡ 用-h2启用 HTTP/2 多路复用。一条 TLS 连接上可以跑多个并发流握手次数从每连接 1 次降为接近每 worker 1 次hey -h2 -n 1000 -c 50 https://api.example.com 用-z定时压测让请求量足够大。例如-z 30s持续压测握手只发生在起步阶段占比自然摊薄同时对比实验要固定-c与压测时长保证两组可比。 缩短握手 RTT。把压测机部署到与目标同机房跨地域 RTT 会线性放大握手成本服务端升级到TLS 1.31-RTT 握手并确保持有足够空闲连接池-c ≤ 500时每个 worker 可稳定持有空闲连接。安装 hey 与延伸阅读通过 git 克隆源码构建git clone https://gitcode.com/GitHub_Trending/he/hey安装与构建方式详见 README.md 和 Makefile。本文涉及的核心文件命令行参数定义-disable-keepalive、-h2、-o csv等hey.goTLS 配置、连接池与 HTTP/2 开关requester/requester.go分阶段计时埋点逻辑requester/requester.go默认报告模板与 CSV 字段requester/print.go更多命令示例README.md掌握DNSdialup 对比法后你再用 hey 压测 HTTPS 服务时就能一眼分清慢在握手还是慢在服务本身。【免费下载链接】heyHTTP load generator, ApacheBench (ab) replacement项目地址: https://gitcode.com/GitHub_Trending/he/hey创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表