mysql 自动管理内存_MySQL内存管理,内存分配器和操作系统
导读
作者:Sveta Smirnova
翻译:郑志江
校对:徐晨亮
原文 :MySQL Memory Management, Memory Allocators and Operating System
本文涉及链接在文末展示
当用户使用任何软件(包括MySQL)碰到内存问题时,我们第一反应就是内存泄漏。正如这篇文章所示,其实并不总是这样。
这篇文章阐述一个关于内存的bug。
所有percona所支持的客户都有获得bug修复的资格,但他们也有不同的选择。比如,vip客户在软件补丁正式发布之前就可以获得hotfiix版本,高级客户甚至不需要使用percona的软件,我们也可以为他们把补丁推到上游。但对于与percona产品来说,所有支持等级都有权得到bug修复。
即便如此,这并不意味着我们会修复所有的意外情况,即使我们接受这种情况为一个有效bug。做出这样的决定的原因之一可能是这个意外情况虽然很明确是错误的,但对于percona产品本身来说确实一个产品需求
作为学习案例的一个bug
最近一个很好的案例是 PS-5312——这个bug可在上游复现并被记录在bugs.mysql.com/95065。
这个报告阐述了一种情况,当访问InnoDB的全文索引的时候会导致内存使用量增长。这种情况出现在一些全文索引的查询,内存会持续增长直到达到最大值,并且很长时间不会释放。
来自Percona工程团队的Yura Sorokin研究表明,这种情况并不属于内存泄漏范畴。
当InnoDB解析一个全文查询时,它会在fts_query_phrase_search函数中创建一个内存堆,这个堆可能增长到80M。另外,这个过程还会使用到大量非连续块(mem_block_t)进而产生的内存碎片。
在函数出口,这些内存堆会被释放。InnoDB会为其分配的每一个块做这个操作。在函数执行结束时,调用一个内存分配器库中的free()操作,比如malloc或者jemalloc。从MySQL本身来看,这都是没问题的,不存在内存泄漏。
然而,free()函数被调用时确实应该释放内存,但不需要将其返回给操作系统。如果内存分配器发现这些内存块马上还需要被用到,则会将他们保留住继续用于mysqld进程。这就解释了为什么mysqld在完成工作及释放内存都结束后还会占用大量内存。
这个在实际生产中并不是一个大问题,按道理不应该造成任何事故。但是如果你需要更快地将内存返回给操作系统,你可以尝试非传统的内存分配器,类似jemallolc。它被证明可以解决PS-5312的问题。
另一个改善内存管理的因素是cpu内核数量:在测试中,cpu核数越多,内存返回给操作系统的速度会越快。这可能是你拥有多个CPU,而其中一个可专门用作内存分配器释放内存给操作系统。
正如我们的工程师Yura Sorokin所发现的一样,下面两点阐述了InnoDB全文索引的早期实现引入了这个缺陷:
5.6版本MySQL最早对InnoDB WL全文索引功能引入的介绍:#5538: InnoDB全文搜索支持 – https://dev.mysql.com/worklog...
实现WL #5538 InnoDB全文搜索支持与合并 - https://github.com/mysql/mysq... - 也存在同样的问题问题
修复方法
我们有两种方法来修复这个问题:
1.修改InnoDB全文索引的实现
2.使用自定义内存库,例如jemalloc
这两种方法都有各自的优缺点。
方法1 :意味着我们引入了与软件上游不兼容性的风险,这可能会导致新版本中出现未知的错误。也意味着彻底重写InnoDB全文索引部分代码,这在用户们使用的GA版本中是有风险的。
方法2 则意味着我们可能会命中一些jemalloc库中专门为性能设计但不是最安全的内存分配的bug。
因此我们不得不在这两个并不完美的方法中选择一个。
鉴于方法一可能导致percona服务与上游的不兼容,我们更倾向于用方法二来解决问题,并期待着上游修复这个bug。
结论
如果发现mysqld进程占用内存很高,并不代表一定是内存泄漏。我们可以在Performance Schema中使用内存检测来了解进程是如何使用已分配的内存。也可以尝试替换内存库来更好地处理内存分配与释放。关于LD_RELOAD如何配置,请查阅MySQL用户手册对应页面 mysqld-safe和using-system。
相关文章:

采集音频和摄像头视频并实时H264编码及AAC编码
0. 前言 我在前两篇文章中写了DirectShow捕获音视频然后生成avi,再进行264编码的方法。那种方法有一些局限性,不适合实时性质的应用,如:视频会议、视频聊天、视频监控等。本文所使用的技术,适用于这种实时性的应用&…

【算法练习】校招研发工程师笔试题
请留言,说出你的解题思路和答案。稍后,我会把参考答案发到留言区。不定期整理相关的问题答案分享。 01、下面对于线性表的叙述中,不正确的是()。 (A)线性表采用顺序存储时,必须占用…

