MySQL内存增长问题分析案例
前言
在现网环境中,偶尔会遇到客户实例内存OOM(Out Of Memory,即内存耗尽或溢出)的情况。MySQL数据库作为一款面向高并发应用场景的系统软件,因其应用场景复杂且函数调用链极长,导致分析内存异常问题变得非常困难。
MySQL提供了Performance Schema功能,用于跟踪其性能指标,包括内存占用情况。但该工具是有一定的局限性,只能监控通过MySQL提供的内存分配接口分配的内存,不能监控直接使用malloc或者new函数分配的内存。这种情况我们就可以借助jeprof工具(jeprof是jemalloc配套的内存分析工具)来定位,以下是借助jeprof定位MySQL内存问题的分析过程。
问题描述
在生产环境中,某客户的实例频繁出现OOM,通过排查客户业务,发现是大事务导致的内存异常增长,该实例的MySQL版本为8.0.22(MySQL 8.0.25以后的版本解决了内存异常增长问题),我们通过如下方式在本地进行复现:
1. 采用sysbench往一张表中压入100000000条数据,如下:
sysbench --mysql-host=xxx --mysql-port=xxx --mysql-user=xxx --mysql-password=xxx \
/usr/share/sysbench/oltp_read_write.lua --tables=1 \
--table_size=100000000 prepare
2. 随后开启一个大事务,比如更新某一列数据,如下: