MySQL数据库服务器内存占用超85%,仅1-2个查询连接如何排查?
MySQL内存占用异常排查方案(仅1-2个SELECT连接但内存使用率超85%)
先梳理下你提供的系统资源数据:
内存使用详情
[root@server1 ~]# free -m total used free shared buffers cached Mem: 80587 71466 9120 0 273 816 -/+ buffers/cache: 70376 10210 Swap: 5119 3873 1246
Top进程摘要
251 total, 1 running, 250 sleeping, 0 stopped, 0 zombie Cpu(s): 14.1%us, 2.2%sy, 0.0%ni, 83.7%id, 0.1%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 82521148k total, 73200520k used, 9320628k free, 280...
核心问题分析
从数据能抓出几个关键线索:
- 物理内存共80G左右,
-/+ buffers/cache后的已用内存高达70G——这说明内存被应用层(也就是MySQL)直接占用,而非系统缓存/buffers消耗。 - 仅1-2个活跃SELECT连接却占满内存,同时CPU空闲率达83.7%——排除CPU瓶颈,问题集中在MySQL内存配置或内部异常分配。
- Swap已使用3.8G,系统开始依赖交换分区,会进一步拖慢MySQL性能,得优先处理。
排查&解决步骤
- 检查MySQL核心内存配置参数
登录MySQL执行以下命令,重点核对这些参数:
SHOW VARIABLES LIKE '%innodb_buffer_pool_size%'; SHOW VARIABLES LIKE '%join_buffer_size%'; SHOW VARIABLES LIKE '%sort_buffer_size%'; SHOW VARIABLES LIKE '%read_buffer_size%'; SHOW VARIABLES LIKE '%read_rnd_buffer_size%';
innodb_buffer_pool_size是InnoDB最核心的内存参数,通常建议设为物理内存的50%-70%(80G内存的话约40-56G),如果设置接近80G,哪怕少量连接也会占满内存。- 其余
*_buffer_size是会话级参数,每个连接都会分配,若设置过大(比如单参数设10G),1-2个连接也会消耗大量内存。
- 查看MySQL实际内存使用细节
执行命令深入了解内存分配情况:
SHOW GLOBAL STATUS LIKE 'Mem%'; SHOW ENGINE INNODB STATUS; -- 重点关注「BUFFER POOL AND MEMORY」模块
从InnoDB状态里可以确认缓冲池是否真的被占满,有没有内存碎片或异常分配的情况。
- 确认是否存在隐藏闲置连接
有时候表面只有1-2个活跃SELECT连接,但大量sleep状态的闲置连接也会占用会话级内存:
SHOW PROCESSLIST;
统计不同状态的连接数,若sleep连接过多,可调整wait_timeout和interactive_timeout参数,让闲置连接自动断开。
- 排除系统层面其他内存占用
虽然top显示内存主要被MySQL占用,但还是用top -o %MEM或ps aux --sort=-%mem排查下,确认没有其他进程偷偷消耗内存。
临时缓解措施
如果内存占用已经影响业务,可先做临时调整:
- 把
innodb_buffer_pool_size调至合理值后重启MySQL(注意选业务低峰期操作,会中断服务)。 - 临时降低会话级buffer参数,比如
SET GLOBAL join_buffer_size = 134217728;(128M),新连接会立即生效,无需重启。
内容的提问来源于stack exchange,提问作者Dheeraj Nambiar
相关产品推荐
相关产品推荐

