donglu5235 2019-05-28 00:27
浏览 88

为什么在简单的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

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥40 复杂的限制性的商函数处理
    • ¥15 程序不包含适用于入口点的静态Main方法
    • ¥15 素材场景中光线烘焙后灯光失效
    • ¥15 请教一下各位,为什么我这个没有实现模拟点击
    • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
    • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
    • ¥20 有关区间dp的问题求解
    • ¥15 多电路系统共用电源的串扰问题
    • ¥15 slam rangenet++配置
    • ¥15 有没有研究水声通信方面的帮我改俩matlab代码