为了进行负载测试,我通过 bash 脚本将单分钟 cron 设置为 crontab。脚本执行没有问题,并且 cron 已添加,我可以通过 /var/log/cron 监控 cron 的执行情况。
但问题是,前几天我把脚本设置为 106 个 cron 时,它添加了这些 cron,并且执行得很好。但今天我从头开始重置了 crontab,我只能设置 85 个 cron。然后它开始说
crond[31243]:(root)INFO(计划于 08:32 执行的每分钟作业的执行延迟到随后的 08:33 分钟。跳过作业运行。)
最终所有 cron 都将开始被跳过,并且不会执行任何任务。但我最初的结论是 106 是此服务器上可以设置的最大值。但今天它被降到了 85。服务器配置没有改变;环境与 106 时相同
这是因为 cron 设置得太频繁还是其他原因。我对 cron 及其工作原理还不熟悉。请帮忙
答案1
听起来你正在用 crontab 设置一个 cron 计划,其中包含许多具有相同计划的条目,期望 cron 能为你并行执行这些条目。
* * * * * /path/to/task1
* * * * * /path/to/task2
* * * * * /path/to/task3
...
那不是确切地会发生什么:
在大多数 cron 实现中我知道任务将按顺序启动,而不是并行启动,按照 crontab 文件中列出的任务顺序。Cron 将依次启动它们...
Cron 无需等待 task1 完成后再启动 task2,但只会在 task1 和 task2 启动后才启动 task3 等。一旦启动,任务将并行运行(只要任务需要完成。)
需要启动的任务和当时系统上的负载将限制 cron 启动新任务的速度。当 cron 无法在分配的时间间隔内启动所有任务并且计划的下一个迭代(新的一分钟)开始时,它将放弃无法启动的任务。这将导致错误:
计划于 08:32 执行的每分钟作业延迟到随后的 08:33 分钟。跳过作业运行。
听起来您想并行启动许多相同的任务:
* * * * * /path/to/task
* * * * * /path/to/task
* * * * * /path/to/task
...
只需使用parallel
辅助程序来为你服务;
* * * * * parallel -j 50 /path/to/task
请注意,如果您的并行任务未在一分钟内完成,则下一分钟将启动 50 次额外任务运行,而这些任务加上仍在运行的任务的额外负载,也将运行超过 1 分钟。一段时间后,您的系统可能会耗尽资源并完全无响应。