告别内存OOM,解决MySQL内存增长问题

💡 原文中文,约4300字,阅读约需11分钟。
📝

内容提要

本文分析了MySQL内存增长问题,介绍了使用jeprof工具定位内存问题的过程。通过performance_schema和jeprof的使用,发现内存异常增长是由于vector的错误使用导致的。文章提醒注意编译jemalloc时的参数配置,指出jeprof无法捕获buffer pool的内存分配。华为云数据库对该问题进行了修复。

🎯

关键要点

  • MySQL内存增长问题分析,使用jeprof工具定位内存问题。

  • Performance Schema只能监控通过MySQL内存分配接口分配的内存,无法监控malloc或new分配的内存。

  • 某客户实例频繁出现OOM,原因是大事务导致内存异常增长。

  • 通过sysbench模拟大事务,发现内存使用异常增长。

  • 使用jeprof工具进行内存采样,需将ptmalloc替换为jemalloc。

  • jeprof捕获malloc和free函数调用,分析内存变化。

  • write_set使用vector导致内存异常增长,建议使用list替代。

  • 编译jemalloc时需注意参数配置,避免影响mysqld性能。

  • jeprof无法捕获buffer pool的内存分配,因其直接通过mmap分配内存。

  • 华为云数据库已对该问题进行了修复,开源MySQL在高版本中也进行了修复。

延伸问答

MySQL内存增长的主要原因是什么?

MySQL内存增长主要是由于大事务导致的内存异常增长,特别是使用vector时的错误使用。

如何使用jeprof工具定位MySQL的内存问题?

使用jeprof工具需要将ptmalloc替换为jemalloc,并配置相关参数,然后通过jeprof进行内存采样。

Performance Schema在监控MySQL内存时有哪些局限性?

Performance Schema只能监控通过MySQL内存分配接口分配的内存,无法监控直接使用malloc或new分配的内存。

在编译jemalloc时需要注意哪些参数?

编译jemalloc时需确保加上--enable-prof选项,并注意MALLOC_CONF参数的设置,避免影响mysqld性能。

为什么建议在大事务场景中使用list而不是vector?

因为vector在大量push_back时会导致内存过多占用和性能问题,而list在这种场景下更优。

华为云数据库如何解决MySQL内存增长问题?

华为云数据库对该问题进行了修复,确保在产品中避免内存异常增长的情况。

➡️

继续阅读