使用gin gonic进行负载测试期间获取太多打开的文件

时间:2018-09-22 12:02:00

标签: go

要进行模拟负载测试,请使用以下代码在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请求发送请求以测试上述内容。

1 个答案:

答案 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