Ubuntu安装tomcat
1.从官网中下载apache-tomcat-**.tar.gz文件 2.在本地文件新建一个文件夹(tomcat),在文件夹中解压压缩包, 不需要使用root: tar -zxvf /home/xcx/下载/apache-tomcat-8.5.11.tar.gz 3.进入解压文件中使用命令,将tomcat中的文件全部设置添加读…

mysql 绑定参数_MySQL 使用 Perl 绑定参数和列
SQL 语句通常是动态构建的,用户提供一些输入,并将其内置到语句中。 程序员每次处理用户的输入时都必须谨慎。 它具有一些严重的安全隐患。 动态构建 SQL 语句的推荐方法是使用参数绑定。绑定参数可以防止 SQL 注入程序。 它会自动转义一些特殊字符并允许…

java入门(p1)进入java的世界
浅谈java世界(连载中P1) Java是一门语言,它并不是很难理解的东西,语言是来进行交流的工具,那么它用来跟谁来交互呢,所有的语言都有与其交流的对象,中文也好英文也罢,交流基本的对象应…

python __setattr__ , __getattr__
Python Class 对象或类型通过内置成员 __dict__ 来存储成员信息。 我们还可以通过重载 __getattr__ 和 __setattr__ 来拦截对成员的访问,需要注意的是 __getattr__ 只有在访问不存在的成员时才会被调用。转载于:https://www.cnblogs.com/Huayuan/archive/2013/05/17…

第01章 PyTorch简介和安装 的学习笔记
由于第一章,主要介绍Pytorch的安装,而自己的笔记本已经安装了CPU版本的Pytorch,所以第一章主要是复习了Conda的基本命令并做了5个选择题供大家练习。 课程来源:https://github.com/datawhalechina/thorough-pytorch 1、在Window…

