在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环境,因此仍在使用相同的底层硬件),就不会发生这些运行时错误。