运行时:无法创建新的操作系统线程

sbs*_*sbs 5 go ulimit goroutine

在 54 核机器上,我用来os.Exec()生成数百个客户端进程,并使用大量的 goroutine 来管理它们。

\n\n

有时,但并非总是,我会得到这样的信息:

\n\n
runtime: failed to create new OS thread (have 1306 already; errno=11)\nruntime: may need to increase max user processes (ulimit -u)\nfatal error: newosproc\n
Run Code Online (Sandbox Code Playgroud)\n\n

我的 ulimit 已经相当高了:

\n\n
$ ulimit -u\n1828079\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果我将自己限制在 54 个客户之内,那绝对不会有问题。

\n\n

有没有办法可以更优雅地处理这种情况?例如\xc2\xa0不会因为致命错误而崩溃,而只是做更少/延迟的工作?或者提前查询系统并预测我可以做的最大数量的事情(尽管我不想限制核心数量)?

\n\n

鉴于我的 ulimit 很大,这个错误是否应该发生?grep -c goroutine致命错误后的堆栈输出仅给出 6087。每个客户端进程(其中肯定少于 2000 个)可能有一些自己的 goroutine,但没什么疯狂的。

\n\n

编辑:该问题仅发生在高核机器(~60)上。保持其他一切不变,只需将内核数量更改为 30(这是 OpenStack 环境,因此仍在使用相同的底层硬件),就不会发生这些运行时错误。

\n