![RH5 中出现“无法分叉:重试...”错误。需要有关 nproc 的信息](https://linux22.com/image/612584/RH5%20%E4%B8%AD%E5%87%BA%E7%8E%B0%E2%80%9C%E6%97%A0%E6%B3%95%E5%88%86%E5%8F%89%EF%BC%9A%E9%87%8D%E8%AF%95...%E2%80%9D%E9%94%99%E8%AF%AF%E3%80%82%E9%9C%80%E8%A6%81%E6%9C%89%E5%85%B3%20nproc%20%E7%9A%84%E4%BF%A1%E6%81%AF.png)
今天早上,我们的一台服务器瘫痪了。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) 错误的进程淹没了你的进程表,从而阻止了新进程的创建。