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相关推荐

  1. mysql limit 菜鸟_MySQL之二---MySQL菜鸟入门“秘籍”

    一.MySQL简介 1.什么是数据库 ? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,它产生于距今六十多年前,随着信息技术和市场的发展,特别是二十世纪九十年代以后,数据管理不 ...

  2. mysql 大量列 动态变量_aardio动态mysql变量设置

    aardio动态mysql变量设置 aardio动态mysql变量设置 废话不多说,直接开始干活! 从上午度娘到现在!终于有点结果! 需求是从数据库读取数据,根据条件(变量) 直接上代码,如有任何问题 ...

  3. mysql基础搭建_MySql基础-构建MySql数据库:安装MySql-server、MySql-client

    1 构建MySQL服务器 1.1 问题 本案例要求熟悉MySQL官方安装包的使用,快速构建一台数据库服务器: 安装MySQL-server.MySQl-client软件包 修改数据库用户root的密码 ...

  4. mysql二进制方式_MySQL数据库之MySql二进制连接方式详解

    本文主要向大家介绍了MySQL数据库之MySql二进制连接方式详解 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 使用mysql二进制方式连接 您可以使用MySQL二进制方式进 ...

  5. mysql数据库启动_MySQL数据库之Mysql启动的方式(四种)

    本文主要向大家介绍了MySQL数据库之Mysql启动的方式(四种) ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 废话不多说了,直奔主题了. mysql的四种启动方式: 1.m ...

  6. elastic如何和mysql同步数据_MySQL数据库之mysql 同步数据到 ElasticSearch 的方案

    本文主要向大家介绍了MySQL数据库之mysql 同步数据到 ElasticSearch 的方案 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. MySQL Binlog 要通过 ...

  7. mysql 内存大_MySQL数据库之MySQL大内存配置方案

    本文主要向大家介绍了MySQL数据库之MySQL大内存配置方案 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. MySql noinstall-5.1.xx-win32 配置(原 ...

  8. mysql 4核_mysql 性能优化 8G内存 4核,高手进来,谢谢

    AMD4核处理器优化补丁 呵呵 你的CPU虽然是4核,系统也能完美支持.但是有一点我们是要好好思考的.一台电脑的游戏性能不单纯只CPU,因为CPU的并行处理能力跟曲面解析能力跟GPU根本不是一个档次的 ...

  9. mysql 存取字符集_MySQL字符集设置—MySQL数据库乱码问题详解

    MySQL(4.1以后版本) 服务器中有六个关键位置使用了字符集的概念,他们是:client .connection.database.results.server .system.MySQL有两个字 ...

最新文章

  1. 计算机cg专业,cg行业要学哪个专业好
  2. 天呐,程序员有女朋友了!
  3. 矩阵用jordan解决initial-value问题_矩阵与数值计算(6)——矩阵幂级数 sin A、cos A...
  4. UVA 1593 Alignment of Code
  5. apt-get需要安装mysql_ubuntu apt-get安装mysql失败-问答-阿里云开发者社区-阿里云
  6. php查看表创建结构,MySQL 查看表结构简单命令
  7. Codeforces Round #694 Div. 2
  8. Spring Boot整合swagger2(生成有左右菜单式的api文档界面)
  9. Linux基础命令---显示文本grep
  10. 关于远程访问tomcat问题的总结
  11. Java 11 究竟比 8 快了多少?
  12. 视频教程-java后台+微信小程序 实现完整的点餐系统-微信开发
  13. android中如何去掉键盘,总结:Android去掉软键盘(输入法)的方法
  14. Swift游戏实战-跑酷熊猫 14 熊猫打滚
  15. 中介者(Mediator)模式--------------只有一个仲裁者
  16. 导出iPhone/iPad中的Safari书签
  17. ios学习--iphone开发笔记和技巧总结(原址持续更新)
  18. 知道这些税务小技巧,财务就能给公司赚钱
  19. 压力集 软件测试,性能测试之压力机
  20. 文件夹加密精灵 v3.3 官方

热门文章

  1. 对象序列化Java中的序列化
  2. HTML5中的WebSocket
  3. SpringBoot之解决一对一、多对一、多对多等关联实体在JSON序列化/输出时产生的无限递归死循环问题(infinite recursion)
  4. 解决Linux系统中python matplotlib画图的中文显示问题
  5. 搜索场景下的智能实体推荐
  6. 【实践】美团外卖广告智能算力的探索与实践
  7. 【PPT分享】阿里巴巴定向广告之新一代Rank技术.pdf(附下载链接)
  8. 【报告分享】全面解码美妆消费者心智-阿里妈妈.pdf(附下载链接)
  9. linux跑程序占用缓存过多释放内存echo 3 > /proc/sys/vm/drop_caches
  10. A Volumetric Method for Building Complex Models from Range Images