youbbs avatar

fasthttp.ServeFile 在某些情景下速度很慢

🕙 by youbbs

这是在 fasthttp 导论组上看到的一个问题,追源发现 go net 库存在的一个小问题。 @mehdipourfar 在使用 fasthttp.ServeFile 做静态文件服务

Go: fasthttp.ServeFile
1
fasthttp.ServeFile(ctx, image_path)

测试发现使用 fasthttp.ServeFile 时有时候响应很慢:

Bash: fasthttp.ServeFile
1
2
3
4
5
6
7
8
9
10
11
> go-wrk -d 3 "http://localhost:8080/2"

Running 3s test @ http://localhost:8080/2
  10 goroutine(s) running concurrently
248 requests in 3.029993142s, 11.92MB read
Requests/sec:       81.85
Transfer/sec:       3.93MB
Avg Req Time:       122.177142ms
Fastest Request:    118.257µs
Slowest Request:    216.498781ms <----- 这里
Number of Errors:   0

但用标准库 net/http 没有那么慢

Bash: net/http
1
2
3
4
5
6
7
8
9
10
11
> go-wrk -d 3 "http://localhost:8080/1"

Running 3s test @ http://localhost:8080/1
  10 goroutine(s) running concurrently
31200 requests in 2.923608791s, 1.46GB read
Requests/sec:       10671.74
Transfer/sec:       512.34MB
Avg Req Time:       937.054µs
Fastest Request:    134.841µs
Slowest Request:    7.879186ms  <----- 这里
Number of Errors:   0

fasthttp 的维护者 @erikdubbelboer 究其原因发现问题出在 io.Copy 函数:

The first io.Copy call is fast at around 500µs. All following calls to io.Copy are slow at around 43ms.

并给出测试结果:

Bash: bench.go
1
2
3
4
5
6
7
8
9
10
11
$ go run bench.go
501.52µs       <-- fast
211.711399ms   <-- always super slow for some reason
48.073968ms    <-- still slow
43.86743ms
43.951452ms
47.955709ms
43.997812ms
43.916976ms
44.037359ms
48.032407ms

提交 issue 给 go 团队后,疫情期间 go 团队也很给力,很快修复了这个问题。

fasthttp.ServeFile  在某些情景下速度很慢

如果你的应用中使用 sendfile 服务的,多留意下次 go 更新。

参考

💘 相关文章

评论

共1条关于"fasthttp.ServeFile 在某些情景下速度很慢"的评论

ego008 avatar
#1 ego008 回复

但 golang 开发团队还在观察,等待足够的数据支撑

写一条评论

Based on Golang + fastHTTP + sdb | go1.16.3 Processed in 1ms