python socket tcp客户端_python网络编程socketserver模块(实现TCP客户端/服务器)
摘录python核心编程socketserver(python3.x版本重新命名)是标准库中的网络编程的高级模块。通过将创建网络客户端和服务器所必须的代码封装起来,简化了模板,为你提供了各种各样的类。除了隐藏了实现细节之外,它督促我们使用类(面向对象的思维…

template.process(root, out)的用法(shiro项目中来的九)
假如你现在还在为自己的技术担忧,假如你现在想提升自己的工资,假如你想在职场上获得更多的话语权,假如你想顺利的度过35岁这个魔咒,假如你想体验BAT的工作环境,那么现在请我们一起开启提升技术之旅吧,详情请…

java中最常用jar包的用途说明,适合初学者
jar包用途axis.jarSOAP引擎包commons-discovery-0.2.jar用来发现、查找和实现可插入式接口,提供一些一般类实例化、单件的生命周期管理的常用方法.jaxrpc.jarAxis运行所需要的组件包saaj.jar创建到端点的点到点连接的方法、创建并处理SOAP消息和附件的方法ÿ…

【青少年编程(第33周)】Scratch(三级)公益活动开营了!
2021年10月10日(周日)晚20:00我们在青少年编程竞赛交流群开展了第三十三期直播活动。我们直播活动的主要内容如下: 首先,我们奖励了上周测试超过40分的小朋友。 其次,我们讲解了上次测试中小朋友们做错的题目Scratch青…

python函数图像绘制、函数不固定_无法在函数中绘制tkinter图像
我正在制作一个垄断游戏,我试图在画布上绘制图像,但它只有在功能不起作用的情况下才会起作用:def make_image(root, location, canvas):photo PhotoImage(file root)canvas.create_image(location["X"],location["Y"],…

一些与算法有关的网站
//转自:http://www.cnblogs.com/a180285/archive/2012/01/15/2290290.html //------------------------------------------------------------------------------------------------------------------------------------------------------------ 我在网上到处找了…

【工程基础】校招研发工程师笔试题
请留言,说出你的解题思路和答案。稍后,我会把参考答案发到留言区。不定期整理相关的问题答案分享。 1、以下代码违反了什么设计原则() public class Student {public int Id;public string StudentName; }public class MClass {…

情人节学写html5微信游戏
情人节都在干什么??? 当然是写代码!!! 看某书正好以一个html5微信游戏,很适合今天的日子 附上demo:demo 请在手机上查看,pc端请切换手机调试模式,目前没弄完后…

python和idl_有前辈对比过IDL和Python的速度吗,哪个会快点?
看到这个问题,发现国外还真有人做过对比,主要在于语言特点方面,并没有详细的定量对比,贴过来大家一起乐呵乐呵。其实大体上就是之前几位答主所说的那样,主要区别在于:1.资料的多少。python资料较多2.现成的…

测试用例经验谈
1.需要测试的那个类是new出来的实例; 2.被测试的类实例的对象所需要调用的接口或者对象都是mock出来的(无论是否已经有实现)。 3.所有的接口都是根据被测试的类的需要产生的,即接口属于客户(被测试的类)。 …

中国电子学会图形化四级编程题:加减法混合运算器
「青少年编程竞赛交流群」已成立(适合6至18周岁的青少年),公众号后台回复【Scratch】或【Python】,即可进入。如果加入了之前的社群不需要重复加入。 我们将有关编程题目的教学视频已经发布到抖音号21252972100,小马老…

Bzoj4566:[HAOI2016]找相同字符
题面 Bzoj Sol 两个串拼在一起后求出后缀数组 然后显然的\(n^2\)暴力,就是直接枚举求\(LCP\) 又由于扫的时候是对\(height\)取\(min\) 那么可以用单调栈维护每一段的贡献相同的 # include <bits/stdc.h> # define RG register # define IL inline # define Fi…

python字符照片_python图片转字符图片
python图片转字符图片代码话不多说,直接上代码。***************************#-*- coding:utf-8 -*-from PIL import ImageIMG#文件路径WIDTH60HEIGHT45ascii_char list("$B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_~<>i!lI;:,\"^…

三大基本排序专题
//以下依次是冒泡、选择、插入排序 var n,i:longint;a:array[0..20] of longint;procedure BUB;var i,j,t:longint;beginfor i:1 to n-1 dofor j:1 to n-i doif a[j]>a[j1] then begin t:a[j]; a[j]:a[j1]; a[j1]:t; end;end;procedure SEL;var i,j,k,t:longint;beginfor i:…
Linux内核中锁机制之完成量、互斥量
在上一篇博文中笔者分析了关于信号量、读写信号量的使用及源码实现,接下来本篇博文将讨论有关完成量和互斥量的使用和一些经典问题。 八、完成量 下面讨论完成量的内容,首先需明确完成量表示为一个执行单元需要等待另一个执行单元完成某事后方可执行&…

中国电子学会图形化四级编程题:绳子算法
「青少年编程竞赛交流群」已成立(适合6至18周岁的青少年),公众号后台回复【Scratch】或【Python】,即可进入。如果加入了之前的社群不需要重复加入。 我们将有关编程题目的教学视频已经发布到抖音号21252972100,小马老…

域名登陆出现400_域名解析错误怎么办?
可能有些人在进行域名解析时会遇到解析错误的问题,遇到这样的问题该怎么办呢?今天小编给大家整理了一些思路,希望能够提供一些帮助给大家。网站域名设置目前域名解析服务很多都是由域名供应商来设置,也有用户在网站运营期间需要更…

第02章 PyTorch基础知识
文章目录第02章 Pytorch基础知识2.1 张量2.2 自动求导2.3 并行计算简介2.3.1 为什么要做并行计算2.3.2 CUDA是个啥2.3.3 做并行的方法补充:通过股票数据感受张量概念。本图文是Datawhale组队学习Pytorch的学习笔记,主要内容包括张量的概念(0维…

一个简单的缓冲区溢出的思考
从大二开始真正接触技术开始,从最早的HTML,PHP,WEB开发。一直以为以后可能会从事开发的工作,碰巧大三上的时候和同专业的郭子,邹豪参加了南京的一个信息安全技能大赛,才真正找到了兴趣的方向,也…

Spring-boot+Vue = Fame 写blog的一次小结
前言 作为一个程序员,总是要有一个属于自己的博客。然后作为一个造轮子的程序员,肯定不满足于直接使用现有的博客系统,于是我便自己写了一个带后台管理的博客系统。 体验地址: zzzzbw.cn 技术选型 作为一个Javaer,服务…

gitee查看当前账号_upic+gitee图床,自由书写Markdown
使用的软件Typora:Markdown文档编辑器(https://www.typora.io/)upic:图床工具(https://github.com/gee1k/uPic)创建自己的GitHub图床1 创建账号https://gitee.com/,自行创建账号就可以了和github很相似,但是速度更快2创建仓库内容按照自己的习…

CentOS中vsftp安装与配置
1. 安装 使用chkconfig --list来查看是否装有vsftpd服务; 使用yum命令直接安装:yum -y install vsftpd 然后为它创建日志文件:touch /var/log/vsftpd.log 这样简单的两个命令就完成了vsftp的安装,但是如果你现在想这样ftp://your_…

纸上原型设计 VS 桌面原型工具设计,你更喜欢谁?
2019独角兽企业重金招聘Python工程师标准>>> 纸上原型设计,作为传统的原型设计方式,简单快速,成本低廉,为大部分设计师所喜爱。而桌面原型工具设计,作为伴随电脑科技发展而出现的原型设计方式,快…