似乎找到 OSChina 早上 8 点钟容易宕机的原因

原创
2016/08/25 08:34
阅读数 2.9W

最近一段时间,OSChina 网站在早上 8 点出头的时候很容易因为数据库连接池爆满而导致网站宕机。表现的情况是数据库处理大量的查询,堆积大量并发连接,导致无法再连接到数据库,执行一个简单的查询速度也非常慢,数据库机器的 CPU 很高。

但事实上早上 8 点并非 OSC 网站的高峰期,高峰期的时候都不会挂,为什么偏偏在这么一个没多少人访问的时间点宕机呢?

找了很久没发现系统在 8 点这个时间点有什么特殊的任务要做,对数据库也做了一些调整,包括 “MySQL Can’t Create Thread: Errno 11 ” 的问题。

但是问题依旧。

再次挨个检查系统 crontab 中定义的作业。其中自动构建 Lucene 索引的作业引起了注意。

*/5 8-22 * * * /data/oschina/build.sh lucene_build

系统每 5 分钟执行一次增量索引构建,该构建过程仅在一天早上8点到晚上10点钟进行。

我记得当初这么设置的原因是有一个索引的构建容易出问题,为了避免出问题时没人处理,因此设置了这个时间段,后来一直没去调整。

再查看系统跑 lucene 的进程,我靠,那么那么那么多。。。。。

赶紧一个 killall java 杀掉所有的 lucene 索引构建进程,没几秒钟数据库的连接就下来了,系统恢复正常访问。

所以我现在有 80% 的把握能确定宕机问题就是因为这个索引构建进程导致的。而且索引构建本身不存在问题,问题出在时间点的设定上。试想白天高峰期时候 5 分钟执行一次从来没出过任何问题。也就是说经过了一个晚上(从晚上10点到早上8点这段时间)系统又有很多的数据,导致8点钟启动增量索引构建时一次性任务量很大,无法在下一个5分钟到来之前结束,于是不断启动新的进程,于是不断连接到数据库,于是数据库性能急剧下降,于是挂机。

好吧,It's my fault!

将 8-22 改为 * 后继续观察!

展开阅读全文
打赏
36
60 收藏
分享
加载中
跑增量索引那个线程可以设置为禁止并发执行的吧。
2018/12/29 16:43
回复
举报
构建之前检测上次是否结束? @红薯 用什么方案?
2017/05/24 09:26
回复
举报
3Zz
换sorl or es吧
2017/04/27 18:20
回复
举报
😛
2017/01/03 17:23
回复
举报
其实我没明白,索引构建是什么玩意,在我的印象中,数据库难道不是每次增删改的时候更新索引么?还有一个就是,根据你说的意思,这个定时任务对及时性没有要求,这种定时任务竟然五分钟执行一次,在我的概念里这种任务一个小时执行一次频率都太高了,可能你们有你们的原因吧,不过我还是有点不理解@红薯
2016/12/17 21:30
回复
举报

引用来自“英强”的评论

赞,应该就是这个问题了!
test
2016/09/27 11:37
回复
举报
早上上班高峰期,没事就打开osc刷一刷,流量骤增
2016/09/19 23:32
回复
举报
79 不错,解决了一个大问题
2016/09/08 22:37
回复
举报
数据库链接高,首先要排查是谁在连库,执行什么数据库操作么?
2016/09/06 08:06
回复
举报
构建逻辑有问题,下一次构建开始时应该先判断上次是否结束,一旦5分钟内产生大量数据,就把数据库玩死了,数据库也应该做连接个数限制
2016/09/04 00:04
回复
举报
更多评论
打赏
106 评论
60 收藏
36
分享
返回顶部
顶部