NUMA优化技术是针对数据库在NUMA架构CPU上运行时出现的资源消耗不均、并发场景下远端Node时延较高等问题进行优化的技术。GBase 8c数据库通过设置执行线程与Node节点的亲和度,可以将线程绑定在指定的CPU核心运行,从而避免跨Node调度,降低远端访问时延,提升数据库对外处理性能。同时,线程通过Node分配本地内存,也避免了某个Node节点内存耗尽而其他Node节点内存空闲的情况,充分使用CPU、内存等资源,从而提升数据库对外处理性能。

在多核CPU中合理调度线程,可以获得更高的性能。这当中,每个线程处理的任务优先级是不一样的,对于要求实时性比较高的线程或者是主线程,对于这种线程,我们可以在创建线程时指定其绑定到某个CPU核上,以后这个核就专门处理该线程。这样可以使得该线程的任务可以得到较快的处理,特别是和用户直接交互的任务,较短的响应时间可以提升用户的体验感。

目前GBase 8c支持在ARM服务器平台进行绑核操作。绑核参数设置步骤如下:

(1)安装GBase 8c数据库(这里就不提了)

(2)停止数据库,执行gha_ctl stop all -l http://dcs:2379。这个dcs IP如果不清楚的话,翻出安装yml文件看看。

(3)使用gs_guc工具修改数据库端口、IP等。

(4)使用gs_guc工具设置如下参数。

advance_xlog_file_num = 100
numa_distribute_mode = 'all'
thread_pool_attr = '464,4,(cpubind:1-27,32-59,64-91,96-123)'
xloginsert_locks = 16
wal_writer_cpu=0
wal_file_init_num = 20
xlog_idle_flushes_before_sleep = 500000000
pagewriter_sleep = 10ms

(5)执行如下命令以绑核方式启动服务端数据库。

numactl -C 1-27,32-59,64-91,96-123 gaussdb --single_node -D /data1/gaussdata  -p 3625 &

其中0核用于wal_writer、1-27、32-59、64-91、96-123表示使用111个核运行TPC-C程序,其余的16个核用来处理服务端的网络中断。

(6)执行如下命令,将客户端CPU的48个核与网卡中断队列进行绑定:

sh bind_net_irq.sh 48

服务器端绑核设置

(1)业务进程在运行过程中,硬件上报的网络中断会导致频繁的上下文切换,严重影响效率,因此需要将网络中断和业务分开绑定在不同的核上运行

(2)当前数据库中引入了线程池机制,即数据库启动时,线程池将创建指定数目的线程来服务,线程在创建时会进行绑核,因此需要将网卡的绑核信息通过 GUC 参数传入,方便运行期间绑核设置。以128核为例,对应参数如下图

GBase 8c NUMA绑核调优实操_IP

其中线程总数为(cpu总数128 - 处理网络的cpu数目16)* 每个核上线程数(经验值推荐7.25) = (128-16)*7.25 = 812,numa节点数为4,处理中断的核数为16。

这个位置cn和dn可以分开绑核,例如环境是96核,网卡中断绑核16

gs_guc reload -Z coordinator -N all -I all  -c "thread_pool_attr='240,4,(cpubind:1-19,24-43,48-67,72-91)'"
gs_guc reload -Z datanode -N all -I all  -c "thread_pool_attr='320,4,(cpubind:1-29,24-43,48-67,72-91)'"

其中每个核上的线程数可以适当调整看下效果。
TPC-C客户端绑核设置

客户端通过 numactl 将客户端绑定在除网卡外的核上,下图以 128 核环境举例,共80个核用于处理业务逻辑,剩余48个核处理网络中断。

GBase 8c NUMA绑核调优实操_客户端_02

对应TPC-C测试程序应该使用为:

numactl –C 0-19,32-51,64-83,96-115 ./runBenchmark.sh props.gbase