【環境介紹】
系統環境:CentOS Linux 7 (Core) + 5.7.26 MySQL Community Server - GPL
【情況描述】
業務側反應使用應用跟查詢數據庫很慢,需要查看是什么原因
【情況分析】
第一次簡單分析
使用top查看數據庫資源情況:查看數據庫kswapd0占用很高的CPU,根據進程名字懷疑主機由於swap導致,調整/proc/sys/vm/swappiness后,重啟數據庫恢復正常;
第二次分析
沒過幾天又反饋同樣的問題,使用緩慢,仍然查看到kswapd0占用CPU高;
查看swap情況:使用vmstat -s | grep -i page命令觀察到並沒有使用到swap
同時查看到磁盤的io:觀察到性能達到瓶頸,且該磁盤是操作系統盤
同時觀察到主機的錯誤日志:查看到MySQL數據庫的內存OOM
查看數據庫內存使用情況:初步懷疑是申請內存空間導致緩慢,於是調整數據庫內存,同時觀察到數據庫層面開啟了query cache,調整內存同時關閉query cache,同時建議主機測增加內存,重啟數據庫后恢復正常
由於數據庫沒有開啟performance參數,無法使用SELECT * FROM sys.memory_global_total查看內存,使用參數方式大概查看內存占用,數據庫占用5.1G內存
查看數據庫日志:
page_cleaner: 1000ms intended loop took **ms. The settings might not be optimal.((flushed="**" , during the time.)
這個警告一般是IO能力不足,或者參數不夠優化的結果,從top,iostat查看的磁盤壓力一致
第三次分析
過了大概幾天,應用側又反饋數據庫使用緩慢:
查看數據庫資源,仍然是看到kswapd0占用高的CPU,同時主機磁盤的IO性能跟第二次的一致,查看主機錯誤日志,這次沒有發現MySQL數據庫OOM的情況;
查看數據庫的占用內存情況,占用了主機的80%,按照這個比例數據庫使用不應該這么緩慢,於是查看涉及數據庫的配置文件
查看到/etc/sysctl.conf文件中的vm.min_free_kbytes=1048576參數配置是沒有在方案中的,於是查看這個參數說明,調整為默認值,使用sysctl -p 生效
這時候主機馬上運行正常,最終定位為vm.min_free_kbytes=1048576參數導致主機kswapd0占用CPU高
查看該參數記錄
查看操作系統日志沒有發現記錄
查看history查看到記錄信息,咨詢主機側是他們進行了修改
查看官方文檔參數解釋:
Sysctl vm.min_free_kbytes為內核內存分配保留的內存量。 默認情況下,此值為〜67MB
查看Oracle數據庫官方建議:
【總結】
1,建議初始化時候關閉query cache;
2,根據實際情況調整主機參數;