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

发布于 2022-09-02 01:24:42 字数 593 浏览 19 评论 0

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

柠檬色的秋千 2022-09-09 01:24:42

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

2022-09-09 01:24:42

感谢@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
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文