当前位置:首页 > 技术分析 > 正文内容

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

ruisui883个月前 (02-07)技术分析12

当 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 的技术内容,你们还有什么想知道的吗?赶紧留言告诉小编吧!

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/1762.html

标签: pprof
分享给朋友:

“第44问:MySQL 的内存消耗, 哪些不在 performance_schema 的统计范围” 的相关文章

Linux Lite 6.6发行版正式发布:添加简体中文及AI工具支持

IT之家 9 月 8 日消息,Linux Lite 是一个对新手友好的 Linux 发行版,它基于 Ubuntu LTS,并以 Xfce 桌面为特色,主要针对 Windows 用户而设计,也被认为是从 Windows 过渡到 Linux 的友好方案。目前 Linux Lite 6.6 版本已经正式发...

「 VUE3 + TS + Vite 」父子组件间如何通信?

组件之间传值,大家都很熟悉,涉及到 VUE3 +TS 好多同学就无从下手了,所以分享这篇文章,希望看完后提起 VUE3+TS 能够不慌不忙。平时使用的函数如:ref、reactive、watch、computed 等需要先引入才能使用,但是本篇文章介绍的 defineProps、withDefaul...

代码管理-9-gitlab的使用和设置

gitlab使用1、外观设置完成后保存,返回登录页面查看关于注册,有些公司是不允许打开的,,有些人数非常多的公司就需要打开注册的功能,让人员自己注册,我们来给他特定的权限就可以,毕竟人非常多的时候还由我们来给她们注册就非常不现实了,工作量会很大2、自动注册3、组&用户&项目创建组设置组名称、描述等创...

使用cgroup限制进程资源

这里使用containerd项目中的cgroup包来实现进程资源限制。先写一个耗费一个CPU并且一秒增加10m内存的测试进程package mainimport ( "fmt" "math/rand" "time")func main() { go f...

三勾商城(java+vue3)微信小程序商城+SAAS+前后端源码

项目介绍本系统功能包括: 前台展示+后台管理+SAAS管理端,包括最基本的用户登录注册,下单, 购物车,购买,结算,订单查询,收货地址,后台商品管 理,订单管理,用户管理等等功能,小伙伴一起来看看吧。三勾小程序商城基于springboot+element-ui+uniapp打造的面向开发的小程序商城...

Ruoyi-vue第五十二章:Uniapp小程序配置tabbar底部导航栏

一、功能实现效果如下图底部的tabbar二、uniapp的tabBar如果应用是一个多 tab 应用,可以通过 tabBar 配置项指定一级导航栏,以及 tab 切换时显示的对应页。在 pages.json 中提供 tabBar 配置,不仅仅是为了方便快速开发导航,更重要的是在App和小程序端提升性...