tcp压测

一般我们tcp连接为serverip:port+clinetip:port,serverip一般为1个,port也为1个,则最大连接为clientport,扣掉一些固定的ip,最大基本上为6万个
这时候我们可以从改变客户端ip来让单台压测机可以压更多连接

  • 网卡虚拟ip,需配合修改路由表,配置比较麻烦
  • 虚拟网卡,云厂商大部分基本都支持配置,最简单高效,需要查看对应机型支持 下面我们来看下对应虚拟网卡如何编写压测程序,linux配置修改以及golang程序如下
vim /etc/sysctl.conf
# 修改端口范围
net.ipv4.ip_local_port_range= 10000 65534
# golang net.listen(xx,backlog)接收队列里连接数
net.core.somaxconn= 10240
sysctl -p
# 直到重启之前一直生效
ulimit -n 500000
#永久生效
vi /etc/security/limits.conf
* soft nofile 500000
* hard nofile 500000



具体代码在github

    var interfaceNames []string = []string{"eth0", "eth1", "eth2", "eth3", "eth4", "eth5"}
    index := rand.Intn(len(interfaceNames))
	ief, err := net.InterfaceByName(interfaceNames[index])
	if err != nil {
		log.Fatal(err)
	}
	addrs, err := ief.Addrs()
	if err != nil {
		log.Fatal(err)
	}
	//如果有多个ip,以及有ipv4/6需要修改下addrs的获取,在bsd/linux addrs里ipv4与ipv6顺序也不一致
	laddr := &net.TCPAddr{
		IP: addrs[len(addrs)-1].(*net.IPNet).IP,
	}
    raddr, err := net.ResolveTCPAddr("tcp4", addr)
    if err != nil {
        panic(err)
    }
    conn, err := net.DialTCP("tcp", laddr, raddr)
    defer conn.Close()
    if err != nil {
        log.Errorf("net.Dial(%s) error(%v)", address, err)
    return
    }