当前位置: 首页 > news >正文

浅谈 NUMA 与 MySQL

一、NUMA 简介

NUMA(Non-Uniform Memory Access,非一致性内存访问)【英文发音叫 纽马】 NUMA 服务器的基本特征是 Linux 将系统的硬件资源划分为多个软件抽象,称为节点(Node),每个节点上有单独的 CPU、内存和 I/O 槽口等。CPU 访问自身 Node 内存的速度将远远高于访问远地内存(系统内其它节点的内存)的速度,这也是非一致内存访问 NUMA 的由来。查看numa是否开启的常用命令,lscpu 、numactl --hardware、grep -i numa /var/log/dmesg。

二、NUMA 与 MySQL 分析

NUMA 的 4 种内存分配策略:

  • 缺省(default):总是在本地节点分配(当前进程运行的节点上)
  • 绑定(bind):强制分配到指定节点上
  • 交叉(interleavel):在所有节点或者指定节点上交叉分配内存
  • 优先(preferred):在指定节点上分配,失败则在其他节点上分配

NUMA 的内存分配策略对于进程来说,并不是乐观的。因为 NUMA 默认是使用 CPU 亲和的内存分配策略,即请求进程会从当前所处的 CPU 的 Node 请求分配内存。当某个需要消耗大量内存的进程耗尽了所处的 Node 的内存时,就会导致产生 swap,不会从远程 Node 分配内存,这就是 swap insanity 现象。

MySQL 数据库是单进程多线程的架构,在开启的 NUMA 服务器中,内存被分配到各 NUMA Node 上,而 MySQL 进程只能消耗所在节点的内存。所以在开启 NUMA 的服务器上,某些特殊场景中容易出现系统拥有空闲内存但发生 SWAP 导致性能问题的情况。

比如专用的 MySQL 单实例服务器,物理内存为 40GB,MySQL 进程所在节点的本地内存为 20G,而 MySQL 配置 30GB 内存,超出节点本地内存部分会被 SWAP 到磁盘上,而不是使用其他节点的物理内存,引发性能问题。

三、如何关闭 NUMA

1. 硬件层,在 BIOS 中设置关闭;(目前研祥的服务器不清楚怎么在bios层设置这个需要确认 陈杰 未知用户 (chenyong) 未知用户 (yzwu) )

2. OS 内核层,在 Linux Kernel 启动参数中加上 numa=off 后重启服务器;

For RHEL 6:

编辑 /boot/grub/grub.conf 文件的 kernel 行(添加 numa=off):

# vi /boot/grub/grub.conf
kernel /vmlinuz-2.6.39-400.215.10.EL ro root=/dev/VolGroup00/LogVol00 numa=off

For RHEL 7:

编辑 /etc/default/grub 文件的 kernel 行

# vi /etc/default/grub
GRUB_CMDLINE_LINUX="rd.lvm.lv=rhel_vm-210/root rd.lvm.lv=rhel_vm-210/swap vconsole.font=latarcyrheb-sun16 crashkernel=auto  vconsole.keymap=us rhgb quiet numa=off

RHEL7/CentOS7 必须要重建 GRUB 配置文件才能生效:

# grub2-mkconfig -o /etc/grub2.cfg

3. 数据库层,在 mysqld_safe 脚本中加上 “numactl –interleave all” 来启动 mysqld。

# numactl --interleave=all ./bin/mysqld_safe --defaults-file=/etc/my.cnf &

四、innodb_numa_interleave 参数

MySQL 在 5.6.27、 5.7.9 引入了 innodb_numa_interleave 参数,MySQL 自身解决了内存分类策略的问题,需要服务器支持 numa。

根据官方文档的描述:

