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

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

在压力测试时,连接超过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)
}

感谢@xutongle提供VIP的思路,客户端绑定VIP确实解决了TCP端口不足的问题.

同时,还需要对系统诸多设置进行优化,可参考使用八种框架分别实现百万websocket常连接的服务器

创建虚拟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
}

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

【热门文章】
【热门文章】