我每 10 秒使用 cronjob 运行一个 php 文件。虽然系统运行良好,但我昨晚注意到 php 正在使用 100% 的 CPU 并使系统崩溃。
当我检查时ps aux
,我看到我的 cron 文件有几十个正在处理的 cron 文件。当我检查数据库时,甚至没有理由这样做。所以我的 php 页面应该返回空并立即完成。
我有几个问题:
1-为什么会在 Cron 中导致此故障?
2- 当我为例如 codigniter 而不是 Cron 进程创建排队系统时,它与 cron 有何不同?
3- 当我将 PHP 设置为在后台运行的系统时,我会不会出现这些问题?
谢谢你提前
这不是 cron 问题。
Cron 是一个非常简单的调度程序,它只是在您指定的时间/间隔启动一个新批处理。
无论出于何种原因,当您的批处理作业无法在下一次迭代开始之前及时完成时,您将以两个并发进程结束。Cron 没有采取任何措施来防止这种情况发生。
这实际上取决于您的假设和代码是否会立即引起问题。
可能是第二次迭代立即产生某种形式的死锁并无限期停顿,10 秒后第三次迭代因第二次迭代引起的死锁而停顿,10 秒后下一次迭代也立即停顿。等等等等 那可以很快滚雪球。
或者它可能是一个慢得多的过程,对于每个单独的批次,运行时间缓慢增加,而不是停止越来越多的运行批次最终同时运行。这(最终)会进一步增加负载,开始资源争用并导致批处理作业需要更长的时间才能完成,同时/并发批处理和资源匮乏。
正如您在这里所经历的,cron 不是排队系统。它只是一个非常简单的调度程序。
如果您想添加更复杂的作业控制,您需要创建它。例如,请参阅此处的答案,了解如何简单地防止多个 cron 批处理在您的批处理规范中同时运行。
否则,确实运行比简单 cron 更高级的东西可能是一个解决方案。
如果根本原因是您的代码在两个批次同时运行时会中断,那么旨在使您的代码运行得更快的措施既不会消除该缺陷,也不会阻止该缺陷再次发生。