Golang Go语言中默认配置可能导致连接/协程泄露,包括标准库及基于并使用标准库默认配置的框架,fasthttp也存在类似问题

发布于 1周前 作者 caililin 来自 Go语言

相关: github.com/golang/go/issues/51614

issue 中对应的 pr 目前不是最好方案,个人觉得一些配置项被用户默认配置为 0 时,标准库或者各大框架应该提供一个默认的非 0 值来避免泄露。 如果默认配置存在这种泄露的可能,使用默认配置的服务,不需要 ddos 那么高的打击成本,只要慢连接攻击就可以耗尽 fd 、以及导致大量处理 goroutine 无法退出最终 oom 。 client 端的设备掉电、网络切换、进入电梯信号丢失等,也都会导致 client 端无法发出 TCP.FIN 从而导致这种泄露。


Golang Go语言中默认配置可能导致连接/协程泄露,包括标准库及基于并使用标准库默认配置的框架,fasthttp也存在类似问题

更多关于Golang Go语言中默认配置可能导致连接/协程泄露,包括标准库及基于并使用标准库默认配置的框架,fasthttp也存在类似问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

顺着你的问题 google 了两篇类似的文章

https://capops.xyz/post/%E8%AE%B0%E4%B8%80%E6%AC%A1http%E8%BF%9E%E6%8E%A5%E9%87%8D%E7%94%A8%E9%97%AE%E9%A2%98%E5%88%86%E6%9E%90/

https://segmentfault.com/a/1190000023635278

我在用 gin 写服务的时候,IdleTimeout 和 ReadTimeout 都不去设置,就是不限制超时时间。超时的控制由 nginx 来管理,遇到问题就想办法从 nginx 那边来优化。

更多关于Golang Go语言中默认配置可能导致连接/协程泄露,包括标准库及基于并使用标准库默认配置的框架,fasthttp也存在类似问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html




外层有其他反代、中间件等设施做中转是可以交给其他基础设施处理。

但是 client 直连 go server 的,还是需要注意。比如用 go 做的基础设施

感谢,之前没注意过这块,顺着你的入手点学到了一些东西。

针对帖子中提到的Golang Go语言中默认配置可能导致连接/协程泄露的问题,以下是我的专业回复:

确实,在Golang中,如果未对标准库及其框架(包括fasthttp)进行适当配置,可能会遇到连接或协程泄露的情况。这通常源于未设置超时、未正确管理资源或并发编程中的错误实践。

为了解决这个问题,可以采取以下措施:

  1. 配置超时:对于HTTP客户端和服务器,应设置合理的超时时间,以避免因长时间未关闭的连接而导致资源泄露。
  2. 正确管理资源:确保在协程中正确关闭所有资源,如文件、数据库连接和网络连接。使用defer语句可以帮助确保资源在函数退出时被释放。
  3. 避免阻塞和死循环:在协程中避免使用阻塞操作或创建死循环,这可能导致协程无法正常退出。
  4. 使用协程池:在需要大量协程的情况下,使用协程池来管理协程的生命周期,避免无限制地创建新协程。

综上所述,通过合理配置和编程实践,可以有效避免Golang中的连接和协程泄露问题。对于fasthttp等框架,也应关注其文档和社区提供的最佳实践,以确保安全、高效地使用。

回到顶部