记一次mysql内存占用过大-不释放问题排查

本文记录了一次MySQL实例内存周期性耗尽的问题排查过程,通过分析bufferpool、内存表占用及session内存消耗,发现cache占用异常并利用numa优化解决了问题。

问题描述:

接线上报警,mysql所在服务器内存剩余不足,这个实例内存问题是周期性爆发的,通过监控看到内存平均2天就被用尽掉256GB。

排查思路:

1、单个实例占用内存256GB,首先想到的是bufferpool,确认配置

show global variables like '%innodb_buffer_pool_size%';

30GB,

SELECT @@innodb_buffer_pool_instances;

innodb_buffer_pool_instances配置的是1

2、查看当前实例内存表占用

SELECT SUM(max_data_length)/1024/1024 AS MEMORY_MB FROM information_schema.tables WHERE ENGINE='memory';
64MB

3、当前实例非系统账号连接为5,所以计算session共占用最大内存为:

SELECT ( ( @@read_buffer_size
+ @@read_rnd_buffer_size
+ @@sort_buffer_size
+ @@join_buffer_size
+ @@binlog_cache_size
+ @@thread_stack
+ @@max_allowed_packet
+ @@net_buffer_length )
) / (1024*1024)*8 AS MEMORY_MB;

315MB

问题总是让我们秃头,通过free -g查看,cache占用非常的大,想起来numa这个东东,接下来抱着试一试的态度执行了以下操作:

1)mysql开启numa interleave访问(mysql_safe中增加一行代码,不知的同学自行搜一下哈)

2)重启实例,问题解决

总结:之前遇到的内存问题,一般都是因为bp配置过高,或者连接数猛增配置不合理导致的。这里顺便推荐一款mysql内存计算器,http://www.mysqlcalculator.com/ 用于查看你的内存配置是否合理

<think>好的,我现在需要帮助用户解决Linux服务器内存占用过高的问题。用户已经明确询问排查方法和性能优化,所以我要整理出清晰的步骤和相关工具的使用。 首先,回顾用户提供的引用内容,引用[1]提到了几个内存查看方法,包括free、vmstat、/proc/meminfo、top和htop。这些工具应该是排查的基础。我需要按顺序列出这些命令,并解释每个命令的作用和如何解读输出。例如,free命令显示总体内存使用情况,而top可以查看各进程的内存占用。 接下来,引用[2]和引用[3]提到Java进程可能导致内存问题,特别是内存泄漏或配置当。这时候需要结合jstack或jmap来分析Java堆栈和内存使用情况。这可能属于进阶排查步骤,需要放在进程分析之后。 然后,用户可能需要区分缓存、缓冲与实际内存占用。Linux的内存管理机制会利用空闲内存作为缓存,这部分内存在需要时会被释放,所以需要解释清楚,避免误解。可以通过/proc/meminfo中的信息来详细分析。 另外,用户可能遇到内存泄漏的情况,这时候需要检查应用程序的代码,是否有未释放内存的情况。特别是对于Java应用,可能需要调整JVM参数,比如-Xmx和-Xms,或者检查垃圾回收情况。 在性能优化部分,除了调整应用配置,还可能涉及系统层面的优化,比如调整swappiness参数,使用内存等。这些需要根据具体情况建议。 生成的问题需要覆盖用户可能进一步询问的方向,比如如何区分缓存和实际占用内存泄漏的排查方法、Java应用的内存优化,以及系统参数的调整。这样用户可以有更深入的了解。 最后,确保回答结构清晰,步骤分明,每个工具的使用都有示例命令,并且解释输出中的关键指标,比如free中的available,top中的RES和VIRT。同时,引用对应的参考文献,比如引用[1]、[2]、[3],自然地标注在相关步骤后面。</think>### Linux服务器内存占用过高排查方法 #### 一、基础排查步骤 1. **查看系统整体内存使用** 使用`free -h`命令快速查看内存总量、已用和空闲内存: ```bash $ free -h total used free shared buff/cache available Mem: 16G 8.1G 2.3G 1.2G 5.6G 6.9G ``` *重点关注`available`字段,表示实际可用内存(包含缓存可回收部分)[^1]* 2. **分析内存分配细节** 通过`cat /proc/meminfo`获取详细内存分配: ```bash $ cat /proc/meminfo MemTotal: 16265892 kB MemFree: 2376148 kB Cached: 4895216 kB SwapCached: 12384 kB ... ``` *`Cached/Buffers`为系统缓存,可通过`sync; echo 3 > /proc/sys/vm/drop_caches`临时清理* 3. **定位高内存进程** 使用`top`命令(按`Shift+M`按内存排序): ```bash $ top PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 638 mysql 20 0 28.6g 5.2g 8288 S 6.2 33.5 98:06.12 mysqld ``` *`RES`列显示物理内存占用,`%MEM`为内存占比[^1]* #### 二、进阶排查方法 4. **进程级内存分析** 使用`pmap -x <PID>`查看进程内存映射: ```bash $ pmap -x 638 Address Kbytes RSS Dirty Mode Mapping 000055f5e1a2d000 5427200 5427200 5427200 rw--- [ anon ] ``` *匿名内存块([anon])过可能提示堆内存问题[^3]* 5. **Java应用专项排查** 对Java进程使用`jcmd`获取内存详情: ```bash $ jcmd <PID> VM.native_memory summary Native Memory Tracking: Total: reserved=5574348KB, committed=3467988KB - Java Heap (reserved=4194304KB, committed=2097152KB) ``` *关注`committed`值是否接近JVM的`-Xmx`设定值[^3]* #### 三、性能优化建议 1. **应用程序优化** - 调整JVM参数:`-XX:+UseG1GC`启用高效垃圾回收器 - 设置合理的`-Xmx`和`-Xms`避免过度分配 - 验证内存泄漏:通过`jmap -histo:live <PID>`观察对象数量增长 2. **系统级优化** ```bash $ sysctl -w vm.swappiness=10 # 降低交换分区使用倾向 $ sysctl -w vm.overcommit_memory=2 # 严格内存分配策略 ``` 3. **特殊场景处理** - 文件服务器:通过`vmtouch`工具检测文件缓存有效性 - 数据库服务器:优化`innodb_buffer_pool_size`等参数
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值