我在 Gin 、Actix 和 Axum 上使用 wrk 做了一些测试。Actix 和 Axum 使用 MiMalloc 作为分配器,发布配置文件包括以下设置:Lto=true 、opt-level=3 和 codegen-units=1 。
平均而言,Go 的延迟小于 1ms ,令人难以置信,而 Actix 的延迟要高得多,但吞吐量/rps 仍优于 Gin 。
我很好奇,为什么 Gin 的延迟如此之小,而 Qps 却远低于另外两个。
结果如下:
Gin (go):
> wrk -t8 -c100 -d30s http://localhost:3000/
Running 30s test @ http://localhost:3000/
8 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 823.52us 1.16ms 25.86ms 88.29%
Req/Sec 22.94k 12.27k 118.70k 81.71%
5488891 requests in 30.07s, 680.50MB read
Requests/sec: 182521.70
Transfer/sec: 22.63MB
axum (rust):
> wrk -t8 -c100 -d30s http://localhost:3000/
Running 30s test @ http://localhost:3000/
8 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 3.87ms 13.64ms 225.34ms 93.67%
Req/Sec 40.34k 23.31k 183.63k 73.83%
9516362 requests in 30.09s, 1.15GB read
Requests/sec: 316292.39
Transfer/sec: 39.21MB
actix (rust):
> wrk -t8 -c100 -d30s http://localhost:3000/
Running 30s test @ http://localhost:3000/
8 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 34.43ms 66.10ms 541.12ms 86.22%
Req/Sec 42.77k 37.73k 214.31k 77.25%
9169105 requests in 30.09s, 769.50MB read
Requests/sec: 304762.55
Transfer/sec: 25.58MB
1
oldcai OP 测试环境:
Mac Sonoma 14.4.1 MacBook Air M2 |
2
cyhulk 258 天前
看上去数据包大小有区别,可能应该是返回的 response 不一样,不同的框架可能默认返回不一致,这里有做对比吗
|
3
yooomu 258 天前
了解 go ,不懂 rust 。我猜测是框架的处理问题,算力一定的情况下,如果增大缓冲区,那么就能吞吐更多连接,那相应的单个连接的处理速度就会更慢,延迟就会更高
|
4
oldcai OP |
5
cyhulk 258 天前
1.rust 无 gc
|
7
yaott2020 258 天前 via Android
代码贴一下?
|
8
ihciah 258 天前 via iPhone 2
actix 是每个 thread 起一个 runtime ,M2 的核心又是不对称的,所以延迟爆炸很正常。go 和 tokio(axum 用法)都是有任务窃取的,所以受影响不大。
|
9
codegenerator 258 天前 1
helloworld 能测出什么? go 跟 rust 一个主要区别是 gc
|
10
guonaihong 257 天前
你测试代码呢?可以把 fasthttp 也加进来一起测试下。
|
11
kxct 238 天前
盲猜 rust 没有开 nodelay ,或者框架自己有缓存,然后批量发送。
|