mysql内存态_MySQL · 社区动态 · MySQL内存分配支持NUMA
NUMA 问题曾经一直是困扰DBA的一个大问题,早在 2010 年, 就有人给MySQL报了Bug#57241, 指出了MySQL在x86系统下存在严重的 “swap insanity” 问题。在NUMA架构越来越普遍的今天,这个问题越来越严重。
MySQL的 swap insanity 问题
有同学专门翻译了Jeremy Cole关于 “swap insanity” 问题的文章,原文看这里,
如果你没空看的话,这里简单描述一下,就是当你把主机大部分内存分配给InnoDB时,你会发现明明操作系统还有很多内存,但是却有很多内存被交换到了SWAP分区。
从这里可以下载到一个测试的C代码,如果你有NUMA架构的服务器,可以测试下不同分配方式的性能差异:
sudo -s
echo 2048 > /proc/sys/vm/nr_hugepages
echo 1000000000000 > /proc/sys/kernel/shmmax
# Node local allocation
for i in `seq 0 4 127`
do
./latency2001 -a $i -c $i -l 128M
done
# Allocate on memory on CPU 0
for i in `seq 0 4 127`
do
./latency2001 -a 0 -c $i -l 128M
done
有两个方式可以解决这个问题:
1. 在Linux Kernel启动参数中加上numa=off(这样也会影响到其他进程使用NUMA);
2. 在mysqld_safe脚本中加上“numactl –interleave all”来启动mysqld。
当然如果跑多实例,我也用过直接绑定mysqld进程到某个numa节点的方式,不过这要求每个实例分配的内存不超过每个NUMA节点管理的内存。脚本可以看这里。
5年过去了,官方依然没有解决这个Bug。但好消息是,官方终于着手解决这个问题了,Stewart Smith 同学提交的Bug#72811,其Patch即将出现在MySQL 5.6.27, 5.7.9 版本之中。
代码层面解决NUMA问题
如果在代码层面彻底解决NUMA问题,那么我们需要解决两个问题:
1. 全局内存应该采用interleave的分配方式分散在不同的numa node上;
2. 线程内存应该采用local的分配方式分配在线程运行的numa node上。
Linux 提供了 set_mempolicy() 函数可以用来设置进程的内存分配策略,其中默认的MPOL_DEFAULT策略就是在当前运行的节点上分配内存,而MPOL_INTERLEAVE策略则是跨所有节点来分配内存。这个函数的说明可以看这里。
因此对于MySQL Server和InnoDB引擎都需要做修改:
1. 在mysqld_main()入口设置 set_mempolicy(MPOL_INTERLEAVE, NULL, 0) 启用全局分配方式;
2. 在MySQL启动完成之后设置set_mempolicy(MPOL_DEFAULT, NULL, 0) 启用本地分配方式;
3. 在InnoDB入口时设置 set_mempolicy(MPOL_INTERLEAVE, NULL, 0) 启用全局分配方式;
4. 在Buffer Pool分配完成时设置 set_mempolicy(MPOL_DEFAULT, NULL, 0) 启用本地分配方式。
MySQL 5.6.27, 5.7.9 发布之后,将会增加一个 innodb_numa_interleave 参数来控制这个策略。innodb_numa_interleave 如果打开,那么将会按上面的策略来设置内存分配方式,如果关闭或者主机不支持NUMA,那么还是按原来的方式分配。
我们一起期待新版本的发布吧,妈妈再也不用担心我的NUMA了!
mysql内存态_MySQL · 社区动态 · MySQL内存分配支持NUMA相关推荐
- mysql limit 菜鸟_MySQL之二---MySQL菜鸟入门“秘籍”
一.MySQL简介 1.什么是数据库 ? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,它产生于距今六十多年前,随着信息技术和市场的发展,特别是二十世纪九十年代以后,数据管理不 ...
- mysql 大量列 动态变量_aardio动态mysql变量设置
aardio动态mysql变量设置 aardio动态mysql变量设置 废话不多说,直接开始干活! 从上午度娘到现在!终于有点结果! 需求是从数据库读取数据,根据条件(变量) 直接上代码,如有任何问题 ...
- mysql基础搭建_MySql基础-构建MySql数据库:安装MySql-server、MySql-client
1 构建MySQL服务器 1.1 问题 本案例要求熟悉MySQL官方安装包的使用,快速构建一台数据库服务器: 安装MySQL-server.MySQl-client软件包 修改数据库用户root的密码 ...
- mysql二进制方式_MySQL数据库之MySql二进制连接方式详解
本文主要向大家介绍了MySQL数据库之MySql二进制连接方式详解 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 使用mysql二进制方式连接 您可以使用MySQL二进制方式进 ...
- mysql数据库启动_MySQL数据库之Mysql启动的方式(四种)
本文主要向大家介绍了MySQL数据库之Mysql启动的方式(四种) ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 废话不多说了,直奔主题了. mysql的四种启动方式: 1.m ...
- elastic如何和mysql同步数据_MySQL数据库之mysql 同步数据到 ElasticSearch 的方案
本文主要向大家介绍了MySQL数据库之mysql 同步数据到 ElasticSearch 的方案 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. MySQL Binlog 要通过 ...
- mysql 内存大_MySQL数据库之MySQL大内存配置方案
本文主要向大家介绍了MySQL数据库之MySQL大内存配置方案 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. MySql noinstall-5.1.xx-win32 配置(原 ...
- mysql 4核_mysql 性能优化 8G内存 4核,高手进来,谢谢
AMD4核处理器优化补丁 呵呵 你的CPU虽然是4核,系统也能完美支持.但是有一点我们是要好好思考的.一台电脑的游戏性能不单纯只CPU,因为CPU的并行处理能力跟曲面解析能力跟GPU根本不是一个档次的 ...
- mysql 存取字符集_MySQL字符集设置—MySQL数据库乱码问题详解
MySQL(4.1以后版本) 服务器中有六个关键位置使用了字符集的概念,他们是:client .connection.database.results.server .system.MySQL有两个字 ...
最新文章
- 计算机cg专业,cg行业要学哪个专业好
- 天呐,程序员有女朋友了!
- 矩阵用jordan解决initial-value问题_矩阵与数值计算(6)——矩阵幂级数 sin A、cos A...
- UVA 1593 Alignment of Code
- apt-get需要安装mysql_ubuntu apt-get安装mysql失败-问答-阿里云开发者社区-阿里云
- php查看表创建结构,MySQL 查看表结构简单命令
- Codeforces Round #694 Div. 2
- Spring Boot整合swagger2(生成有左右菜单式的api文档界面)
- Linux基础命令---显示文本grep
- 关于远程访问tomcat问题的总结
- Java 11 究竟比 8 快了多少?
- 视频教程-java后台+微信小程序 实现完整的点餐系统-微信开发
- android中如何去掉键盘,总结:Android去掉软键盘(输入法)的方法
- Swift游戏实战-跑酷熊猫 14 熊猫打滚
- 中介者(Mediator)模式--------------只有一个仲裁者
- 导出iPhone/iPad中的Safari书签
- ios学习--iphone开发笔记和技巧总结(原址持续更新)
- 知道这些税务小技巧,财务就能给公司赚钱
- 压力集 软件测试,性能测试之压力机
- 文件夹加密精灵 v3.3 官方
热门文章
- 对象序列化Java中的序列化
- HTML5中的WebSocket
- SpringBoot之解决一对一、多对一、多对多等关联实体在JSON序列化/输出时产生的无限递归死循环问题(infinite recursion)
- 解决Linux系统中python matplotlib画图的中文显示问题
- 搜索场景下的智能实体推荐
- 【实践】美团外卖广告智能算力的探索与实践
- 【PPT分享】阿里巴巴定向广告之新一代Rank技术.pdf(附下载链接)
- 【报告分享】全面解码美妆消费者心智-阿里妈妈.pdf(附下载链接)
- linux跑程序占用缓存过多释放内存echo 3 > /proc/sys/vm/drop_caches
- A Volumetric Method for Building Complex Models from Range Images