为了账号安全,请及时绑定邮箱和手机立即绑定

压力测试时,客户端创建4万多连接后出错

/ 猿问

压力测试时,客户端创建4万多连接后出错

aluckdog 2018-09-09 10:19:57

在压力测试时,连接超过4万(TCP端口共6万多),压测程序会抛出connect: cannot assign requested address. 
服务端的连接可支持上百万,并经过初步分析客户度出错时TCP端口是被全部占用. 
请问如何解决压力测试时 压测程序TCP端口不足的问题?

package main


import (

    "golang.org/x/net/websocket"

    "log"

    "time"

    "fmt"

)


func connect() {

    origin := "http://127.0.0.1/"

    url := "ws://127.0.0.1:8080/ws"

    _, err := websocket.Dial(url, "", origin)

    if err != nil {

        log.Fatal(err)

    }

}


func main() {

    for i := 0; i < 100000; i++ {

        go connect()

        fmt.Println(i)

    }

    time.Sleep(time.Second * 100)

}


查看完整描述

2 回答

?
阿波罗的战车

内核是以一个(著名的)5元信息组来标识不同的socket的:源地址、源端口、目的地址、目的端口、协议号。
任何一个不同,都不叫“同一个socket”。客户端绑定多个IP地址 一个IP可开65535个端口,那么多个IP是多少呢?

查看完整回答
反对 回复 2018-09-29
?
达令说

创建虚拟IP
ifconfig eth0:0 192.168.1.101 netmask 255.255.255.0 up

connect函数接收虚拟IP参数:

func connect(localip string) {

    origin := "http://192.168.1.150/"

    url := "ws://192.168.1.150:8080/ws"

    //ws, err = websocket.Dial(url, "", origin)

    config,err := websocket.NewConfig(url, origin)

    if err != nil{

        log.Println(err)

        return

    }

    localaddr := &net.TCPAddr{IP:net.ParseIP(localip)}

    remoteaddr := &net.TCPAddr{IP:net.ParseIP("192.168.1.150"),Port:8080}

    client,err := net.DialTCP("tcp4",localaddr,remoteaddr)

    if err != nil{

        log.Println(err)

        return

    }

    _, err = websocket.NewClient(config,client)

    if err != nil {

        log.Println(err)

    }

    time.Sleep(time.Second*100)

    return

}


查看完整回答
反对 回复 2018-09-29

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信