前言

公司有一个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()
}

说到底还是自己写得不多,导致出现这种低级错误。

以上完毕!