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