Получение слишком большого количества открытых файлов во время нагрузочного теста с помощью gin gonic - PullRequest
0 голосов
/ 22 сентября 2018

Чтобы выполнить тест с имитацией нагрузки, настройте базовый API REST в оболочке Go gin-gonic с приведенным ниже кодом и после примерно 1000+ запросов получите ошибку

http: Accept error: accept tcp[::]: 8123: accept4: слишком много открытых файлов;повторная попытка в 1с

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")
}

Исходя из этого вопроса здесь Я понимаю, что это можно исправить, выполнив команду ulimit, но это только задержит проблему.

Когда я выполняю команду netstat -tc, я вижу, что новые соединения установлены и продолжают находиться в состоянии ESTABLISHED еще долго после того, как запрос обслужен.

Как и ожидалось, когда я проверял /proc / $ PID / limits, как и ожидалось, видна следующая запись:

Max open files            1024                 4096                 files

Пожалуйста, помогите мне, какие другие варианты я мог бы попытаться исправить это правильно.

Я использую запросы curlотправлять запросы для проверки выше.

1 Ответ

0 голосов
/ 07 октября 2018

В пакете http Go по умолчанию не указывается время ожидания запроса.Вы всегда должны включать тайм-аут в вашем сервисе.Что делать, если клиент не закрывает свою сессию?Ваш процесс будет поддерживать старые сессии, достигая предельных значений.Плохой актер может преднамеренно открыть тысячи сессий, используя ваш сервер.

Попробуйте что-то вроде этого:

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

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