拨号错误:“打开文件太多”

时间:2015-01-08 19:08:47

标签: sockets tcp go network-programming

我正在尝试编写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

0 个答案:

没有答案