gpt4 book ai didi

go lang http服务器503负载错误

转载 作者:IT王子 更新时间:2023-10-29 02:21:34 26 4
gpt4 key购买 nike

我编写了以下 GO 程序用于目的测试。此 http 服务器接收 get 请求并向另一个 rest 服务发出 http 调用。该程序运行良好,但当我在 2vCPUs 8 GB 框中运行负载测试时。它在大约 500 TPS 后开始提供 Http 503。

func retrievedata(w http.ResponseWriter, r *http.Request){

client := &http.Client{
Timeout: time.Second * 5,
Transport: &http.Transport{
TLSClientConfig: &tls.Config{
InsecureSkipVerify: true,
},
},
}

w.Header().Set("Content-Type", "application/json")
urlstring, _ := url.Parse("https://service.dot.com/backendservice/")

req, _ := http.NewRequest("GET", endpointurl, nil)
req.Header.Set("Accept", "application/json")
req.Header.Set("Content-Type", "application/json")
resp, err := client.Do(req)
if err != nil {
fmt.Println(err)
}

defer resp.Body.Close()


switch resp.StatusCode {
case 200:

data, _ := ioutil.ReadAll(resp.Body)
w.Write(data)
case 404:
w.WriteHeader(http.StatusNotFound)
data, _ := ioutil.ReadAll(resp.Body)
w.Write(data)
case 500:
w.WriteHeader(http.StatusInternalServerError)
data, _ := ioutil.ReadAll(resp.Body)
w.Write(data)
default:
w.WriteHeader(http.StatusNoContent)
}

}


func main() {
fmt.Println("this is a main function")
http.HandleFunc("/getdata", retrievedata)
err := http.ListenAndServe(":8191", nil)
if err != nil {
fmt.Println(err)
}
fmt.Println("Service is Running at port 8191")
}

然后我添加了 go routine 来生成处理函数

go http.HandleFunc("/getdata", retrievedata)

这次我看到 TPS 略有增加,但在大约 600 TPS 后我仍然收到 503 错误。请注意,其他休息功能已针对 2000TPS 进行了测试,因此我确信这没有问题。我是否应该采取任何不同的措施来实现更高的 TPS?

最佳答案

如果你看transport.go你会看到:

var DefaultTransport RoundTripper = &Transport{
//...
MaxIdleConns: 100,
IdleConnTimeout: 90 * time.Second,
//...
}

// DefaultMaxIdleConnsPerHost is the default value of Transport's
// MaxIdleConnsPerHost.
const DefaultMaxIdleConnsPerHost = 2

当它执行 MaxIdleConns: 100 时,它将连接池的大小设置为 100 个连接,但是 DefaultMaxIdleConnsPerHost 将其设置为每个主机 2 个。

所以基本上,您的连接池只能容纳 2 个套接字。因此,如果您要执行 100 个并发请求,一旦它们完成,其中 2 个套接字将在池中保持打开状态,而其他 98 个将关闭并最终进入 TIME_WAIT 状态。

由于这是在负载测试工具的 goroutine 中发生的,因此您只会在 TIME_WAIT 状态下累积数千个连接。最终,您将用完临时端口并且无法打开新的客户端连接。

defaultRoundTripper := http.DefaultTransport
defaultTransportPtr, ok := defaultRoundTripper.(*http.Transport)
if !ok {
panic(fmt.Sprintf("defaultRoundTripper not an *http.Transport"))
}
defaultTransport := *defaultTransportPtr
defaultTransport.MaxIdleConns = 1000
defaultTransport.MaxIdleConnsPerHost = 1000

client = &http.Client{Transport: &defaultTransport}

最重要的是,您正在做的很多工作,您不需要对每个请求都做。你可以更像这样:

var client *http.Client
var endpointurl string
var req http.Request

func init() {
defaultRoundTripper := http.DefaultTransport
defaultTransportPtr, ok := defaultRoundTripper.(*http.Transport)
if !ok {
panic(fmt.Sprintf("defaultRoundTripper not an *http.Transport"))
}
defaultTransport := *defaultTransportPtr
defaultTransport.MaxIdleConns = 1000
defaultTransport.MaxIdleConnsPerHost = 1000
defaultTransport.TLSClientConfig = &tls.Config{
InsecureSkipVerify: true,
}
client = &http.Client{Transport: }
client = &http.Client{
Timeout: time.Second * 5,
Transport: &defaultTransport
}
endpointurl, _ = url.Parse("https://service.dot.com/backendservice/")
req, _ := http.NewRequest("GET", endpointurl, nil)
req.Header.Set("Accept", "application/json")
req.Header.Set("Content-Type", "application/json")
}

func retrievedata(w http.ResponseWriter, r *http.Request){
w.Header().Set("Content-Type", "application/json")
resp, err := client.Do(req)
if err != nil {
fmt.Println(err)
}
defer resp.Body.Close()
switch resp.StatusCode {
case 200:
data, _ := ioutil.ReadAll(resp.Body)
w.Write(data)
case 404:
w.WriteHeader(http.StatusNotFound)
data, _ := ioutil.ReadAll(resp.Body)
w.Write(data)
case 500:
w.WriteHeader(http.StatusInternalServerError)
data, _ := ioutil.ReadAll(resp.Body)
w.Write(data)
default:
w.WriteHeader(http.StatusNoContent)
}

}


func main() {
fmt.Println("this is a main function")
http.HandleFunc("/getdata", retrievedata)
err := http.ListenAndServe(":8191", nil)
if err != nil {
fmt.Println(err)
}
fmt.Println("Service is Running at port 8191")
}

关于go lang http服务器503负载错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46740386/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com