Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我在一个简单的Go web服务上获得了很大的p95响应时间?_Go_Response - Fatal编程技术网

为什么我在一个简单的Go web服务上获得了很大的p95响应时间?

为什么我在一个简单的Go web服务上获得了很大的p95响应时间?,go,response,Go,Response,该服务只是读取查询参数并创建一个对象,然后将其返回给请求者。但有时我会得到200毫秒的响应时间。感觉好像有一些资源没有被正确清理或者其他什么,但我甚至不知道我应该去哪里寻找 以下是我尝试过的: 我要活下去。这里没有加载额外的资源,所以我不确定我是否需要它 将响应连接标题设置为关闭。同样的原因 将服务器的ulimit打开文件增加到65535 打开文件描述符设置: /etc/sysctl.conf # increase max open files fs.file-max = 65536 /e

该服务只是读取查询参数并创建一个对象,然后将其返回给请求者。但有时我会得到200毫秒的响应时间。感觉好像有一些资源没有被正确清理或者其他什么,但我甚至不知道我应该去哪里寻找

以下是我尝试过的:

  • 我要活下去。这里没有加载额外的资源,所以我不确定我是否需要它
  • 将响应
    连接
    标题设置为关闭。同样的原因
  • 将服务器的ulimit打开文件增加到65535
打开文件描述符设置:

/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
代码:


也许你可以通过删除
mux
库或者只返回一个简单的字符串来检查原因?我不确定你所说的“检查原因”是什么意思,我应该寻找什么?我想我理解你留下来的原因。通过将应用程序简化为最简单的状态,进一步消除变量。是的,这是公平的,我可能会进一步降低它,但我仍然惊讶地看到,在这样一个简单的请求上,这种糟糕的性能。是的,我没有使用
mux
库,但您可以通过这种方式进一步检查性能损失,
mux
or go itself它在AWS上的事实意味着它与无数其他服务共享,因此预期性能会不稳定。要获得有意义的测试,请在专用机器上运行它,而无需其他操作。如果您仍然获得不稳定的性能,那么实际上有一些事情需要调查。也许您可以通过删除
mux
库或只返回一个简单的字符串来检查原因?我不确定“检查原因”是什么意思?我想我理解您留下来的原因。通过将应用程序简化为最简单的状态,进一步消除变量。是的,这是公平的,我可能会进一步降低它,但我仍然惊讶地看到,在这样一个简单的请求上,这种糟糕的性能。是的,我没有使用
mux
库,但您可以通过这种方式进一步检查性能损失,
mux
or go itself它在AWS上的事实意味着它与无数其他服务共享,因此预期性能会不稳定。要获得有意义的测试,请在专用机器上运行它,而无需其他操作。如果您仍然得到不稳定的性能,那么实际上有一些东西需要调查。
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))
}