最近在项目中遇到一个问题,linux上设置多个cron程序,每个程序都对数据库进行不同的select、update、insert等操作,且每分钟都执行一次,这样造成服务器的突发负荷有时会很高,甚至宕机。
分析原因:由于crontab最小只能精确到分钟,也就是说默认的每分钟同时对数据库进行操作,而且有可能是同一个表的不同级别的操作,这样就会使数据表 lock的机率更大,使其他操作无法完成,造成突发负荷过高,直至高优先级的操作完成而释放所才使得服务器负荷回落。
基于此,为了解决问题只能另辟蹊径:减少同时执行的程序。每个程序依旧是每分钟执行一次,但是不是每分钟的开始,可以分组为每分钟的10s20s30s等等,于是想到了sleep。
变通一下,如果想没20秒执行一次,直接用crontab是不能实现的,我们这样设置就可以实现了:
当然这样看起来比较麻烦,可以用:while true; do cmd; sleep 20; done这样的来替代上面的,不过没有用到这个,在这就不测试了,有用到或需要的可以试一试。