fasthttp高并发请求运行一段时间后出现TCP拨号i/o超时问题
fasthttp高并发客户端累计15000次请求后大量超时问题
核心故障表现
使用valyala/fasthttp开发高并发HTTP客户端时,前15000次左右请求运行完全正常,后续请求阶段会出现越来越多的两类报错:
dial tcp4 127.0.0.1:80: i/o timeoutdialing to the given TCP address timed out
复现代码
var Finished = 0 var Failed = 0 var Success = 0 func main() { for i := 0; i < 1000; i++ { go get() } start := time.Now().Unix() for { fmt.Printf("Rate: %.2f/s Success: %d, Failed: %d\n", float64(Success)/float64(time.Now().Unix()-start), Success, Failed) time.Sleep(100 * time.Millisecond) } } func get() { ticker := time.NewTicker(time.Duration(100+rand.Intn(2900)) * time.Millisecond) defer ticker.Stop() client := &fasthttp.Client{ MaxConnsPerHost: 10000, } for { req := &fasthttp.Request{} req.SetRequestURI("http://127.0.0.1:80/require?number=10") req.Header.SetMethod(fasthttp.MethodGet) req.Header.SetConnectionClose() res := &fasthttp.Response{} err := client.DoTimeout(req, res, 5*time.Second) if err != nil { fmt.Println(err.Error()) Failed++ } else { Success++ } Finished++ client.CloseIdleConnections() <-ticker.C } }
故障排查背景
- 服务端基于
labstack/echo/v4搭建,客户端出现超时错误时,服务端无任何异常日志;使用Postman、Chrome浏览器等工具手动发起请求,服务端均可正常响应。 - 客户端前15000次请求运行状态稳定,15000次阈值后超时错误出现频率逐步升高,控制台输出的请求处理速率(Rate)持续下降。已检索Google、GitHub相关公开资料,找到同场景问题记录,但未找到可落地的解决方案。
附加疑问
客户端启动初期会先抛出若干如下报错:
the server closed connection before returning the first response byte. Make sure the server returns 'Connection: close' response header before closing the connection
该报错出现一段时间后客户端运行状态会恢复正常,直到请求量累计到15000次左右才开始逐步出现大量超时错误,需要明确启动初期出现该连接关闭报错的根本原因。
运行环境
- 硬件:2021款14英寸Macbook Pro(Apple M1 Pro芯片),16GB内存
- 系统:macOS Monterey 12.4
内容的提问来源于stack exchange,提问作者Jobber T
相关产品推荐
相关产品推荐

