内存分配器 mysql_聊MySQL内存管理,内存分配器,操作系统
推荐(免费):mysql视频教程
当用户在使用任何软件(包括MySQL)时遇到内存问题,我们的第一反应就是内存泄漏。正如本文所示,情况并非总是如此。
本文描述了一个关于内存的bug。
所有Percona支持客户都有资格获得错误修复,但他们的选择各不相同。比如高级+& lt;链接1 >:在公开发布带有补丁的软件之前,向客户提供一个热修复程序版本。& lt链接2 >:高级客户甚至不必使用Percona软件:我们可以为他们将补丁程序移植到上游。但是对于Percona产品,所有支持级别都有权进行修复。
percona支持的所有客户都有资格获得错误修复,但他们也有不同的选择。例如,vip客户可以在软件补丁正式发布之前获得hotfiix版本。高级客户甚至不需要使用percona的软件,我们可以为他们把补丁往上游推。但是对于percona产品,所有支持级别都有权修复错误。
即使如此,这并不意味着我们将修复每一个意外的行为,即使我们接受该行为是一个有效的bug。做出这一决定的原因之一可能是,尽管Percona产品的行为显然是错误的,但这仍然是一个功能要求。
即使如此,这并不意味着我们将修复所有的意外情况,即使我们接受这种情况是一个有效的bug。做出这一决定的原因之一可能是,尽管这一意外情况显然是错误的,但这确实是对percona产品本身的产品需求
作为研究案例中的一个缺陷
最近的一个很好的例子是PS-5312,这种错误在上游是可重复的,并在bugs.mysql.com/95065报道
最近一个很好的例子是PS-5312:-这个bug可以在上游复制并记录在bugs.mysql.com/95065:。
这报告了访问InnoDB全文索引导致内存使用增长的情况。当有人查询全文索引时,它开始增长,直到达到最大值,并且在相当长的时间内没有被释放。
此报告说明了当访问InnoDB的全文索引时,内存使用将会增加的情况。有些全文索引查询会出现这种情况,内存会持续增长,直到达到最大值,很长时间都不会释放。
Percona工程团队的Yura Sorokin调查了这是否是内存泄漏,发现不是。
来自Percona工程团队的Yura Sorokin的研究表明,这种情况不属于内存泄漏的范畴。
当InnoDB解析一个全文查询时,它会在函数fts _ query _短语_search中创建一个内存堆。这个堆可能会增长到80MB。此外,它有大量的块(mem_block_t),这些块并不总是连续使用,这反过来又会导致内存碎片。
InnoDB解析全文查询时,会在fts _ query _短语_search函数中创建一个内存堆,可能会增长到80M。此外,这个过程还会使用大量不连续的块(mem_block_t),产生内存碎片。
在函数退出时,内存堆被释放。InnoDB对每个分配的块都这样做。在函数的末尾,它调用属于内存分配器库之一的free(),例如malloc或jemalloc。从mysqld的角度来看,一切都做得很正确:没有内存泄漏。
在函数退出时,这些内存堆被释放。InnoDB对它分配的每个块都这样做。在函数执行结束时,调用内存分配器库中的free()操作,如malloc或jemalloc。从MySQL本身来说,这个没问题,没有内存泄漏。
然而,虽然free()在被调用时应该释放内存,但并不要求它返回到操作系统。如果内存分配器决定不久将需要相同的内存块,它可能仍然为mysqld进程保留它们。这解释了为什么在作业完成和所有的取消分配完成后,mysqld仍然使用大量内存。
但是调用free()函数时,应该释放内存,但不需要返回操作系统。如果内存分配器发现这些内存块需要立即使用,它将为mysqld进程保留它们。这就解释了为什么mysqld在完成工作并释放内存后仍然会占用大量内存。
这在实践中不是一个大问题,不应该造成任何伤害。但是如果你需要更快地将内存返回给操作系统,你可以尝试其他的内存分配器,比如jemalloc。后者被证明可以解决PS-5312的问题。
这在实际生产中不是大问题,应该不会造成什么事故。但是如果你需要更快地将内存返回给操作系统,你可以尝试一个非传统的内存分配器,比如jemallolc。可以证明解决PS-5312:问题。
改善内存管理的另一个因素是CPU内核的数量:我们用于测试的越多,内存返回操作系统的速度就越快。这可能可以用这样一个事实来解释,如果你有多个CPU,那么内存分配器可以将其中一个专门用于向操作系统释放内存。
改善内存管理的另一个因素是cpu内核的数量:在测试中,cpu内核越多,内存返回操作系统的速度就越快。可能是你有多个CPU,其中一个可以作为内存分配器给操作系统释放内存。
InnoDB全文索引的第一个实现引入了这个缺陷。我们的工程师尤拉·索罗金发现:
第一个5.6版本承诺,为InnoDB WL#5538引入全文搜索功能:InnoDB全文搜索支持–https://dev.mysql.com/worklog/task/? id = 5538
实施WL #5538 InnoDB全文搜索支持,合并-https://github.com/mysql/mysql-server/commit/b6169e2d944-也有这个问题。
正如我们的工程师Yura Sorokin所发现的,以下两点说明InnoDB全文索引的早期实现引入了这个缺陷:
MySQL版最早引入InnoDB WL全文索引功能:#5538: InnoDB全文搜索支持-https://dev . MySQL . com/worklog/task/?id=5538
实现WL #5538 InnoDB全文搜索支持和合并-https://github . com/MySQL/MySQL-server/commit/b 6169 e2d 944-也有同样的问题
修复方法
我们有几个选项可以解决这个问题:
更改InnoDB全文索引的实现
使用自定义内存库,如jemalloc
两者各有利弊。
我们有两种方法来解决这个问题:
1.修改InnoDB全文索引的实现
2.使用定制的内存库,如jemalloc
两种方法各有利弊。
选项1意味着我们正在引入一个与upstream的不兼容,这可能会导致未来版本出现奇怪的bug。这也意味着我们的客户使用的InnoDB全文代码的完全重写,这在正式版中总是有风险的。
方法1意味着我们引入了与上游软件不兼容的风险,这可能导致新版本出现未知错误。也意味着完全重写InnoDB全文索引的部分代码,这在用户使用的GA版本中是有风险的。
选项2意味着我们可能会碰到jemalloc<。链接5 >:专为性能而不是最安全的内存分配而设计的库。
方法2意味着我们可能会遇到一些专门为性能而设计的bug,但不是jemalloc库中最安全的内存分配。
所以我们必须在这两个不理想的解决方案中做出选择。
由于选项1可能会导致Percona服务器与上游不兼容的情况,我们更喜欢选项2,并期待上游修复此错误。
所以我们不得不在这两种不完美的方法中选择一种。
鉴于方法一导致percona服务与上游不兼容,我们倾向于使用方法二来解决问题,并期望上游来修复这个bug。
结论
如果mysqld进程内存使用率很高,这并不总是内存泄漏的征兆。您可以在性能模式中使用内存检测来了解如何使用分配的内存。尝试替代内存库,以便更好地处理分配和释放内存。在用户手册中搜索LD _ PRELOADto,了解如何在此处和此处设置它。
如果发现mysqld进程占用内存量大,不代表一定是内存泄漏。我们可以在性能模式中使用内存检查来了解进程如何使用分配的内存。您也可以尝试替换内存库,以更好地处理内存分配和释放。关于如何配置LD_RELOAD,请参考相应页面MySQL-safe:And-use-system:。以上是MySQL内存管理、内存分配器和操作系统等的细节
内存分配器 mysql_聊MySQL内存管理,内存分配器,操作系统相关推荐
- mysql 自动管理内存_MySQL内存管理,内存分配器和操作系统
导读 作者:Sveta Smirnova 翻译:郑志江 校对:徐晨亮 原文 :MySQL Memory Management, Memory Allocators and Operating Syst ...
- mysql爆内存_线上MySQL数据库机器内存爆掉原因分析与解决
本文主要向大家介绍了线上MySQL数据库机器内存爆掉原因分析与解决,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 现象: 阿里金融某业务的MySQL机器的内存每隔几天就会增长,涨 ...
- LINUX如何让内存FREE变大,Linux性能优化(内存:free + top +vmstat )
转载:https://blog.51cto.com/superpcm/2068843 cat /proc/{pid}/status Valgrind工具检测内存泄漏 3.1内存性能统计信息 3.1.1 ...
- 云服务器显示内存不足怎么调整,云服务器扩充内存
云服务器扩充内存 内容精选 换一换 当创建的弹性云服务器规格无法满足业务需要时,可参考本章节变更规格,升级vCPU.内存.对于部分类型的弹性云服务器,您还可以在变更规格时,更换弹性云服务器的类型.关机 ...
- Linux内存管理slub分配器
背景 Kernel版本:4.14 ARM64处理器,Contex-A53,双核 使用工具:Source Insight 3.5, Visio 1. 概述 之前的文章分析的都是基于页面的内存分配,而小块 ...
- mysql large pages_Innodb内存管理解析
本文主要介绍innodb的内存管理,涉及基础的内存分配结构.算法以及buffer pool的实现细节,提及change buffer.自适应hash index和log buffer的基本概念和内存基 ...
- [侯捷 C++内存管理] 标准分配器实现
[侯捷 C++内存管理] 标准分配器实现 文章目录 [侯捷 C++内存管理] 标准分配器实现 VC6 标准分配器之实现 VC6 malloc() VC6 allocator BC5 标准库分配器之实现 ...
- 宝塔低内存安装mysql_宝塔面板安装mysql 8.0提示最低内存和最低CPU限制的三种解决方法...
今天一个会员说亲测修复 金刚电竞 解密去授权 LOL赛事预测电竞游戏比分竞猜源码 修复比赛采集这个源码安装不了,我问他你按照说明安装的mysql8.0根redis了吗,他说没有,然后他安装数据库的时候 ...
- linux 共享内存_什么是物理/虚拟/共享内存——Linux内存管理小结一
物理内存和虚拟内存到底有什么区别? 提到内存,我们会想到经常接触的三个词:虚拟内存.物理内存.共享内存.它们分别对应top输出中的VIRT.RES.SHR三列. 1. 物理内存 系统的物理内存被划分为 ...
最新文章
- 行人被遮挡问题怎么破?百度提出PGFA新方法,发布Occluded-DukeMTMC大型数据集 | ICCV 2019...
- IJCAI 2018 基于主题信息的神经网络作文生成模型
- 【 FPGA 】MATLAB 生成 FIR 滤波器的操作步骤(包括生成Verilog HDL代码以及仿真过程)
- 2!=5 or 0在python中是否正确-不吹不擂,你想要的Python面试都在这里了【315+道题】...
- sqlserver2000分页存储过程(原创)
- word2vec原理_Word2vec详细整理(1)—权重更新原理
- oracle groupq by,oracle group by 性能优化
- java 对象引用 弱引用吗_Java对象的强引用、软引用、弱引用和虚引用 笔记
- python 调用控制台_如何使用Python的交互控制台
- mysql procedure prepare_mysql prepare 存储过程使用
- WPF之Binding的三种简单写法
- AndroidStudio配置gradle,让App自动签名
- 基于 HTML5 WebGL 的挖掘机 3D 可视化应用
- 大数据shipin教程_大数据全套视频教程完整版
- 互联网潜规则:如何进行敏感词屏蔽
- erstudio怎么导入mysql数据库?_使用ERStudio生成数据库设计文档。
- iOS悬浮、可拖动、自动吸附屏幕边缘的按钮制作
- 软件工程_三层架构介绍
- python编程猫下载_编程猫下载_编程猫安卓版下载_编程猫 2.0.2手机版免费下载- AppChina应用汇...
- 猿创征文|一个.Net过气开发工程师的成长之路