【问题标题】:Maximum execution time of 300 seconds exceeded in pcntl_fork()pcntl_fork() 中超过 300 秒的最大执行时间
【发布时间】:2014-07-05 17:25:29
【问题描述】:

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

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 的 bug?或者有什么问题?
更新 2年后仍然出现此错误,从那时起我们升级到php5.6,然后升级到php7,现在升级到php7.3.1

【问题讨论】:

  • 检查你的顶级进程,有什么问题吗?
  • 不,没有挂起,负载在 0.1
  • 这绝对不像是 PHP 错误。 pcntl_fork() 直接使用 fork(2) 系统调用。我不知道 fork() 系统调用实现,但看起来 poll() 被调用以等待循环中成功创建进程。现在只是推测...您必须查看 Linux 源代码才能准确了解此处发生的情况,以便 strace 可以为您提供更多帮助...
  • @bwoebi 我们在 php5.3 上没有这个问题,一旦我们升级到 php5.4,我们每周都会有这个问题。
  • @Pentium10 好吧,还有其他一些虚假的东西,但不是 pnctl_fork() 调用。自 PHP 4 以来,它的实现没有改变。所以:您在此处描述的内容不足以解决您的问题。

标签: php linux process centos


【解决方案1】:

这个错误有点神秘。所以,我们必须做一些调试才能找到问题的根源。

注意: 而不是专注于函数pcntl_fork 或PHP 错误。我将专注于这是一个系统资源问题。因为,它抛出错误的行包含 fork。我们会看看它从那里去哪里

  • 错误可能是错误或不重要的。要对此进行测试,请将 ini_set('MAX_EXECUTION_TIME', -1); 添加到脚本的最顶部。如果您的脚本按预期运行而没有任何问题,那么它是正确的。如果不是,那么我们应该检查行为。如果您的代理在他们通常会抛出错误的时候开始遇到为客户提供服务的问题,那可能意味着错误意味着资源不足。如果不是这种情况,您应该检查代理的行为,以便了解有关问题原因的更多信息。

  • 据我所知,如果您使用的是 Active URL 缓存,则该错误可能与它的大小过高有关。

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

问题:您是否有机会使用 Magento?

【讨论】:

  • 这是一个自定义的 PHP 代理系统,不是 Magento。
  • @Pentium10 我看到一个线程在使用Magento 时遇到了同样的问题,所以我认为这可能是相关的。但是,我想我的回答根本没有帮助,因为你投了反对票。
  • 这不是我的反对意见,反正你只是重复别人所说的。随着更多的时间过去了,并且每隔 7-10 天就会有一次,而不是大量,在不同的代理上随机出现,但在同一台机器上,只有 PHP5.4 我仍然认为这是一个 PHP 错误。
  • @Pentium10 你在记录代理的活动吗?除了错误之外的资源使用情况、事件等? PHP 5.4 可能会有细微的变化影响您的设置,而不是出现错误。它最终可能是一个错误。但是,安全总比后悔好。
  • 我确实有日志,并且收集了甚至 StatsD 数据和 Graphite 统计数据。没有任何迹象表明服务已经耗尽。我还检查了其他服务的工作方式,其他服务没有故障。如果它来自系统限制,那会让同一台机器上的其他服务失败 redis、galera、elasticsearch。但他们都没有受到影响。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-02
    • 2015-05-14
    • 2020-04-29
    • 2013-04-01
    • 1970-01-01
    • 2019-04-07
    相关资源
    最近更新 更多