You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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...

核心问题分析

从数据能抓出几个关键线索:

  1. 物理内存共80G左右,-/+ buffers/cache后的已用内存高达70G——这说明内存被应用层(也就是MySQL)直接占用,而非系统缓存/buffers消耗。
  2. 仅1-2个活跃SELECT连接却占满内存,同时CPU空闲率达83.7%——排除CPU瓶颈,问题集中在MySQL内存配置或内部异常分配。
  3. Swap已使用3.8G,系统开始依赖交换分区,会进一步拖慢MySQL性能,得优先处理。

排查&解决步骤

  1. 检查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个连接也会消耗大量内存。
  1. 查看MySQL实际内存使用细节
    执行命令深入了解内存分配情况:
SHOW GLOBAL STATUS LIKE 'Mem%';
SHOW ENGINE INNODB STATUS; -- 重点关注「BUFFER POOL AND MEMORY」模块

从InnoDB状态里可以确认缓冲池是否真的被占满,有没有内存碎片或异常分配的情况。

  1. 确认是否存在隐藏闲置连接
    有时候表面只有1-2个活跃SELECT连接,但大量sleep状态的闲置连接也会占用会话级内存:
SHOW PROCESSLIST;

统计不同状态的连接数,若sleep连接过多,可调整wait_timeout和interactive_timeout参数,让闲置连接自动断开。

  1. 排除系统层面其他内存占用
    虽然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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:39:48