在pcntl_fork()中,超过了300秒的最大执行时间。

6

我有一些代理正在运行,在几周的正常模式后,突然出现以下错误:

超过300秒的最大执行时间

错误出现在以下代码行:

$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的bug吗?还是有其他问题?
更新 两年后仍然存在此错误,之后我们升级到了php5.6,然后是php7,现在是php7.3.1。


检查您的顶级进程,是否有卡住的? - Ohgodwhy
不,没有挂起,负载为0.1。 - Pentium10
@bwoebi,我们在php5.3上没有遇到这个问题,一旦升级到php5.4后,每周就会出现一次。 - Pentium10
@Pentium10 嗯,我们也无法确定。也许这里失败是因为fork()是一个缓慢的操作,并且在那时已经过去了299.97秒,但原因可能在其他地方。唯一清楚的是,pnctl_fork()不是问题的根源。 - bwoebi
@Pentium10 没有更多的信息很难找出你的问题。 - ablm
显示剩余7条评论
2个回答

1

这个错误有点晦涩难懂。所以,我们必须进行一些调试才能找到问题的根源。

注意: 与其集中精力于函数pcntl_fork或PHP错误,不如将重点放在这可能是系统资源问题上。因为,抛出错误的那行代码包含了fork。从那里开始看看它会去哪里

  • 这个错误可能是一个bug或者不太重要。为了测试这个,你可以在脚本的最顶部添加ini_set('MAX_EXECUTION_TIME', -1);。如果你的脚本按预期运行没有任何问题,那么就是真的。如果不能,那么我们应该检查行为。如果你的代理在他们通常会抛出错误的时间周围开始遇到为客户提供服务的问题,那么可能意味着错误的意思是资源不足之类的问题。如果不是这种情况,你应该检查代理的行为,以便了解问题的原因。

  • 如果你在使用Active URL Cache时,错误可能与Active URL缓存大小过高有关。

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

问题:你是否使用Magento?

这是一个自定义的PHP代理系统,不是Magento。 - Pentium10
@Pentium10 我看到一个使用 Magento 的线程有相同的问题,所以我认为它可能是相关的。但是,我猜我的答案并没有帮助到你,因为你给了负评。 - Tamer Tas
这不是我的投票反对,无论如何你只是重复别人说过的话。随着时间的推移,每7-10天就会出现一次,而且不是大规模的,随机在不同的代理上出现,但是同一台机器,而且只有这个机器使用PHP5.4,我仍然认为这是PHP的一个bug。 - Pentium10
@Pentium10 你是否记录代理的活动?资源使用情况,事件等,除了错误之外?PHP 5.4可能会对您的设置产生微妙的影响,而不是存在错误。它最终可能是一个错误。但是,小心总比后悔好。 - Tamer Tas
我有日志,收集了collectd和StatsD数据以及Graphite统计数据。没有显示出服务的耗尽。我还检查了其他服务的工作情况,其他服务没有故障。如果是系统限制导致的问题,那么同一台机器上的其他服务如redis、galera、elasticsearch也会失败。但它们都没有受到影响。 - Pentium10

0

不知道整个代码的具体情况,很难说清楚...但我的第一反应是确保在脚本完成后正确终止进程。如果没有这样做,峰值使用可能会耗尽资源来处理新进程,但由于它们的性质,它们的“死亡”方式非常不同。

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

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


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