最近一段時間,OSChina 網站在早上 8 點出頭的時候很容易由於數據庫鏈接池爆滿而致使網站宕機。表現的狀況是數據庫處理大量的查詢,堆積大量併發鏈接,致使沒法再鏈接到數據庫,執行一個簡單的查詢速度也很是慢,數據庫機器的 CPU 很高。java
但事實上早上 8 點並不是 OSC 網站的高峯期,高峯期的時候都不會掛,爲何恰恰在這麼一個沒多少人訪問的時間點宕機呢?mysql
找了好久沒發現系統在 8 點這個時間點有什麼特殊的任務要作,對數據庫也作了一些調整,包括 「MySQL Can’t Create Thread: Errno 11 」 的問題。sql
可是問題依舊。數據庫
再次挨個檢查系統 crontab 中定義的做業。其中自動構建 Lucene 索引的做業引發了注意。併發
*/5 8-22 * * * /data/oschina/build.sh lucene_build性能
系統每 5 分鐘執行一次增量索引構建,該構建過程僅在一天早上8點到晚上10點鐘進行。網站
我記得當初這麼設置的緣由是有一個索引的構建容易出問題,爲了不出問題時沒人處理,所以設置了這個時間段,後來一直沒去調整。ui
再查看系統跑 lucene 的進程,我靠,那麼那麼那麼多。。。。。索引
趕忙一個 killall java 殺掉全部的 lucene 索引構建進程,沒幾秒鐘數據庫的鏈接就下來了,系統恢復正常訪問。進程
因此我如今有 80% 的把握能肯定宕機問題就是由於這個索引構建進程致使的。並且索引構建自己不存在問題,問題出在時間點的設定上。試想白天高峯期時候 5 分鐘執行一次歷來沒出過任何問題。也就是說通過了一個晚上(從晚上10點到早上8點這段時間)系統又有不少的數據,致使8點鐘啓動增量索引構建時一次性任務量很大,沒法在下一個5分鐘到來以前結束,因而不斷啓動新的進程,因而不斷鏈接到數據庫,因而數據庫性能急劇降低,因而掛機。
好吧,It's my fault!
將 8-22 改成 * 後繼續觀察!