我正在尝试编写TCP客户端 - 服务器程序,以查找服务器处理的最大并发连接数。所以我创建了一个简单的服务器并启动了多个tcp连接(使用go例程)。
server.go
func main() {
ln, err := net.Listen("tcp", ":9100")
if err != nil {
fmt.Println(err.Error())
}
defer ln.Close()
fmt.Println("server has started")
for {
conn, err := ln.Accept()
if err != nil {
fmt.Println(err.Error())
}
conn.Close()
fmt.Println("received one connection")
}
}
client.go
func connect(address string, wg *sync.WaitGroup) {
conn, err := net.Dial("tcp", address)
if err != nil {
fmt.Println(err.Error())
os.Exit(-1)
}
defer conn.Close()
fmt.Println("connection is established")
wg.Done()
}
func main() {
var wg sync.WaitGroup
for i := 0; i < 10000; i++ {
wg.Add(1)
fmt.Printf("connection %d", i)
fmt.Println()
go connect(":9100", &wg)
}
wg.Wait()
fmt.Print("all the connection served")
}
我原本期望服务器因TCP SYN连接而无响应但我的客户端应用程序在~2000连接请求后崩溃了。以下是错误消息:
dial tcp :9100: too many open files
exit status 255
我需要以下问题的帮助:
client.go
在我的go服务器上模拟TCP连接泛滥所需的更改。
如果进动的最大开放FD有限制,我怎么能增加开放FD(mac OS)的数量。
Listen()的默认TCP队列大小是什么(使用C编程语言,队列大小在listen(fd, queue_size)
中指定)。
编辑:
ulimit设置
$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) unlimited
max memory size (kbytes, -m) unlimited
open files (-n) 10000
pipe size (512 bytes, -p) 1
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 709
virtual memory (kbytes, -v) unlimited