GBase 8a数据库集群NUMA导致CPU的SYS占用高的原因分析

x86架构下的数据库服务器,包括GBase8a集群服务器,需要关闭NUMA参数(vm.zone_reclaim_mode),避免CPU的SYS占用高。

NUMA(Non-Uniform Memory Access)架构是为了解决多CPU下内存访问冲突,简单来说不在将整个物理内存作为一个整体,而是根据不同的CPU区分不同的内存块儿,如2颗CPU每颗CPU使用64G内存。
当NUMA参数zone_reclaim_mode在设置为1时,内核将要求多路CPU尽量从距离较近的系统内存节点(服务器的整体内存在numa架构下将被分成若干个节点)分配内存而不是在整个服务器可访问内存的范围内进行内存分配,因此在较高内存占用压力下内存申请会触发内存频繁回收整理的机制严重影响了系统整体性能(长期处于内核态sys很高)。进而可能导致SQL卡顿问题的发生。

NUMA参数的开关是在系统安装时动态设置的,通过判断各个cpu之间的distance(大概就是通讯耗时)>20 ,就打开NUMA参数,反之就不打开。
通过命令numactl --hardware 可以查看CPU和内存的距离,如下:
# numactl --hardware
available: 2 nodes (0-1)
node 0 cpus: 0 2 4 6 8 10 12 14
node 0 size: 57298 MB
node 0 free: 44157 MB
node 1 cpus: 1 3 5 7 9 11 13 15
node 1 size: 57344 MB
node 1 free: 41773 MB
node distances:
node 0 1
0: 10 20
1: 20 10

查看NUMA参数是否开启:
cat /proc/sys/vm/zone_reclaim_mode

设置NUMA参数关闭:
A、修改当前系统值
echo 0 > /proc/sys/vm/zone_reclaim_mode
B、修改或新增到配置文件/etc/sysctl.conf
vm.zone_reclaim_mode = 0