Linux http:Accept错误:Accept tcp[:]:8080:Accept 4:打开的文件太多;

Linux http:Accept错误:Accept tcp[:]:8080:Accept 4:打开的文件太多;,linux,go,Linux,Go,我已经在Golang中编写了RESTAPI,并且正在使用Jmeter对我的API进行性能测试。 当我使用300个或更多用户运行测试时,每个用户发送20个请求,每个请求之间的间隔为500ms,我得到以下错误: http:Accept错误:Accept tcp[:]:8080:Accept 4:打开的文件太多 我正在AWS EC2服务器上运行这个Go应用程序。我正在8GB内存机器上运行此应用程序。 以下是我已经尝试过的: 我已将ulimit增加到一个足够好的数字。当我运行ulimit-n命令时,输出

我已经在Golang中编写了RESTAPI,并且正在使用Jmeter对我的API进行性能测试。 当我使用300个或更多用户运行测试时,每个用户发送20个请求,每个请求之间的间隔为500ms,我得到以下错误:

http:Accept错误:Accept tcp[:]:8080:Accept 4:打开的文件太多

我正在AWS EC2服务器上运行这个Go应用程序。我正在8GB内存机器上运行此应用程序。 以下是我已经尝试过的:

  • 我已将ulimit增加到一个足够好的数字。当我运行ulimit-n命令时,输出是:1048576
  • 在我的代码中,我确保响应主体是关闭的
  • 但是,这些都没有解决问题。感谢您的帮助。
    提前感谢。

    一个问题可能是无法关闭打开的文件或释放资源
    例如:http请求中的body对象的类型为io.ReadCloser 这个readcloser有一个close方法,您必须在流程完成后调用该方法来释放资源

    func UserHandler(w http.ResponseWriter, r *http.request) {
        var user User
    
        if err := json.NewDecoder(r.Body).Decode(&user); err != nil {
          //handle error
        }
        defer r.Body.Close()
    
      // More Code
    }
    
    
    在这里,在r.Body.Close()上调用defer将导致在方法返回其值后释放相关资源

    与此类似,有许多方法实现此接口,如:*os.File、sql.DB、mgo.Session*等,因此您可以检查是否正确关闭了资源

    func UserHandler(w http.ResponseWriter, r *http.request) {
        var user User
    
        if err := json.NewDecoder(r.Body).Decode(&user); err != nil {
          //handle error
        }
        defer r.Body.Close()
    
      // More Code
    }