OOM 問題
linux內核有個機制叫OOM killer(Out-Of-Memory killer),當系統需要申請內存卻申請不到時,OOM killer會檢查當前進程中占用內存最大者,將其殺掉,騰出內存保障系統正常運行。
一般而言,一個應用的內存逐漸增加,肯定是不正常的,這個時候可認為該應用存在內存泄漏,當系統內存被占用到一定的時候,將會觸發OOM,此時系統將會找一個最合適的進程殺掉,以釋放內存。
原因:
大query帶來內存上漲,大量連表查詢加載數據到內存中,進行數據篩選,導致內存上漲,觸發linux oom 機制 ,殺掉mysql ,同時表數量較多導致innodb數據字典內存占用多
內部解決思路:
1.先進行數據庫配置升級,海豚庫升級到16c128G配置,略知庫升級到8c32g。
2.持續監測內存,發現內存占用基本60%左右。
3.進行慢sql,連表查詢sql優化。
4.計劃遷移mysql 到polardb。
5.排查linux日志,定位觸發oom的時候mysql 占用內存大小。以及附近sql。
6.設置mysql 禁用oom機制,將mysql評分降為最低,oom時候 只會殺掉評分最高的進程。
7.降低mysql Buffer Pool值,因為阿里云rds 默認此值占用過高(最高65%內存),降低緩存區大小,可以預留一部分內存作為抵抗不可控風險使用。
8.徹底關閉linux oom機制。 sysctl -w vm.panic_on_oom=1
實際執行中遇到的問題:
- 由于阿里云RDS只支持對數據庫的使用,不支持對系統層面的一些配置。所以上述第6條、上述第8條,不可用
- 由于阿里云RDS配置Buffer Pool
需要重啟mysql,項目量級較大,重啟耗時半小時以上,所以上述第7條,不可用,有動態調整緩存區大小方案,但是性能抖動很激烈,花費時間更久,不推薦。 - 由于阿里云RDS不支持查詢linux日志,oom日志暫未獲得,阿里方給了一部分oom附近sql。進行參考優化。
- 由于遷移polardb對現在數據庫性能影響較大,遷移時間不可控,遷移過程中增量數據遷移方案未確定,目前正在調研中。