要进行模拟负载测试,请使用以下代码在Go gin-gonic框架中设置一个非常基本的REST api,并在经过大约1000多个请求后出错
http:接受错误:接受tcp [::]:8123:accept4:太多打开 文件1s重试
func main() {
gin.SetMode(gin.DebugMode)
router := gin.Default()
router.GET("/dummyRequest", func(c *gin.Context) {
c.Data(http.StatusOK, "application/json; charset=utf-8", []byte(`{"name": "test", "age": 99}`))
})
router.Run(":8123")
}
基于这个问题here,我知道可以通过执行ulimit
命令来解决此问题,但这只会延迟问题。
当我执行netstat -tc
命令时,我看到建立了新的连接,并在服务请求后很长时间仍处于ESTABLISHED
状态。
按预期,当我按预期检查/ proc / $ PID / limits时,将看到以下条目:
Max open files 1024 4096 files
请帮助我,还有哪些其他方法可以尝试正确解决此问题。
我正在使用curl请求发送请求以测试上述内容。
答案 0 :(得分:0)
Go的http软件包默认情况下未指定请求超时。您应该始终在服务中包括超时。如果客户不关闭会话怎么办?您的过程将使旧的会话保持活跃。一个坏演员可能会故意打开数千个会话,以使您的服务器处于DOS状态。
尝试这样的事情:
srv := &http.Server{
Addr: ":8123",
Handler: router,
ReadTimeout: 10 * time.Second,
WriteTimeout: 10 * time.Second,
}
srv.ListenAndServe()
您可以通过监视进程打开的文件来进行前后验证:
lsof -p [PID_ID]
供参考: https://github.com/gin-gonic/gin#custom-http-configuration