Почему я получаю большое время отклика p95 на простом веб-сервисе Go? - PullRequest
1 голос
/ 28 мая 2019

Служба просто читает параметры запроса, создает объект и возвращает его запрашивающей стороне. И все же время от времени я получаю время отклика 200 мс. Такое ощущение, что есть какой-то ресурс, который не очищается правильно или что-то в этом роде, но я даже не знаю, где мне искать.

Вот что я пробовал:

  • Отключение Keep-Alive. Здесь нет загруженных дополнительных ресурсов, поэтому я не уверен, что мне это нужно.
  • Установка ответа Connection Заголовок для закрытия. Те же причины.
  • Увеличено количество открытых файлов на сервере до 65535.

Настройки дескриптора открытого файла:

/ и т.д. / sysctl.conf

# increase max open files
fs.file-max = 65536

/ и т.д. / безопасность / limits.conf:

*               soft    nproc           65535
*               hard    nproc           65535
*               soft    nofile          65535
*               hard    nofile          65535

Код:

package main

import (
    "time"
    "net/http"
    "encoding/json"
    "github.com/gorilla/mux"
)

func main() {
    // router
    router := mux.NewRouter()

    // v1 router
    v1router := router.PathPrefix("/v1").Subrouter()
    v1router.HandleFunc("/resource", createResource).Methods("GET")

    // server config
    server := &http.Server{
        Addr:         ":8080",
        ReadTimeout:  time.Millisecond * 500,
        WriteTimeout: time.Millisecond * 100,
        IdleTimeout:  time.Millisecond * 500,
        Handler:      router,
    }

    server.SetKeepAlivesEnabled(false)

    // start server
    server.ListenAndServe()
}


type Resource struct {
    Id string
    Name string
}

func createResource(response http.ResponseWriter, request *http.Request) {
    // connection header
    response.Header().Set("Connection", "close")
    defer request.Body.Close()

    // get query params
    params := request.URL.Query()

    // create resource
    resource := Resource{
        Id: "testid",
        Name: params.Get("name"),
    }

    // convert resource to string
    resourceStr, _ := json.Marshal(resource)

    response.WriteHeader(http.StatusOK)
    _, _ = response.Write([]byte(resourceStr))
}

enter image description here

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