Cronjob 文件未关闭且 CPU 使用率为 100%

Cronjob 文件未关闭且 CPU 使用率为 100%

我使用 cronjob 每 10 秒运行一次 php 文件。虽然系统运行良好,但昨晚我注意到 php 占用了 100% 的 CPU 并导致系统崩溃。

当我使用 进行检查时ps aux,我发现我的 cron 文件有几十个 cron 文件正在运行。当我检查数据库时,甚至没有发现任何原因。所以我的 php 页面应该返回空并立即完成。

我有几个问题:

1-为什么Cron会出现这种故障?

2-当我为 codigniter 而不是 Cron 进程创建排队系统时,它与 cron 有何不同?

3-当我让 PHP 成为在后台运行的系统时,我是否会遇到此类问题?

提前谢谢

答案1

  1. 为什么会导致Cron出现这种故障?

这不是一个 cron 问题。

Cron 是一个非常简单的调度程序,它只是在您指定的时间/间隔启动新的批次。

无论出于何种原因,当您的批处理作业无法在下一次迭代开始之前及时完成时,您最终会得到两个并发进程。 Cron 不会采取任何措施来阻止这种情况。

这是否会立即导致问题实际上取决于您的假设和代码。

第二次迭代可能会立即产生某种形式的死锁并无限期地停止,10 秒后第三次迭代会因第二次迭代导致的死锁而停止,10 秒后下一次迭代也会立即停止。等等。等等。这会迅速滚雪球般扩大。

或者它可能是一个慢得多的过程,其中对于每个单独的批处理,运行时间缓慢增加,而不是停滞越来越长时间的批处理最终并发运行。这(最终)进一步增加了负载,引发资源争用,并导致批处理作业需要更长时间才能完成,同时/并发批处理更多,资源匮乏。

  1. 当我为 codigniter 等创建排队系统而不是 Cron 进程时,它与 cron 有何不同?

正如您在这里所体验到的,cron 不是一个排队系统。它只是一个非常简单的调度程序。

如果您想添加更复杂的作业控制,则需要创建它。例如,请参阅此答案这里关于如何简单地防止多个 cron 批次在批处理规范中同时运行。

否则,运行比简单的 cron 更高级的程序确实可能是一个解决方案。

  1. 当我让 PHP 成为后台运行的系统时,我是否可以摆脱此类问题?

如果根本原因是当两个批次同时运行时代码就会中断,那么旨在使代码运行更快的措施既无法消除该缺陷,也无法防止这种情况再次发生。

相关内容