Cronjob 文件未關閉和 100% CPU 使用率
我每 10 秒使用 cronjob 執行一個 php 文件。雖然系統執行良好,但我昨晚注意到 php 正在使用 100% 的 CPU 並使系統崩潰。
當我檢查時
ps aux
,我看到我的 cron 文件有幾十個正在處理的 cron 文件。當我檢查數據庫時,甚至沒有理由這樣做。所以我的 php 頁面應該返回空並立即完成。我有幾個問題:
1-為什麼會在 Cron 中導致此故障?
2- 當我為例如 codigniter 而不是 Cron 程序創建排隊系統時,它與 cron 有何不同?
3- 當我將 PHP 設置為在後台執行的系統時,我會不會出現這些問題?
謝謝你提前
- 為什麼會導致 Cron 出現這種故障?
這不是 cron 問題。
Cron 是一個非常簡單的調度程序,它只是在您指定的時間/間隔啟動一個新批處理。
無論出於何種原因,當您的批處理作業無法在下一次迭代開始之前及時完成時,您將以兩個並發程序結束。Cron 沒有採取任何措施來防止這種情況發生。
這實際上取決於您的假設和程式碼是否會立即引起問題。
可能是第二次迭代立即產生某種形式的死鎖並無限期停頓,10 秒後第三次迭代因第二次迭代引起的死鎖而停頓,10 秒後下一次迭代也立即停頓。等等等等 那可以很快滾雪球。
或者它可能是一個慢得多的過程,對於每個單獨的批次,執行時間緩慢增加,而不是停止越來越多的執行批次最終同時執行。這(最終)會進一步增加負載,開始資源爭用並導致批處理作業需要更長的時間才能完成,同時/並發批處理和資源匱乏。
- 當我為例如 codigniter 而不是 Cron 程序創建排隊系統時,它與 cron 有何不同?
正如您在這裡所經歷的,cron 不是排隊系統。它只是一個非常簡單的調度程序。
如果您想添加更複雜的作業控制,您需要創建它。例如,請參閱此處的答案,了解如何簡單地防止多個 cron 批處理在您的批處理規範中同時執行。
否則,確實執行比簡單 cron 更高級的東西可能是一個解決方案。
- 當我讓 PHP 成為一個在後台執行的系統時,我會不會出現這些問題?
如果根本原因是您的程式碼在兩個批次同時執行時會中斷,那麼旨在使您的程式碼執行得更快的措施既不會消除該缺陷,也不會阻止該缺陷再次發生。