fasthttp.ServeFile 在某些情景下速度很慢
这是在 fasthttp 导论组上看到的一个问题,追源发现 go net 库存在的一个小问题。
@mehdipourfar 在使用 fasthttp.ServeFile
做静态文件服务
fasthttp.ServeFile(ctx, image_path)
测试发现使用 fasthttp.ServeFile
时有时候响应很慢:
> 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
没有那么慢
> 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 around500µs
. All following calls toio.Copy
are slow at around43ms
.
并给出测试结果:
$ 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 团队也很给力,很快修复了这个问题。
如果你的应用中使用 sendfile
服务的,多留意下次 go 更新。
参考
0
See Also
- goYoubbs fasthttp leveldb 版开源
- 支持 fasthttp 三个 websocket 库
- fasthttp + bolt 做图片服务器是个不错的选择
- python Markdown 解析库速度比较
- 简洁,像PW9.0,网站速度好快,赞一个
但 golang 开发团队还在观察,等待足够的数据支撑