我已经用 Golang 编写了 REST API,并且正在使用 Jmeter 对我的 API 进行性能测试。 当我对 300 个或更多用户运行测试时,每个用户发送 20 个请求,每个请求之间的间隔为 500 毫秒,我收到以下错误:
http: Accept error: accept tcp [::]:8080: accept4: too many open files;
我在 AWS EC2 服务器上运行这个 Go 应用程序。我在 8GB RAM 机器上运行这个应用程序。 以下是我已经尝试过的:
- 我已将 ulimit 增加到一个足够好的数字。当我运行 ulimit -n 命令时,输出为:1048576
- 在我的代码中,我确保响应主体已关闭。
但是,这些都没有解决问题。任何帮助表示赞赏。 提前致谢。
请您参考如下方法:
一个问题可能是没有关闭打开的文件或释放资源。
例如: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* 等。因此您可以检查是否正确关闭资源。