mysql5.7.9+支持的新参数innodb_numa_interleave

        你们都知道,在运行mysql服务的服务器上,linux系统的内存numa特性是强烈建议关闭的。由于这种特性很容易引发内存泄漏的状况:即发现物理内存还有剩余,可是系统已经开始使用swap内存。php

        numa内存特性:好比一台机器是有2个处理器,有4个内存块。咱们将1个处理器和两个内存块合起来,称为一个NUMA node,这样这个机器就会有两个NUMA node。在物理分布上,NUMA node的处理器和内存块的物理距离更小,所以访问也更快。好比这台机器会分左右两个处理器(cpu1, cpu2),在每一个处理器两边放两个内存块(memory1.1, memory1.2, memory2.1,memory2.2),这样NUMA node1的cpu1访问memory1.1和memory1.2就比访问memory2.1和memory2.2更快。因此使用NUMA的模式若是能尽可能保证本node内的CPU只访问本node内的内存块,那这样的效率就是最高的。node

        其实因为mysql数据库服务器通常只会部署mysql一种服务在运行,而不会部署若干应用在运行。因此通常是但愿mysql是独占整个服务器的资源(剔除留给操做系统运行的资源)。因此根据这种业务特性,mysql服务器上是不建议开启numa内存特性。mysql

        那若是关闭numa特性呢?linux

        一、BLOS层面:sql

        因为不一样系统之间各类BLOS类型的区别,设置各有不一样。这里再也不展开。数据库

        二、操做系统层面:服务器

        能够直接在/etc/grub.conf的kernel行最后添加numa=off。ide

        三、MySQL层面:spa

        直接修改启动脚本:操作系统

        numactl --interleave=all mysqld --defaults-file=/etc/my.cnf &

        四、设置innodb_numa_interleave参数:

        MySQL5.7.9版本+,新增了参数innodb_numa_interleave。根据官方文档的描述:当设置innodb_numa_interleave=1的时候,对于mysqld进程的numa内存分配策略设置为MPOL_INTERLEAVE,而一旦Innodb buffer pool分配完毕,则策略从新设置回MPOL_DEFAULT。固然这个参数是否生效,必须创建在mysql是在支持numa特性的linux系统上编译的基础上。

        在MySQL5.7.17版本+, CMake编译软件新增了WITH_NUMA参数,能够在支持numa特性的linux系统上编译mysql。

注:innodb_numa_interleave目前在mysql5.7.17的二进制包是不支持的,详细的bug信息:https://bugs.mysql.com/bug.php?id=80288 。若是须要规避这种状况,建议下载源码包,直接在系统上进行mysql编译。

相关文章
相关标签/搜索