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