下面是一个简单的Go http(tcp)连接测试脚本

func main() {
    ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintln(w, "Hello, client")
    }))
    defer ts.Close()
    var wg sync.WaitGroup
    for i := 0; i < 2000; i++ {
        wg.Add(1)
        go func(i int) {
            defer wg.Done()
            resp, err := http.Get(ts.URL)
            if err != nil {
                panic(err)
            }
            greeting, err := ioutil.ReadAll(resp.Body)
            resp.Body.Close()
            if err != nil {
                panic(err)
            }
            fmt.Printf("%s", i, greeting)
        }(i)
    }
    wg.Wait()
}

如果我在Ubuntu中运行这个程序,我会得到:

panic: Get http://127.0.0.1:33202: dial tcp 127.0.0.1:33202: too many open files

其他帖子说要确保Close%的连接,我在这里做这一切.

如何在一台服务器上运行数百万个tcp连接Goroutine?

谢谢,

推荐答案

我认为你需要更改你的max文件描述符.我以前在一个开发虚拟机上遇到过同样的问题,需要更改文件描述符max,而不是使用inotify设置.

顺便说一句,你的程序在我的虚拟机上运行得很好.

·> ulimit -n
120000

但是在我跑完之后

·> ulimit -n 500
·> ulimit -n
500

我得到了:

panic: Get http://127.0.0.1:51227: dial tcp 127.0.0.1:51227: socket: too many open files

**不要落入普拉文做的trap **

ulimit!=ulimit -n.

➜  cmd git:(wip-poop) ✗ ulimit -a
-t: cpu time (seconds)              unlimited
-f: file size (blocks)              unlimited
-d: data seg size (kbytes)          unlimited
-s: stack size (kbytes)             8192
-c: core file size (blocks)         0
-v: address space (kbytes)          unlimited
-l: locked-in-memory size (kbytes)  unlimited
-u: processes                       1418
-n: file descriptors                4864

Go相关问答推荐

Golang Cososdb-gremlin连接

gorm如何声明未自动更新的unix时间戳米尔斯字段

GoLang:无法发送带有附件的邮箱

如何使用Gorilla WebSockets实现Http.Hijacker&;alexedwards/scs/v2

在不耗尽资源的情况下处理S3文件下载

未对GoFr中的所有请求进行跟踪

如何在gofiber/websocket/v2中设置状态代码和原因

Go 1.20 中如何计算连接错误?

如何忽略打印达到最大深度限制 go colly

一个Go module可以和之前的非module模块发布在同一个路径下吗?

在密钥不存在时处理 PATCH 部分更新

判断一个区域内的纬度/经度点

创建新对象后如何返回嵌套实体?

动态 SQL 集 Golang

具有嵌套重复的正则表达式

Wire google Inject with multi return from provider 函数

为超时的单元测试创​​建 deadlineExceededError:true

在恒等函数中将类型 T 转换为类型 U

Golang并发写入多个文件

在 docker kill --signal=SIGX 上以这种方式关闭容器内运行的 go 应用程序是否安全?