为什么在简单的Go Web服务上会得到较大的p95响应时间?

The service simply reads query params and creates an object and returns it to the requester. Yet at times I'm getting 200ms response times. It feels like there's some resource that's not being cleaned up correctly or something, but I don't even know where I should be looking.

Here's what I've tried:

  • Disabling Keep-Alive. There's no additional resources loaded here, so I'm not sure I needed it.
  • Setting the response Connection header to close. Same reasons.
  • Increased the server's ulimit open files to 65535.

Open File Descriptor Settings:

/etc/sysctl.conf

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

/etc/security/limits.conf:

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

Code:

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