深度剖析MySQL Performance Schema内存管理:源码分析与改进思路
MySQL Performance Schema(PFS)是MySQL提供的强大的性能监控诊断工具,它能够在运行时检查server内部执行情况。PFS通过监视server内部已注册的事件来收集信息,将收集到的性能数据存储在performance_schema存储引擎中。本文将深入剖析PFS内存分配及释放原理,解读其中存在的问题以及改进思路。
概述
MySQL Performance Schema(PFS)是MySQL提供的强大的性能监控诊断工具,提供了一种能够在运行时检查server内部执行情况的特方法。PFS通过监视server内部已注册的事件来收集信息,一个事件理论上可以是server内部任何一个执行行为或资源占用。PFS将采集到的性能数据存储在performance_schema存储引擎中,performance_schema存储引擎是一个内存表引擎,所有收集的诊断信息都会保存在内存中。诊断信息的收集和存储都会带来一定的额外开销,为了尽可能缩小对业务的影响,PFS的性能和内存管理变的非常重要。
内存管理模型
PFS内存管理有几个关键特点:内存分配以Page为单位,一个Page内可以存储多条record;系统启动时预先分配部分Pages,运行期间根据需要动态增长,但Page是只增加不回收的模式;Record的申请和释放都是无锁的。
核心数据结构
PFS_buffer_scalable_container是PFS内存管理的核心数据结构。Container中包含多个Page,每个Page都有固定个数的records,每个record对应一个事件对象,比如PFS_thread。每个Page中的records数量是固定不变的,但Page个数会随着负载增加而增长。
Allocate时Page选择策略
PFS_buffer_scalable_container中涉及内存分配的关键数据结构如下:PFS_PAGE_SIZE,每个page的大小;PFS_PAGE_COUNT,page的最大个数。首先m_pages是一个数组,每个Page都可能有空闲的records,也有可能整个Page都是繁忙的,MySQL采用了比较简单的策略,轮询挨个尝试每个Page是否有空闲,直到分配成功。如果轮询所有Pages依然没有分配成功,这个时候就会创建新的Page来扩充,直到达到Page数的上限。
总结
本文通过阅读PFS引擎的内存管理源码,深入剖析了PFS内存分配及释放原理,并针对其中存在的问题以及改进思路进行了探讨。PFS内存管理是PFS性能优化的关键,对其进行深入研究和改进,将有助于提升MySQL的整体性能。