fork: 重试:资源暂时不可用

81

我尝试在我的电脑上安装Intel MPI Benchmark,但出现了以下错误:

fork: retry: Resource temporarily unavailable

当我运行lstop命令时,我再次收到了这个错误。

是什么导致了这个错误?

我的机器配置:

Dell precision T7500
Scientific Linux release 6.2 (Carbon)

请查阅您的Linux文档,了解如何增加进程数量。 - theglauber
2
也许这会有所帮助:https://dev59.com/a3RC5IYBdhLWcg3wS_EF - theglauber
2个回答

85

通常情况下,这是由于文件描述符不足导致的。

系统会有总共的文件描述符限制,您可以通过以下命令获得:

sysctl fs.file-nr

这将返回文件描述符的计数:

<in_use> <unused_but_allocated> <maximum>

要查找用户的文件描述符限制,请运行以下命令:

sudo su - <username>
ulimit -Hn

要查找一个用户正在使用的文件描述符数量,请运行以下命令:

sudo lsof -u <username> 2>/dev/null | wc -l

如果您现在遇到系统文件描述符限制的问题,您需要编辑您的/etc/sysctl.conf文件,并添加一行fs.file-max,如果它已经存在,则修改它并将其设置为足够处理所需文件描述符数量的值,然后重新启动系统。

fs.file-max = 204708

17
请参考翻译:FYI,您可以使用“sysctl -p”命令应用当前的设置到/etc/sysctl.conf文件中,无需重新启动即可生效。 - EmmEff
2
另外,如果你只有/etc的读取权限,在运行时可以使用命令“sysctl -w fs.file-max=204708”。 - Ondrej Galbavý
你可以将以下命令直接添加到内核中,而无需重启系统,但这种修改不会永久生效:'echo 999999 > /proc/sys/fs/file-max'。 - mati kepa
sysctl fs.file-nr 命令在 Mac 上无法工作。 - Prateek Sharma

52

另一个可能性是线程过多。当我们针对使用线程池的应用程序运行测试工具时,我们遇到了这个错误消息。我们使用了

watch -n 5 -d "ps -eL <java_pid> | wc -l"

观察给定的Java进程ID中正在运行的Linux本地线程计数。 在此达到约1,000(对我们而言-您的情况可能有所不同),我们开始收到您提到的错误消息。


2
当我进行测试时,ps -eL 可以显示所有进程,而 ps -L <pid> 则可以显示与 <pid> 相关的进程。ps -eL <pid> 只会显示所有进程,而不管 <pid> 是什么。 - Sanghyun Lee
1
@Willie Wheeler 您是如何克服线程限制的?我已经在网上寻找和尝试了许多解决方案,但都没有成功,已经持续了好几天了。除了重新启动systemd-logind可以允许超过1k个线程外,其他什么都不起作用,而且重新启动的效果只能维持一个小时左右就又出现错误! - Brandon Elliott
机器资源是有限的。如果你达到了极限,可以使用更少的线程(例如通过线程池控制),或者使用更多的机器。 - user41871
我重新启动了我的Rails服务器。 - thedanotto
2
1000个线程并不算很多。 - frankster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接