Go 对等端tcp重置连接

Go 对等端tcp重置连接,go,concurrency,Go,Concurrency,我在通过POST向同一台服务器发送90000多个go例程来执行http请求时遇到问题,服务器和客户端都在本地,一些请求成功执行,其中一些请求给我此响应读取:对等方重置连接 请注意,我在提供的示例中发布了少量数据 但实际上我正在使用protobuf发送大量数据 这是服务器 这是客户 主程序包 进口( “net/http” “字节” “io/ioutil” “日志” “fmt” ) 类型问题结构{ } func main(){ p:=&问题{} p、 客户(“:9090”) } func(自身*问题

我在通过POST向同一台服务器发送90000多个go例程来执行http请求时遇到问题,服务器和客户端都在本地,一些请求成功执行,其中一些请求给我此响应读取:对等方重置连接

请注意,我在提供的示例中发布了少量数据 但实际上我正在使用protobuf发送大量数据

这是服务器

这是客户

主程序包
进口(
“net/http”
“字节”
“io/ioutil”
“日志”
“fmt”
)
类型问题结构{
}
func main(){
p:=&问题{}
p、 客户(“:9090”)
}
func(自身*问题)客户端(端口字符串){
var k int

对于k=0;kDoes,100个goroutine而不是90000多个goroutine也会出现同样的问题?这可能是您的操作系统的限制,例如通过
ulimit
,或者可能是由于流量过大而丢弃数据包?使用单个IP而没有其他配置,您只有16k-28k个临时端口(取决于系统默认值)对于客户端,因此您首先不能同时连接90k个客户端。为每个连接创建一个新的传输,然后丢弃它,从而失去对空闲连接的访问,它们将在使用完资源后保持打开状态--http.client和http.transport用于并发使用。在尝试测试系统限制时,您不能不要只选择一个“非常大的数字”然后问为什么它不起作用,你需要从一个已知的工作配置开始,然后逐步升级。我认为这很接近原因。同样的问题是否发生在100个goroutine而不是90000多个goroutine上?这可能是你的操作系统的限制,比如通过
ulimit
,或者可能是由于存在错误而丢弃数据包如果流量过大?使用单个IP而没有其他配置,您只有16k-28k临时端口(取决于系统默认值)对于客户端,因此您首先不能同时连接90k个客户端。为每个连接创建一个新的传输,然后丢弃它,从而失去对空闲连接的访问,它们将在使用完资源后保持打开状态--http.client和http.transport用于并发使用。在尝试测试系统限制时,您不能不要只是选择一个“非常大的数字”,然后问为什么它不起作用,你需要从一个已知的工作配置开始,然后逐步增加。我认为这很接近原因。
package main

import (
    "net/http"
    "log"
    "encoding/json"
)

var port string

type problem struct{
}

func main() {
    p := &problem{}
    p.server(":9090")
}

func (self *problem)server(port string) {
    s := &http.Server{
        Addr:           port,
        Handler:        self,
    }
    log.Println("Server started")
    // Should be last line as it is a blocking.
    log.Fatal(s.ListenAndServe())
}

func (self *problem) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    w.WriteHeader(http.StatusCreated)
    if err := json.NewEncoder(w).Encode(map[string]interface{}{"created": true}); err != nil {
        log.Fatal(err.Error())
    }
}
package main

import (
    "net/http"
    "bytes"
    "io/ioutil"
    "log"
    "fmt"
)

type problem struct{
}

func main() {
    p := &problem{}
    p.client(":9090")
}

func (self *problem)client(port string) {
    var k int

    for k=0;k<90000;k++ {

        go func(){

            nativeRequest, err := http.NewRequest(
                "POST",
                "http://127.0.0.1" + port + "/",
                bytes.NewBuffer([]byte(`testing`)),
            )

            nativeRequest.Close = true

            if err != nil {
                fmt.Println(err.Error())
            }

            client := &http.Transport{
            }
            nativeResponse, err := client.RoundTrip(nativeRequest)

            if err != nil {
                log.Println(err.Error())
            }

            if nativeResponse != nil {
                defer nativeResponse.Body.Close()

                if err != nil {
                        fmt.Println(err.Error())
                }

                body, err := ioutil.ReadAll(nativeResponse.Body)

                if err != nil {
                        fmt.Println(err.Error())
                }

                fmt.Println(string(body))
            }
        }()
    }
}