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

时间:2019-08-19 13:31:01

标签: go goroutine ulimit

在54核计算机上,我使用os.Exec()生成数百个客户端进程,并使用大量goroutine对其进行管理。

有时但并非总是如此:

runtime: failed to create new OS thread (have 1306 already; errno=11)
runtime: may need to increase max user processes (ulimit -u)
fatal error: newosproc

我的ulimit已经很高了:

$ ulimit -u
1828079

如果我将自己限制在54位客户中,那将永远没有问题。

有没有一种方法可以更优雅地处理这种情况?例如。不会因为致命错误而轰炸,而只是做更少/延迟的工作?还是要提前查询系统并预测我可以做的最大工作量(虽然我不只是想限制内核数)?

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

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

0 个答案:

没有答案