在用户大量使用分钟级 cron 的大规模多租户环境中,用户设置的许多 cron 将按分钟或按小时运行,从而导致每分钟/每小时开始时出现明显的 CPU 峰值。
我正在寻找一种方法来将用户的 crontab 执行延迟 0-30 秒(随机),以便平衡一分钟内的 CPU 使用率。
我知道您可以让特定的 cron 休眠/延迟,但我想知道是否有办法根据每个用户对整个 crontab 执行此操作。
不能信任用户根据每个作业随机休眠自己的作业,尽管用户可以访问他们的 crontab 并可以删除所述延迟,但会放置一个脚本来检查和恢复延迟功能。当然,这仍然可以通过根据每个作业进行查找和替换来实现,但是根据每个用户的 crontab 来执行会更简洁 - 如果可能的话,在 crontab 的顶部某处?
答案1
这是一个选项:
禁用每个用户的 crontab(使用例如
cron.allow
和cron.deny
)要求用户将脚本定期运行到特定位置(例如
$HOME/cron/minutely
、$HOME/cron/hourly
等)。引入一个系统级脚本,按照指定的时间表运行这些目录中的作业。此脚本可以实现随机启动时间,以防止惊群效应问题。
这解决了您的问题,但牺牲了一些灵活性,因为用户不再能创建具有任意计划的 cron 作业。
您的“运行作业的系统级脚本”可能就像适当配置的 systemd 一样简单定时器单元,它已经通过配置选项支持这种随机化RandomizedDelaySec
。为多租户解决方案设置此功能可能需要一些创造力。