这是一个简单的 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
连接,我在这里做这一切。
还有人说增加最大连接限制ulimit
or try sudo sysctl -w fs.inotify.max_user_watches=100000
但仍然不起作用。
如何在单个服务器中运行数百万个 tcp 连接 goroutine?
只有 2,000 个连接才会崩溃。
Thanks,
我认为您需要更改最大文件描述符。我之前在我的一台开发虚拟机上遇到过同样的问题,需要更改文件描述符最大值,而不是 inotify 设置的任何内容。
FWIW,你的程序在我的虚拟机上运行良好。
·> ulimit -n
120000
但当我跑完之后
·> ulimit -n 500
·> ulimit -n
500
I get:
panic: Get http://127.0.0.1:51227: dial tcp 127.0.0.1:51227: socket: too many open files
** 不要落入 Praveen 那样的陷阱 **
Note 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)