当启用 innodb_numa_interleave 时,mysqld 进程的 NUMA 内存策略被设置为 MPOL_INTERLEAVE;InnoDB 缓冲池分配完毕后,NUMA 内存策略又被设置为 MPOL_DEFAULT。当然 innodb_numa_interleave 参数生效,MySQL 必须是在启用 NUMA 的 Linux 系统上编译安装。从 MySQL 5.7.17 开始,CMake 编译软件新增了 WITH_NUMA 参数,可以在支持 NUMA 的 Linux 系统上编译 MySQL。需要注意 innodb_numa_interleave 参数在 MySQL5.7.17 的二进制包中是不支持的。

经过测试:

1.系统若不支持 numa,-DWITH_NUMA=ON 会导致 CMake 编译失败;

2.MySQL5.7.19+ 的免编译的二进制包开始支持 innodb_numa_interleave 参数。

关于 NUMA 的小建议

若是专用的 MySQL 服务器,可以关闭直接在 BIOS 层或者 OS 内核层关闭 NUMA;

若希望其他进程使用 NUMA 特性,可以选择合适的 MySQL 版本开启 innodb_numa_interleave 参数。

关于 NUMA 的小误区:
numactl 命令未找到,numa 就是未开启吗?
不是,numactl 是 Linux 提供的一个对 NUMA 进行手工调优的命令(默认不安装),可以用 numactl 命令查看系统的 NUMA 状态和对 NUMA 进行控制。

参考资料:

"The MySQL “swap insanity” problem and the effects of the NUMA architecture":
https://blog.jcole.us/2010/09/28/mysql-swap-insanity-and-the-numa-architect

"A brief update on NUMA and MySQL": https://blog.jcole.us/2012/04/16/a-brief-update-on-numa-and-mysql/
https://www.kernel.org/doc/html/v4.18/vm/numa.html
http://mysql.taobao.org/monthly/2015/07/06/
http://www.dtcms.com/a/315931.html

相关文章:

  • MySQL 在麒麟系统上部署使用 + DBeaver 远程连接 + SQL 数据导入完整流程
  • 华为云代理商的作用与价值解析
  • 嵌套路由配置(React-Router5)
  • Android原生项目集成Flutter模块极简指南
  • 使用buildx构建镜像
  • 若依前后端分离版学习笔记(五)——Spring Boot简介与Spring Security
  • [驱动开发篇] Can通信进阶 --- CanFD 的三次采样
  • Chisel芯片开发入门系列 -- 18. CPU芯片开发和解释8(流水线架构的代码级理解)
  • 深度学习-卷积神经网络CNN-填充与步幅
  • AR文旅新纪元:从黄姚古镇到秦始皇陵,虚实共生的沉浸式体验革命
  • 华为云云产品的发展趋势:技术创新驱动数字化未来
  • 基于Docker的RabbitMQ运行参数设置
  • 基于华为开发者空间的Open WebUI数据分析与可视化实战
  • 光伏清洗机器人是什么?艾利特协作机器人如何重塑新能源运维效率
  • 【18】C实战篇——C语言 文件读写【fputc、fgetc、fputs、fgets】
  • FPGA学习笔记——简易的DDS信号发生器
  • 力扣106:从中序与后序遍历序列构造二叉树
  • Android 之 Kotlin 和 MVVM 架构的 Android 登录示例
  • 宝塔(免费版9.2.0)的docker拉取仓库失败的加速方法
  • 数据挖掘,到底是在挖掘什么?
  • 27-数据仓库与Apache Hive-2
  • 26-数据仓库与Apache Hive
  • LTR-308ALS-01 LiteOn光宝高精度光耦隔离器 5000Vrms持续隔离电压
  • Python-初学openCV——图像预处理(七)——亮度变换、形态学变换
  • 基于Flask的微博话题多标签情感分析系统设计
  • 李宏毅深度学习教程 第12-13章 对抗攻击 + 迁移学习transfer learning
  • NLP——BERT模型全面解析:从基础架构到优化演进
  • Idea无法识别Maven项目处理
  • 机器翻译的局限性:歧义、文化差异、专业术语翻译难题
  • Python-深度学习--1交叉熵损失函数