Chinaunix首页 | 论坛 | 博客
  • 博客访问: 281154
  • 博文数量: 48
  • 博客积分: 2010
  • 博客等级: 大尉
  • 技术积分: 890
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-06 18:50
文章分类
文章存档

2009年(9)

2008年(39)

我的朋友

分类: 系统运维

2008-09-17 13:00:50

    最近在项目中遇到一个问题,linux上设置多个cron程序,每个程序都对数据库进行不同的select、update、insert等操作,且每分钟都执行一次,这样造成服务器的突发负荷有时会很高,甚至宕机。

    分析原因:由于crontab最小只能精确到分钟,也就是说默认的每分钟同时对数据库进行操作,而且有可能是同一个表的不同级别的操作,这样就会使数据表lock的机率更大,使其他操作无法完成,造成突发负荷过高,直至高优先级的操作完成而释放所才使得服务器负荷回落。

    基于此,为了解决问题只能另辟蹊径:减少同时执行的程序。每个程序依旧是每分钟执行一次,但是不是每分钟的开始,可以分组为每分钟的10s,20s,30s等等,于是想到了sleep。

原始的crontab设置:
* * * * * cmd1
* * * * * cmd2
* * * * * cmd3
* * * * * cmd4
* * * * * cmd5
* * * * * cmd6
* * * * * cmd7
* * * * * cmd8
* * * * * cmd9
* * * * * cmd10

修改后crontab设置:
* * * * * sleep 10; cmd1
* * * * * sleep 10; cmd2
* * * * * sleep 20; cmd3
* * * * * sleep 20; cmd4
* * * * * sleep 30; cmd5
* * * * * sleep 30; cmd6
* * * * * sleep 40; cmd7
* * * * * sleep 40; cmd8
* * * * * sleep 50; cmd9
* * * * * sleep 50; cmd10


变通一下,如果想没20秒执行一次,直接用crontab是不能实现的,我们这样设置就可以实现了:

* * * * * cmd
* * * * * sleep 20; cmd
* * * * * sleep 40; cmd

当然这样看起来比较麻烦,可以用:while true; do  cmd; sleep 20; done这样的来替代上面的,不过没有用到这个,在这就不测试了,有用到或需要的可以试一试。

^*^
阅读(11132) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~