go - 为什么我在一个简单的 Go Web 服务上得到很大的 p95 响应时间?
问题描述
该服务只需读取查询参数并创建一个对象并将其返回给请求者。然而有时我会得到 200 毫秒的响应时间。感觉好像有些资源没有被正确清理或其他什么,但我什至不知道我应该去哪里找。
这是我尝试过的:
- 禁用保持活动。这里没有加载额外的资源,所以我不确定我是否需要它。
- 将响应
Connection
标头设置为关闭。同样的原因。 - 将服务器的 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
代码:
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))
}
解决方案
推荐阅读
- rust - “活得不够长”错误与“弱”
>` - javascript - 转换为 JS 对象
- spring - Kotlin Spring boot Whitelabel 错误页面
- ios - 在 REST 中处理 Swift Optionals 和部分 JSON 表示/响应
- r - 使用顶部时减少行间距
- javascript - 在不触发更新的情况下从商店获取
- c# - 如何循环 System.Collections.Generic.List`1[CardDistro.Models.Transaction]
- opencv - 在 OpenCV 中处理视频,无需播放
- google-contacts-api - 在 Google Contact CardDav 同步中得到“权限不足”
- java - 回收站视图显示空卡 Android