RH5 中出现“无法分叉:重试...”错误。需要有关 nproc 的信息

RH5 中出现“无法分叉:重试...”错误。需要有关 nproc 的信息

今天早上,我们的一台服务器瘫痪了。SSH 访问中断,网络访问也暂时中断。我们能够使用带外访问登录,但屏幕上却全是“Init:无法分叉,请重试...”消息。

尝试登录时,如果我们输入了用户名和错误的密码,就会出现正常的“无效用户名/密码”错误。但是,如果我们输入了正确的用户名和密码,系统只会再次显示 MOTD 和登录屏幕。看起来系统不再能够启动任何新进程(成功登录应该会启动 shell,如果不能,我猜它会让您回到登录状态?)。

我在 Red Hat 的知识库中找到了该问题的描述(https://access.redhat.com/site/solutions/39497),但关于该错误的补充信息很少,只是建议的解决方案。

nproc 到底起什么作用?它是否对系统在任意时间点可以运行的进程数进行了硬性限制?超过 nproc 是否会产生我们所看到的影响?有没有办法将其设置为无限制?如果没有,我们如何知道安全或不安全的范围?

任何帮助或指导都将不胜感激,因为它导致了生产问题,现在已由几位第 8 层人员负责处理 :(

编辑:同样在 /var/log/messages 中:

May 31 15:26:00 servername udevd[1637]: udev_event_run: fork of child failed: Resource temporarily unavailable
May 31 15:26:00 servername last message repeated 3 times
May 31 15:26:00 servername udevd-event[2461]: run_program: fork of '/lib/udev/udev_run_hotplugd' failed: Resource temporarily unavailable
May 31 15:26:00 servername udevd-event[2461]: run_program: fork of '/lib/udev/udev_run_devd' failed: Resource temporarily unavailable
May 31 15:26:00 servername udevd[1637]: udev_event_run: fork of child failed: Resource temporarily unavailable

答案1

错误消息意味着服务器超出了进程数限制。有两个限制 - 硬限制和软限制。当您 fork() 时,您会从现有进程创建一个新进程。这里,我们有一些不允许 fork() 的条件。

您在分叉 udev 子进程时遇到了问题。我猜这是在启动时发生的。请参阅此

udev_run_hotplugd 的目录

所以那里有一些热插拔设备。否则,我看不出调用该库有什么理由。

现在有两个建议——

1) 如果您可以重现它,请尽可能对其进行 strace。找到失败的系统调用。这样就容易多了。我不记得具体是哪个系统调用了。

2)以调试模式运行udev。更改udev_log=info为调试首先测试一下。它会生成大量日志,如果没有合适的环形缓冲区大小或超宽显示器,则丢失终端上显示的消息是很常见的。

但我经常看到这个问题。让我告诉你,如果你有订阅,为什么不问问 Red Hat 的人呢。

答案2

听起来就像 (1) 你用完了内存+交换空间,或者 (2) 错误的进程淹没了你的进程表,从而阻止了新进程的创建。

相关内容