MySQL內(nèi)存使用率高問題排查過程以及解決方案
一、問題現(xiàn)象
- 內(nèi)存占用異常:通過
top
命令發(fā)現(xiàn)MySQL進(jìn)程(mysqld
)占用了90.7%的物理內(nèi)存(56.5G/62G)。 - 系統(tǒng)負(fù)載:CPU使用率較低(1.3%),但內(nèi)存幾乎耗盡。
二、核心排查步驟
1. 參數(shù)檢查
- MySQL版本:8.0.39(未開啟慢查詢?nèi)罩荆?/li>
- 關(guān)鍵內(nèi)存參數(shù):
SHOW VARIABLES LIKE 'innodb_buffer_pool_size'; -- 12G(配置較低,建議調(diào)整為總內(nèi)存的70%~80%) SHOW VARIABLES LIKE 'tmp_table_size'; -- 16M(臨時(shí)表內(nèi)存限制過小)
- 臨時(shí)文件路徑:
/tmp
(建議改為專用目錄以避免性能問題)。
2. 內(nèi)存使用分析
全局內(nèi)存統(tǒng)計(jì):
SELECT SUM(CAST(replace(current_alloc,'MiB','') AS DECIMAL(10,2))) FROM sys.memory_global_by_current_bytes WHERE current_alloc LIKE '%MiB%';
結(jié)果:總內(nèi)存使用約1933.69MB。
分事件內(nèi)存占用:
SELECT event_name, sys.format_bytes(CURRENT_NUMBER_OF_BYTES_USED) FROM performance_schema.memory_summary_global_by_event_name ORDER BY CURRENT_NUMBER_OF_BYTES_USED DESC LIMIT 10;
關(guān)鍵發(fā)現(xiàn):
memory/innodb/buf_buf_pool
占用13.29GB(InnoDB緩沖池)。memory/group_rpl/Gcs_xcom::xcom_cache
占用1024MB(復(fù)制相關(guān)緩存)。
用戶級(jí)內(nèi)存統(tǒng)計(jì):
SELECT user, event_name, current_number_of_bytes_used/1024/1024 AS MB_USED FROM performance_schema.memory_summary_by_account_by_event_name WHERE host <> "localhost" ORDER BY MB_USED DESC LIMIT 10;
發(fā)現(xiàn):特定用戶(如
zqzh
)在memory/temptable/physical_ram
中占用65MB。
3. 存儲(chǔ)過程/函數(shù)/視圖檢查
存儲(chǔ)過程與函數(shù):
SELECT Routine_schema, Routine_type FROM information_schema.Routines WHERE Routine_schema NOT IN ('mysql','information_schema','performance_schema','sys');
結(jié)果:多個(gè)業(yè)務(wù)庫存在大量存儲(chǔ)過程和函數(shù)(如
bpc
、bsc
等)。視圖與觸發(fā)器:
SELECT TABLE_SCHEMA, COUNT(TABLE_NAME) FROM information_schema.VIEWS; SELECT TRIGGER_SCHEMA, COUNT(*) FROM information_schema.triggers;
結(jié)果:視圖和觸發(fā)器數(shù)量較少,非主要內(nèi)存消耗源。
4. 操作系統(tǒng)級(jí)檢查
進(jìn)程內(nèi)存占用:
ps -eo user,pid,vsz,rss | grep mysqld
結(jié)果:
mysqld
進(jìn)程虛擬內(nèi)存(VIRT)96.2G,物理內(nèi)存(RES)56.5G。內(nèi)存映射分析:
pmap -d <mysql_pid> | tail -1
關(guān)鍵指標(biāo):
writeable/private
:進(jìn)程實(shí)際占用的私有內(nèi)存(持續(xù)增長可能提示內(nèi)存泄漏)。
透明大頁(THP)檢查:
cat /sys/kernel/mm/transparent_hugepage/enabled
結(jié)果:THP處于開啟狀態(tài)(可能導(dǎo)致內(nèi)存分配效率低下)。
三、解決方案
1. 調(diào)整MySQL配置
- 增加InnoDB緩沖池:
innodb_buffer_pool_size = 48G -- 根據(jù)總內(nèi)存(62G)調(diào)整為77%
- 優(yōu)化臨時(shí)表內(nèi)存:
tmp_table_size = 256M max_heap_table_size = 256M
2. 關(guān)閉透明大頁(THP)
- 臨時(shí)關(guān)閉:
echo never > /sys/kernel/mm/transparent_hugepage/enabled echo never > /sys/kernel/mm/transparent_hugepage/defrag
- 永久關(guān)閉:
在/etc/rc.local
中添加:if test -f /sys/kernel/mm/transparent_hugepage/enabled; then echo never > /sys/kernel/mm/transparent_hugepage/enabled fi if test -f /sys/kernel/mm/transparent_hugepage/defrag; then echo never > /sys/kernel/mm/transparent_hugepage/defrag fi
3. 優(yōu)化查詢與存儲(chǔ)過程
- 分析慢查詢:開啟慢查詢?nèi)罩荆ㄎ坏托QL。
- 減少存儲(chǔ)過程依賴:將復(fù)雜邏輯移至應(yīng)用層,避免存儲(chǔ)過程內(nèi)存泄漏。
4. 硬件與環(huán)境優(yōu)化
- 增加物理內(nèi)存:若業(yè)務(wù)需求增長,考慮升級(jí)服務(wù)器內(nèi)存。
- 遷移臨時(shí)文件目錄:將
tmpdir
設(shè)置為專用高速存儲(chǔ)路徑。
四、總結(jié)
- 核心問題:MySQL內(nèi)存使用率高主要由InnoDB緩沖池配置不足、THP機(jī)制效率低下及存儲(chǔ)過程/函數(shù)內(nèi)存占用引起。
- 解決重點(diǎn):調(diào)整緩沖池大小、關(guān)閉THP、優(yōu)化查詢邏輯。
- 后續(xù)監(jiān)控:通過
sys.memory_global_by_current_bytes
和pmap
持續(xù)觀察內(nèi)存變化。
通過以上步驟,可顯著降低MySQL內(nèi)存占用并提升穩(wěn)定性。
附:為了解決高內(nèi)存占用問題,可以采取以下措施
- 仔細(xì)審查并調(diào)整MySQL的其他內(nèi)存相關(guān)配置項(xiàng),確保它們合理且與系統(tǒng)資源匹配。
- 監(jiān)控并分析MySQL的實(shí)際內(nèi)存使用情況,使用如SHOW ENGINE INNODB STATUS;和performance_schema來獲取更詳細(xì)的內(nèi)存使用報(bào)告。
- 考慮調(diào)整操作系統(tǒng)的內(nèi)存管理策略,比如調(diào)整THP設(shè)置或使用/proc/sys/vm/swappiness來調(diào)整內(nèi)存交換行為。
- 如果確定內(nèi)存分配合理,且應(yīng)用確實(shí)需要這么多內(nèi)存來保證性能,那么可能需要接受較高的內(nèi)存占用率作為正?,F(xiàn)象,或考慮增加服務(wù)器物理內(nèi)存。
到此這篇關(guān)于MySQL內(nèi)存使用率高問題排查過程以及解決方案的文章就介紹到這了,更多相關(guān)MySQL內(nèi)存使用率高問題內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL explain獲取查詢指令信息原理及實(shí)例
這篇文章主要介紹了MySQL explain獲取查詢指令信息原理及實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05mysql分表分庫的應(yīng)用場景和設(shè)計(jì)方式
為大家講述一下在mysql在什么到時(shí)候需要進(jìn)行分表分庫,以及現(xiàn)實(shí)的設(shè)計(jì)方式。2017-11-11MySQL如何實(shí)現(xiàn)快速插入大量測試數(shù)據(jù)
這篇文章主要介紹了MySQL如何實(shí)現(xiàn)快速插入大量測試數(shù)據(jù)問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11MySQL開發(fā)規(guī)范與使用技巧總結(jié)
今天小編就為大家分享一篇關(guān)于MySQL開發(fā)規(guī)范與使用技巧總結(jié),小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-03-03Linux下MySql 1036 錯(cuò)誤碼解決(1036: Table ''xxxx'' is read only)
我們在進(jìn)行數(shù)據(jù)庫搬家的時(shí)候,經(jīng)常會(huì)遇到(1036: Table 'xxxx' is read only)的問題,字面意思很明確,就是數(shù)據(jù)庫只有讀權(quán)限,無寫權(quán)限,那么我們來分享下我的處理辦法2014-07-07SQL?Server攜程核心系統(tǒng)無感遷移到MySQL實(shí)戰(zhàn)
這篇文章主要介紹了SQL?Server攜程核心系統(tǒng)無感遷移到MySQL實(shí)戰(zhàn),文章通過基于數(shù)據(jù)庫部署架構(gòu)鏡像構(gòu)建了訂單緩存統(tǒng)一管理熱點(diǎn)數(shù)據(jù),解決各端差異,具體詳情需要的小伙伴可以參考下面文章詳細(xì)內(nèi)容2022-05-05