Lazy loaded image
技术分享
使用k6压测web服务器
00 分钟
2024-2-25
2024-12-27
type
status
date
slug
summary
tags
category
icon
password
想试一下 http/1.1 和 http/2.0 有啥区别,正好又想起前段时间了解到的一个压测工具 k6,这不正好,拿 k6 来压一下试试。

安装 k6

官方文档在这里:https://grafana.com/docs/k6/latest/get-started/installation/

使用 go 编写服务端

创建 http 和 https 服务端。在创建 https 服务端时,还需要配置证书,参考 使用golang创建http2和h2c服务端

编写 k6 脚本

k6 可以通过命令行参数来配置参数,也支持使用配置文件。由于 k6 支持使用 k6 new 生成一个默认的模板,所以使用配置文件是很方便的。
生成一个配置文件

编辑 script.js

http.get('http://test.k6.io'); 修改为 http.get("https://localhost:8090"); 这里按需填写地址即可。 由于我们服务端设置了证书,而 k6 是没有导入证书的,所以需要设置跳过证书验证。

压测

执行命令 k6 run script.js

比较 http/1.1 和 http/2.0

分别访问 8090 端口和 8080 端口。
我应该是用错方式了,测出来使用 http/1.1 和 http/2.0 几乎没有区别。第一次是访问的 8090 端口,服务端打印出来的协议是 HTTP/2.0,第二次访问的是 8080 端口,服务端打印出来的协议是 HTTP/1.1,但是可以看到,http 请求的数量都在 3800 左右,几乎没有区别。

k6 的不足

k6 目前不支持压测非加密的http2 server(H2C),也就是上面代码中的 9000 端口对应的服务端。如果使用 k6 去测试,那么只能使用 HTTP/1.1 的协议,无法像 curl 那样使用额外的参数 `--http2-prior-knowledge 去指定 HTTP/2.0 协议。
相关的讨论可以看这里。https://github.com/grafana/k6/issues/970 ,早在 2019 年就已经在讨论了,不过看起来目前还是没有办法在没有 breaking change 的情况下引入对 H2C 的支持。
上一篇
使用supabase和northflank免费搭建你自己的n8n
下一篇
使用golang创建http2和h2c服务端