【問題】
有一台MySQL5.6.21的服務器發生OOM,分析下來與多種因素有關
【分析過程】
1、服務器物理內存相對熱點數據文件偏小,62G物理內存+8G的SWAP,數據文件大小約550G
觸發OOM是binlog備份的cp進程
2、mysqld實際使用物理內存遠大於innodb_buffer_pool_size設置,與我們之前分析的內存分配管理模塊有關,建議更換為jemalloc
可以參考我之前的文章,MySQL5.7.18(ptmalloc VS tcmalloc VS jemalloc)性能測試
<1>這個MySQL實例配置了45G的buffer pool,發生OOM時,mysqld進程實際使用到約61G
<2>另一台相同配置的服務器,配了32G的buffer pool,MySQL物理內存用到了57G,SWAP已使用5G
3、NUMA節點內存分配不均導致了SWAP空間大量使用,下圖是這台服務器mysqld進程在各NUMA節點的內存使用情況,建議開啟numa interleave訪問
【優化方案】
1、 升級內存更大的服務器
2、 建議更換mysqld進程的內存分配管理模塊為jemalloc
3、 建議開啟mysql進程的numa interleave訪問
開啟numa interleave的步驟,可以參考文章