本文為墨天輪數據庫管理服務團隊第51期技術分享,內容原創,如需轉載請聯系小墨(VX:modb666)并注明來源。
一、問題現象
問題實例mysql進程實際內存使用率過高
二、問題排查
2.1 參數檢查
mysql版本 :8.0.39,慢日志沒有開啟,innodb\_buffer\_pool\_size 12G(機器內存62G,相對配置較低),臨時文件在/tmp目錄下
2.2 檢查內存使用
SELECT @@key_buffer_size,@@innodb_buffer_pool_size ,@@innodb_log_buffer_size ,@@tmp_table_size ,@@read_buffer_size,@@sort_buffer_size,@@join_buffer_size ,@@read_rnd_buffer_size,@@binlog_cache_size,@@thread_stack,(SELECT COUNT(host) FROM information_schema.processlist where command<>'Sleep')\G;
2.3 存儲過程、函數、視圖
-- 存儲過程、函數
SELECT Routine_schema, Routine_type
FROM information_schema.Routines
WHERE Routine_schema not in ('mysql','information_schema','performance_schema','sys')
GROUP BY Routine_schema, Routine_type;
-- 視圖
SELECT TABLE_SCHEMA , COUNT(TABLE_NAME)
FROM information_schema.VIEWS
WHERE TABLE_SCHEMA not in ('mysql','information_schema','performance_schema','sys')
GROUP BY TABLE_SCHEMA ;
-- 觸發器
SELECT TRIGGER_SCHEMA, count(*) FROM information_schema.triggers
WHERE TRIGGER_SCHEMA not in ('mysql','information_schema','performance_schema','sys')
GROUP BY TRIGGER_SCHEMA;
2.4 排查實際占用
1、總內存使用
SELECT
SUM(CAST(replace(current_alloc,'MiB','') as DECIMAL(10, 2)) )
FROM sys.memory_global_by_current_bytes
WHERE current_alloc like '%MiB%';
2、分事件統計內存
SELECT event_name,SUM(CAST(replace(current_alloc,'MiB','') as DECIMAL(10, 2)) )FROM sys.memory_global_by_current_bytesWHERE current_alloc like '%MiB%' GROUP BY event_name ORDER BY SUM(CAST(replace(current_alloc,'MiB','') as DECIMAL(10, 2)) ) DESC ;
mysql> 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;
3、賬號級別統計
sELECT user,event_name,current_number_of_bytes_used/1024/1024 as MB_CURRENTLY_USED
FROM performance_schema.memory_summary_by_account_by_event_name
WHERE host<>"localhost"
ORDER BY current_number_of_bytes_used DESC LIMIT 10;
2.4 操作系統排查
1、top shift+m
2、ps命令 mysql相關進程使用內存情況
ps eo user,pid,vsz,rss $(pgrep -f 'mysqld')
3、pmap 命令
while true; do pmap -d 3020273 | tail -1; sleep 2; done
pmap -X -p 3020273 > /tmp/memmysql.txt
RSS 就是這個process 實際占用的物理內存。 Dirty: 臟頁的字節數(包括共享和私有的)。 Mapping: 占用內存的文件、或[anon](分配的內存)、或[stack](堆棧)。 writeable/private 表示進程所占用的私有地址空間大小,也就是該進程實際使用的內存大小。
(1)首先使用/top/free/ps在系統級確定是否有內存泄露。如有,可以從top輸出確定哪一個process。 (2)pmap工具是能幫助確定process是否有memory leak。確定memory leak的原則: writeable/private (‘pmap –d’輸出)如果在做重復的操作過程中一直保持穩定增長,那么一定有內存泄露。
4、檢查大頁配置
三、解決方案
1)臨時關閉:
echo never >> /sys/kernel/mm/transparent_hugepage/enabled
echo never >> /sys/kernel/mm/transparent_hugepage/defrag
2)永久關閉,下一次重啟后生效:
在 /etc/rc.local 文件中加入如下內容:
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
touch /var/lock/subsys/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
墨天輪從樂知樂享的數據庫技術社區蓄勢出發,全面升級,提供多類型數據庫管理服務。墨天輪數據庫管理服務旨在為用戶構建信賴可托付的數據庫環境,并為數據庫廠商提供中立的生態支持。
服務官網:https://www.modb.pro/service