【问题标题】:Getting too many open files during load test with gin gonic在使用 gin gonic 进行负载测试期间打开的文件过多
【发布时间】:2018-09-22 12:02:00
【问题描述】:

为了进行模拟负载测试,我们在 Go gin-gonic 框架中设置了一个非常基本的 REST api,并使用以下代码并在大约 1000 多个请求出现错误后

http: Accept error: accept tcp [::]:8123: accept4: too many open 文件; 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 请求发送请求以测试上述内容。

【问题讨论】:

  • ulimit -n 增加到 10K-60K 范围是此类测试和在生产中运行的非常常规的设置。

标签: go


【解决方案1】:

Go 的 http 包默认没有指定请求超时。您应该始终在服务中包含超时。如果客户没有关闭他们的会话怎么办?您的进程将保持活跃的旧会话达到 ulimit。一个坏演员可能会故意打开数千个会话,对你的服务器进行 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

【讨论】:

    猜你喜欢
    • 2020-03-29
    • 2021-02-26
    • 1970-01-01
    • 2020-05-02
    • 2018-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-27
    相关资源
    最近更新 更多