很多时候,我们测试mysql性能,开启mysqld_multi功能,开多个mysql实例,同时使用numa工具绑定cpu,内存资源,防止多个mysql实例间资源竞争,影响性能,或者测试数据

mysqld_multi功能的开启在其他文章中已经介绍,这里主要讲的是numa绑定系统资源,

在新版本的linux内核中,已经很好的支持了numa功能,

命令行输入numactl可以看到一些numa信息

#numactl

 

usage: numactl [--interleave=nodes] [--preferred=node]

               [--physcpubind=cpus] [--cpunodebind=nodes]

               [--membind=nodes] [--localalloc] command args ...

       numactl [--show]

       numactl [--hardware]

       numactl [--length length] [--offset offset] [--shmmode shmmode]

               [--strict]

               [--shmid id] --shm shmkeyfile | --file tmpfsfile

               [--huge] [--touch] 

               memory policy | --dump | --dump-nodes

 

memory policy is --interleave, --preferred, --membind, --localalloc

nodes is a comma delimited list of node numbers or A-B ranges or all.

cpus is a comma delimited list of cpu numbers or A-B ranges or all

all ranges can be inverted with !

all numbers and ranges can be made cpuset-relative with +

the old --cpubind argument is deprecated.

use --cpunodebind or --physcpubind instead

length can have g (GB), m (MB) or k (KB) suffixes

 

介绍几个重要参数
–interleave=all 这是使用交叉分配模式启动一个程序,也就是说程序可以随意跨节点用其他节点的内存,传说中这是效率最高的关闭NUMA特性的方法,只是传说。
–cpunodebind=node 这是把程序绑定在指定的node节点上运行,即使另一个物理节点是idle的,也不会去使用。
–localalloc 严格控制只在节点内分配内存,禁止分配其他节点下的内存到当前节点运行的程序。

从上面的信息可以看到numa主要的功能模块,系统本身会划分numa节点

命令行输入numactl --hardware查看当前系统节点信息

 

node 0 cpus: 0 2 4 6

node 0 size: 65490 MB

node 0 free: 24447 MB

node 1 cpus: 1 3 5 7

node 1 size: 65536 MB

node 1 free: 16050 MB

node distances:

node   0   1 

  0:  10  20 

  1:  20  10 

 

可以看到numa节点是2个,cpu物理节点是8个

现在我们绑定资源,两颗cpu,每颗4个物理节点,那么我们开4个mysql实例,每个实例绑定2个cpu物理节点

numactl --physcpubind=0,3 --localalloc  mysqld_multi --defaults-extra-file=/etc/mysqld_multi.cnf start 1

我们看下这个语句,--physcpubind 指定绑定的cpu节点,--localalloc表示使用内存方式,不交叉,以免降低性能,mysqld_multi是mysql实例启动命令

同样我们还可以做其他划分,绑定内存节点,划分I/O等等,

numa是个很好很强大的工具,使用非常简单。