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

http: Accept error: accept tcp [::]:8080: accept4: too many open files;

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

  1. 我已将 ulimit 增加到一个足够好的数字。当我运行 ulimit -n 命令时,输出为:1048576
  2. 在我的代码中,我确保响应主体已关闭。

但是,这些都没有解决问题。任何帮助表示赞赏。 提前致谢。

请您参考如下方法:

一个问题可能是没有关闭打开的文件或释放资源。
例如:http请求中的body对象是io.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 将导致在方法返回其相关资源后释放相关资源值(value)。

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


评论关闭
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!