Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 运行时:未能创建新的操作系统线程_Go_Goroutine_Ulimit - Fatal编程技术网

Go 运行时:未能创建新的操作系统线程

Go 运行时:未能创建新的操作系统线程,go,goroutine,ulimit,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 -

在一台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个客户,就不会有问题

有什么方法可以让我更优雅地处理这种情况吗?例如,不要因为一个致命的错误而大发雷霆,而是做更少/延迟的工作?或者提前查询系统,并预测我能做的最大数量的事情(我不想只限制内核的数量)

考虑到我巨大的ulimit,这个错误是否应该发生<致命错误后堆栈输出上的code>grep-c goroutine仅给出6087。每个客户机进程(当然少于2000个)可能都有自己的一些goroutine,但没有什么疯狂之处


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

有趣的情况。顺便说一句,计算goroutine不会帮助解决您的问题,因为goroutine与线程没有直接关系。从理论上讲,您可能有数百万个goroutine,而只有一个操作系统线程。您是否尝试过修改
GOMAXPROVS
环境变量?另请参见更新(替换先前的注释):查看运行时源代码(参见前面的链接及其链接),您肯定会遇到EAGAIN错误。我不清楚的是,为什么你已经有了1306,却又得到了另一个线程,也不清楚为什么你的系统在1306运行,可能你已经达到了系统范围的极限。请参阅fork手册页和
cat/proc/sys/kernel/pid_max
/proc/sys/kernel/threads max
;您可能也达到了cgroup
pids.max
的下限。嗯,如果您的客户端进程自己管理goroutine,为什么不将客户端进程重构为goroutine呢?