pcntl_fork()的最大执行时间超过300秒


Maximum execution time of 300 seconds exceeded in pcntl_fork()

我有一些代理运行,经过几周的正常模式,突然我们得到:

Maximum execution time of 300 seconds exceeded

放在

$this->pids[$next_child] = pcntl_fork();

还有:

[root@a ~]# ulimit -u
385913
[root@a ~]# ps ax | wc -l
400
[root@a ~]# cat /proc/sys/kernel/pid_max
4194303
strace shows
poll([{fd=4, events=POLLIN|POLLPRI|POLLHUP}], 1, 1000) = 0 (Timeout)

我们是在php5.4 centos,这可能是一个PHP的错误?或者有什么问题吗?
2年后仍然有这个错误,从那时起我们升级到php5.6,然后到php7,现在到php7.3.1

这个错误有点神秘。因此,我们必须做一些调试来找出问题的根源。

注意:而不是专注于pcntl_fork函数或PHP错误。我将把重点放在系统资源问题上。因为,抛出错误的那一行包含fork。我们会看到从这里开始的

  • 错误可能是错误或不重要。为了测试这一点,将ini_set('MAX_EXECUTION_TIME', -1);添加到脚本的最顶部。如果您的脚本按预期运行,没有任何问题,那么它就是正确的。如果不是,那么我们应该检查这种行为。如果您的代理在正常抛出错误的时间前后开始出现服务客户的问题,这可能意味着该错误意味着资源不足。如果不是这样,你应该检查药剂的行为,这样你就可以更多地了解问题的原因。

  • 这个错误可能与活动URL缓存的大小过高有关,如果你正在使用它,从我听到的

如果问题仍然存在,您需要提供更多关于您的环境和配置的信息,以便我们可以帮助您。

问题:您是否正在使用Magento?

在不了解整个代码体的情况下很难确切地说出…但我的第一个倾向是确保在脚本完成后正确地终止进程。否则,peek使用可能会耗尽资源来处理新进程,但由于它们的性质,"死亡"非常不同。

确保您没有假设使用exit, try会终止进程posix_kill( $this->pids[ $next_child ], 15 );

您可以尝试使用sig 9而不是sig 15,但我不建议在生产环境中使用它-尽管它可能有助于调试问题。实际上,你可能会检查是否有9,这可能就是问题所在……posix_kill( $this->pids[ $next_child ], 9 );不会做任何清理