http: принять ошибку: принять tcp [::]: 8080: принять4: слишком много открытых файлов; - PullRequest
0 голосов
/ 15 мая 2019

Я написал REST API на Голанге, и я делаю тест производительности моего API с использованием Jmeter. Когда я запускаю тест с 300 или более пользователями, каждый пользователь, отправляющий 20 запросов с интервалом в 500 мс между каждым запросом, получает следующую ошибку:

http: Принять ошибку: принять tcp [::]: 8080: принять4: слишком много открытых файлов;

Я запускаю это приложение Go на сервере AWS EC2. Я запускаю это приложение на 8 ГБ оперативной памяти. Вот то, что я уже пробовал:

  1. Я увеличил предел до достаточно хорошего числа. Когда я запускаю команду ulimit -n, вывод: 1048576
  2. В своем коде я убедился, что тело ответа закрыто.

Но ни один из них не решил проблему. Любая помощь приветствуется. Заранее спасибо.

1 Ответ

0 голосов
/ 16 мая 2019

Одной из проблем может быть не закрытие открытых файлов или освобождение ресурсов.
Например: объект body в запросе http имеет тип 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
}

Здесьвызов defer для r.Body.Close () приведет к освобождению связанных ресурсов после того, как метод вернет свое значение.

Подобно этому, есть много методов, которые реализуют этот интерфейс, например: * os.File, sql.DB, mgo.Session * и т. Д. Так что вы можете просто проверить, правильно ли вы закрываетересурсы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...