HTTP-клиент возвращает результат как ноль - PullRequest
0 голосов
/ 04 сентября 2018

Мы работаем с ядром go server под балансировщиком нагрузки и другими вещами.

Теперь, когда количество goroutine (с трассировкой pprof) больше 2500, наш HTTP-клиент возвращает nil в качестве результата.

PPROD Trace

Вот мой код для HTTP-клиента.

client := &http.Client{
Timeout:   time.Second * 130,
Transport: netTransport,
CheckRedirect: func(req *http.Request, via []*http.Request) error {
    return http.ErrUseLastResponse
},
}
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
go func() {
    select {
    case <-ctx.Done():
        log.Error(ctx.Err()) // prints "context deadline exceeded"
        return
    }
}()
vars := mux.Vars(r)
validateTokenURL = authURL + "/" + vars["resource"] + "/authorized" + "?url=" + path
req, _ := http.NewRequest("GET", validateTokenURL, nil)
req.Header = r.Header
req = req.WithContext(ctx)
res, error := client.Do(req)

if error != nil {
    log.Error("The group's number increased tremendously!")
    return nil, nil, false
}
body, err := ioutil.ReadAll(res.Body)
if err != nil {
    log.Error(err.Error())
}
json.Unmarshal(body, &responseBody)
res.Body.Close()
if _, ok := responseBody["data"]; ok && strings.Compare(reflect.TypeOf(responseBody["data"]).String(), "string") == 0 && strings.Compare(responseBody["data"].(string), "ok") == 0 {
    return responseBody, res, true
}
return responseBody, res, false
}

Я установил ulimit примерно на 8 ГБ, плюс у нас 16 ГБ в качестве ОЗУ. Использование памяти составляет менее 20%.

Может ли кто-нибудь помочь нам понять, чего нам не хватает?

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