最近一段時間,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 改為 * 后繼續觀察!