【OS】自建MYSQL服務器OOM分析思路
【背景描述】
從自建MySql數據庫發生OOM的案例分析出多種因素,但大部分OOM都可以從日志和內存報錯相關方向來著手尋找原因,再根據線索來梳理優化思路。
【環境說明】
數據庫:MYSQL5.7
系統版本:CentOS 7
【分析過程】:
一:查看日志和資源使用量(默認日志在/var/log/messages)
1.服務器物理內存相對熱點數據文件可能偏小
從日志(見上圖)看觸發OOM是binlog備份的cp進程。
2.查看實例物理內存使用量對比
(1)實例1(見下圖)配置了45G的buffer pool,發生OOM時,mysqld進程實際使用到約60G左右。
(2)實例2(見下圖)配了32G的buffer pool,物理內存用到了57G,SWAP使用5G左右。
結論:實際使用物理內存遠大于innodb_buffer_pool_size設置。
3.列舉系統上的NUMA節點信息:
Numastat –c qemu-kvm
總結: NUMA節點(見上圖)內存分配不均導致了SWAP空間大量使用,上圖是這臺服務器mysqld進程在各NUMA節點的內存使用情況。
建議:1.在運行mysql服務的服務器上一般只會部署mysql一種服務在運行,而不會部署若干應用運行。mysql是獨占整個服務器的資源,所以不建議開啟numa內存特性。因為這種特性很容易引起內存泄漏的情況,即發現物理內存還有剩余,但是系統已經開始使用swap內存。
2.如果numa內存分配不均,會導致SWAP的大量占用,有可能會導致服務器發生OOM,也可以開啟numa interleave訪問。
二:開啟和關閉NUMA
1.開啟numa interleave步驟
(1)安裝numactl工具:
yum install numactl -y
(2)修改/usr/bin/mysqld_safe文件:
cmd="`mysqld_ld_preload_text`$NOHUP_NICENESS"下新增一條腳本
cmd="/usr/bin/numactl --interleave all $cmd"
(3)停止服務:
service mysql stop
(4)寫入硬盤,防止數據丟失:
sync;sync;sync
(5)延遲10秒:
sleep 10
(6)清理pagecache、dentries和inodes:
Sysctl -q -w vm.drop_caches=3
(7)開啟服務:
service mysql start
(8)驗證numactl?–interleave all是否生效:
可以通過下面命令,interleave_hit是采用interleave策略從該節點分配的次數,?沒有啟動interleave策略的服務器,這個值會很低。
numastat -mn -p `pid of mysqld`
或者可參考:https://blog.csdn.net/weixin_36296325/article/details/114321385
2.關閉NUMA的步驟
(1)BIOS層面:
BIOS:interleave = Disable / Enable
由于不同系統之間各種BIOS類型的區別可能設置各有不同。
(2)操作系統層面:
可以直接在/etc/grub.conf的kernel行最后添加numa=off。
(3)MySQL層面:
直接修改啟動腳本:
numactl --interleave=all mysqld --defaults-file=/etc/my.cnf &
(4)設置innodb_numa_interleave參數:
MySQL5.7.9版本+,新增了參數innodb_numa_interleave。根據官方文檔的描述:當設置innodb_numa_interleave=1的時候,對于mysqld進程的numa內存分配策略設置為MPOL_INTERLEAVE,而一旦Innodb buffer pool分配完畢,則策略重新設置回MPOL_DEFAULT。當然這個參數是否生效,必須建立在mysql是在支持numa特性的linux系統上編譯的基礎上。
在MySQL5.7.17版本+, CMake編譯軟件新增了WITH_NUMA參數,可以在支持numa特性的linux系統上編譯mysql。
(5)?查看關閉情況
MySQL 5.6.27/5.7.9開始引用innodb_numa_interleave選項??赡芨鶕煌到y和版本方法略有不同,本文旨在提供思路。
MySQL
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。