GoLang未设置HTTP超时引发的惨案
公司有一个HTTP的统计服务用Golang写的接口,一直运行良好;但是今天突然线上故障。
进过排查在HTTP统计服务的log中发现这么一段:
2018/07/04 14:40:47 http: Accept error: accept tcp [::]:8080: accept4: too many open files; retrying in 5ms
再检查Golang 进程 发现 fd目录中有一大堆的socket文件。很明显是socket文件被占用完了。
在Google之后发现,原来是因为HTTP服务没有设置超时,加上公司网络波动,出现了很多超时访问巨慢的客户端请求,占用了Socket, 导致其耗尽
正确姿势应该是这样:
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/XXXXX", XXXX)
mux.HandleFunc("/XXXXXX", XXXXX)
server := &http.Server{
Addr: "0.0.0.0:8080",
Handler: mux,
// 必须要设置超时 防止出现过慢的客户端导致socket文件不能释放
// 导致文件描述符被消耗殆尽
ReadTimeout: 5 * time.Second,
WriteTimeout: 10 * time.Second,
}
Warning.Println("服务器已启动 停止请按Ctrl+C")
server.ListenAndServe()
}
说到底还是自己写得不多,导致出现这种低级错误。
以上完毕!