在压力测试时,连接超过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是多少呢?