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