第44问:MySQL 的内存消耗, 有哪些不在 performance_schema 的统计范围

本文通过实验揭示MySQL内存使用超出性能_schema的现象,研究了哪些内存分配不被性能_schema记录,并利用tcmalloc和pprof工具追踪内存分配,深入理解内存分配流。

当 MySQL 内存异常上涨, 我们可以通过 performance_schema 观察内存的使用, 我们在**实验5**中进行过介绍。

但我们也会发现操作系统统计的 MySQL 内存用量比 performance_schema 统计的 MySQL 内存用量要多。

那么 MySQL 的内存消耗, 有哪些是不在 performance_schema 统计内的呢?

本期我们设计实验来观察这个问题

实验

我们先安装 google-perftools:

安装后, 可以找到相关的库:

宽油起一个数据库:

记下数据库的启动参数, 并关掉数据库:

我们在数据库启动命令前, 增加两个环境变量 LD_PRELOAD 和 HEAPPROFILE.

其中 LD_PRELOAD 指向刚才我们安装的 tcmalloc 库, HEAPPROFILE 是输出文件的路径.

启动数据库后, 我们看到日志中输出了两个 heap 文件.

我们在数据库中增加一些压力, 还是用我们熟悉的翻倍法:

多做点数据:

观察到输出了更多的 heap 文件:

下面我们安装 pprof 来解析这些 heap 文件.

先下载 golang , 此步骤需要挂代理:

安装 golang :

安装 pprof :

用 pprof 解析我们刚才生成的 heap 文件:

我们让 pprof 生成一个 svg 文件, 我们将 svg 文件放到 Chrome 中打开查看:

图比较大, 每根线都标记了内存的分配流, 我们用红色箭头标注了三个汇集点 (所有的连线都会流向这三个汇集点中的某一个).

其中 pfs_malloc 是可以被 performance_schema 跟踪的内存分配, 而其他两个汇集点则不能.

下面我们将图的一部分放大, 举例来做个大致介绍 (本图中我们用红色箭头增强了原图的连线):

我们可以看到有16384.53kB是 由 log_allocate_buffer 函数调用 ut_allocator 分配的, 这部分无法被 performance_schema 跟踪到.

查看一下代码, 得知 log_allocate_buffer 是根据 log_buffer_size 参数申请内存的:

查看参数, 证实 log_buffer_size 的配置与我们在图中观察到的内存分配一致:

总结

本实验中, 我们使用了 tcmalloc 作为 MySQL 的内存分配器, 并使用 tcmalloc 提供的 heap dump 功能, 追踪 MySQL 的内存分配。

通过内存分配图, 能让我们直观地理解 MySQL 的内存分配:

我们可以从中观察到 每一部分的内存 是从哪个代码路径进行分配的, 以及哪些内存是 performance_schema 能追踪到的。

此功能对性能影响不大, 可以在生产上比较平稳的使用, 用于探索生产环境的一些内存分配异常。


关于 MySQL 的技术内容,你们还有什么想知道的吗?赶紧留言告诉小编吧!

### `information_schema`、`mysql`、`performance_schema` 和 `sys` 数据库的作用与来源 #### `information_schema` `information_schema` 是 MySQL 和 MariaDB 中的一个系统数据库,它存储了所有其他数据库的元数据信息。这些信息包括数据库中的表、列、索引、权限、存储引擎等结构信息。用户可以通过查询 `information_schema` 来获取数据库的结构信息,例如查询某个表的所有列名: ```sql SELECT column_name FROM information_schema.columns WHERE table_name = 'admin'; ``` 该数据库不会存储实际的数据内容,而是提供一种标准化的方式来访数据库的结构信息,适用于所有数据库[^1]。 #### `mysql` `mysql` 数据库是 MySQL 服务器的核心系统数据库之一,它存储了与权限管理相关的数据,包括用户账户、权限设置、角色定义等信息。例如,`user` 表中存储了用户的登录名、主机限制和权限信息,`db` 表则定义了数据库级别的权限。这些信息是 MySQL 权限系统的基础,用于控制用户对数据库对象的访[^3]。 #### `performance_schema` `performance_schema` 是 MySQL 提供的一个性能监控数据库,它记录了服务器运行时的性能数据,包括线程、锁、文件 I/O、内存使用等指标。通过该数据库,管理员可以分析服务器的运行状态,优化数据库性能。例如,可以查询当前打开的文件句柄数: ```sql SELECT * FROM performance_schema.file_summary_by_instance; ``` 该数据库的监控数据是实时的,但不会持久化存储,重启后数据会被清空[^2]。 #### `sys` `sys` 数据库是 MySQL 5.7 引入的一个系统数据库,它基于 `performance_schema` 提供了更高层次的视图和函数,简化了性能数据的查询。`sys` 数据库中的视图和函数将原始的性能数据转化为更易读的形式,帮助用户快速识别性能瓶颈。例如,可以查询当前最消耗 CPU 的线程: ```sql SELECT * FROM sys.processlist; ``` 该数据库为性能调优提供了便捷的工具,减少了直接操作 `performance_schema` 的复杂性[^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值