目前主流服务器都支持NUMA架构,我们可以通过命令numactl --hardware查看,如图:
在这里,NUMA架构把CPU逻辑上划分为两个节点node0和node1,每个节点上分配4核CPU、16G内存。
NUMA默认策略:内存优先分配给node0,当InnoDB_Buffer_Pool设置为22G时,node0使用完本地内存,此时就应该使用node1节点的内存,但它宁可使用SWAP,也不会选择node1,所以这里就会出现剩余内存还有很多,但却使用到了SWAP,导致数据库性能出现抖动。
针对这个问题,Percona做了改善,只需在my.cnf里,加上
[mysqld_safe] numa_interleave = 1
调整策略为交叉分配模式,使每个节点都承载均衡的内存分配。
如果你的版本是官方的,启动MySQL时用命令:
numactl --interleave=all mysqld_safe --defaults-file=/etc/my.cnf --user=mysql &