【问题标题】:Can't connect to tcp server more than 140 connections?无法连接到超过 140 个连接的 tcp 服务器?
【发布时间】:2017-02-15 18:41:23
【问题描述】:

我正在 golang 中构建一个 tcp 套接字服务器。它适用于少于 ~140 个客户端连接。但是如果我尝试将最大连接数设置为 500,则在第 140 个客户端之后不会连接到服务器。

我将文件描述符计数增加到 1048576,但它仍然不起作用。

$ulimit -n
1048576

我认为问题来自操作系统。(服务器和客户端在同一台机器上工作)所​​以操作系统信息:

Mac OS 10.12 Sierra 64 位。

有人知道为什么我不能增加 tcp 连接数吗?

github

【问题讨论】:

  • 用代码发布一个要点,以便我们检查
  • 连接 140 次后您看到的具体错误类型是什么?
  • 我没有收到任何错误。约 140 次连接后无法建立任何连接。

标签: macos sockets go tcp


【解决方案1】:

我和你在同一个操作系统上,但我无法重现你的问题。我正在使用 Go 版本 1.7.4。我还没有在 Go 1.8 上测试过,但它今天早些时候发布了。

我创建了两个文件,server.go 和 client.go(转载如下)。当我运行它们时,我获得了超过 140 个连接。在运行之前,我切换到 root 并像这样设置 ulimit:

$ sudo -s
$ ulimit -n 10000

客户端输出:

Established 1 connections
...
Established 2971 connections
panic: dial tcp 127.0.0.1:1337: socket: too many open files in system

服务器输出的东西非常相似。

这里是client.go:

package main

import (
    "fmt"
    "net"
)

func main() {
    var numConns int
    for {
        _, err := net.Dial("tcp", "127.0.0.1:1337")
        if err != nil {
            panic(err)
        }
        numConns++
        fmt.Println("Established", numConns, "connections")
    }
}

还有 server.go:

package main

import (
    "fmt"
    "net"
)

func main() {
    listener, err := net.Listen("tcp", ":1337")
    if err != nil {
        panic(err)
    }
    var numConns int
    for {
        _, err := listener.Accept()
        if err != nil {
            panic(err)
        }
        numConns++
        fmt.Println("Got", numConns, "connections")
    }
}

【讨论】:

    【解决方案2】:

    这不是操作系统的问题,而是硬件的问题。很可能是你的路由器有问题。当您进入该范围时,商业路由器确实往往会失败。我的猜测是,Alex 正在一家拥有商业级路由器的大公司或大学进行测试,而您正在家里进行测试。

    【讨论】:

      猜你喜欢
      • 2014-09-22
      • 1970-01-01
      • 1970-01-01
      • 2019-10-18
      • 1970-01-01
      • 2012-07-30
      • 2017-02-24
      • 1970-01-01
      • 2020-09-09
      相关资源
      最近更新 更多