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