为使南大通用GBase 8c在TPC-C标准测试中达到极优性能,我们需要从以下几方面入手,了解硬件资源,有效利用硬件资源;查看操作系统,不应该对硬件资源使用有限制;合理利用网络,使得网络发挥最大优势;调整数据库参数,使其更好的适应TPC-C业务模型。

性能测试是将硬件资源利用到极致,让网络、硬盘不是瓶颈,尽最大程度使用CPU。CPU尽可能都是被user占用,尽可能减少sys使用,CPU使用率在95%以上。在使用perf top监控查看函数使用CPU时间都低于5%,无热点函数。

1. 了解硬件资源

登录到数据库部署所在机器,了解CPU、内存、硬盘类型、网络情况。

(1)了解CPU,理解服务器这台大脑跑得有多快。来了解一下它的构造:

通过lscpu命令,查看硬件CPU架构:

Architecture:显示架构类型,例如:arrch64、x86_64。

CPU MHz:为CPU的主频,单核跑得快慢,由这个参数决定。

NUMA nodeX CPU(S):显示CPU核与NUMA节点之间的关系。

(2)了解内存,理解服务器短期记忆容量大小

通过free –g命令,获取内存大小信息,例如:

南大通用GBase 8c基于TPCC测试的性能调优_数据库

通过numactl -H命令,获取CPU与内存的对应关系,例如:

南大通用GBase 8c基于TPCC测试的性能调优_服务器_02

测试过程中尽量每个CPU使用自己numa节点上的内存,避免出现跨内存访问的问题。

(3)了解硬盘,理解存储的大小及存取速度

首先了解磁盘大小,通过lsblk显示硬件。

lsblk -d -o NAME,SIZE,ROTA

其中ROTA列显示的是硬盘的旋转属性,值为1表示是HDD(机械硬盘),值为0表示是SSD(固态硬盘)。

性能测试尽量选择NVME SSD,然后SSD,最后HDD。

(4)了解网络,理解通讯速度

通过ip a命令找到万兆网络IP对应的网卡,然后使用ethtool 网卡名称命令,得到网卡速度Speed:xxxxMb/s。

性能测试优先使用万兆网络,没有万兆网络则使用本机。

2. 操作系统相关优化

(1)检查已经配置为性能模式

cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor

如果显示为performance表示为性能模式,如果为其它如“powersave”则表示为省电模式,性能测试需要切换成性能模式。

(2)irq balance 关闭 

在计算机中,CPU中断是处理器用来响应硬件事件(如网络流量、磁盘I/O等)的机制。中断会暂停当前处理的任务,去处理紧急任务(中断处理程序)。如果所有中断都由单个 CPU 核心处理,这个核心可能会负载过重,导致性能瓶颈。这种情况在多核处理器系统中尤为明显,因为一个核心可能被过多的中断所占用,而其他核心可能处于空闲或低负载状态。irqbalance 是一个Linux服务,它的作用是自动均衡系统中断负载,将中断分配到多个 CPU 核心上,以避免某个 CPU 核心负载过重,从而提升整体系统性能。

关闭 irqbalance 服务意味着中断将不再被自动分配到多个CPU核心上,可能会导致某些核心处理更多的中断,导致负载不均衡和性能下降。在某些特定场景下(例如实时系统中需要严格控制中断分配),手动管理中断可能比使用 irqbalance 更合适。本文即采用手动的方式去管理网卡中断,因此需要关闭irq balance服务。

关闭CPU中断的服务irqbalance操作如下:

service irqbalance stop 
echo 0 > /proc/sys/kernel/numa_balancing

(3)关闭透明大页

虽然透明大页在提高内存访问性能和降低内存管理开销方面具有显著的优势,尤其对内存密集型应用程序有明显的性能提升。然而,它也带来了内存碎片化、潜在的性能下降以及调试复杂性等问题。因此,是否启用透明大页需要根据具体的工作负载和系统环境进行评估。本文即采用关闭透明大页的方式进行测试,关闭大页的方式如下:

echo 'never' > /sys/kernel/mm/transparent_hugepage/enabled 
echo 'never' > /sys/kernel/mm/transparent_hugepage/defrag

(4)关闭防火墙

service firewalld stop

(5)调节 limit 资源限制

nofile表示一个用户能够同时打开的文件描述符(file descriptors)的最大数量。文件描述符不仅仅包括文件,还包括网络连接、管道等一切可被视为文件的资源。

nproc表示一个用户能够同时创建的进程数的最大值,包括所有类型的进程。

在高负载服务器上(例如大规模 Web 服务器或数据库服务器),需要处理大量并发连接和进程,适当提高 nofile 和 nproc 的限制,可以确保服务器能够在高负载下正常运行。

修改/etc/security/limits.conf 文件,断开会话重连生效。

vim /etc/security/limits.conf 
--配置如下参数:
* hard nofile 1024000 
* hard nproc 1024000 
* soft nofile 1024000 
* soft nproc 1024000

3. 网络中断相关优化

在传统的大型对称多处理系统中,比较容易编写和维护多线程程序,因为所有的处理器都可以访问相同的资源。然而,随着系统规模的扩大,一些问题,如内存总线瓶颈,可能成为性能挑战。NUMA(Non-Uniform Memory Access)系统是对这种问题的一种改进,通过分割内存并使用多个节点来提高性能。在 NUMA 架构中,系统中的不同部分(通常是处理器和内存)被分为多个节点,每个节点都有一定数量的处理器和内存,并且节点之间通过互联网络连接。这种互联网络用于在节点之间传递数据和实现通信。每个节点的本地内存访问速度比远程节点的内存访问速度更快,这导致了非一致性内存访问的特性。该特性具有如下特征:

  • 节点(Node):系统内的每个节点包含一组处理器和相应的本地内存。每个节点都与其他节点连接,通过互联网络进行通信。
  • 非一致性内存访问(NUMA):不同节点上的内存访问延迟可能会有所不同。在 NUMA 架构中,一个处理器访问本地节点的内存速度会比访问远程节点的内存速度更快。这种非一致性导致了内存访问的性能差异。
  • 内存局部性:程序在访问本地节点的内存时性能更好,因此设计程序以最大程度地利用内存局部性是 NUMA 架构中的一个优化目标。
  • 亲和性(Affinity):在 NUMA 系统中,进程或线程通常被绑定到特定的节点,以便最大程度地减少访问远程内存的需求。这被称为亲和性设置。
  • NUMA 感知调度:操作系统和调度器可能会采用 NUMA 感知的调度策略,确保将任务调度到其数据所在的节点,以提高性能。

NUMA 架构通常用于构建大型对称多处理系统(应用程序的执行需要服务器上有多个处理器和大量内存),尤其是那些需要处理大量内存的应用程序,例如数据库和科学计算。本文使用的测试服务器即为具有NUMA架构的鲲鹏920处理器,具有128个CPU核心、4个NUMA节点,测试时手动绑定16个CPU核心(每个NUMA上绑定4个CPU核心)到万兆网卡专门用于处理网卡中断相关逻辑。

# ./bind_net_irq.sh CPU核心数 数据网卡名称
./bind_net_irq.sh 16 enp131s0f0

绑定后可使用如下命令查看网卡绑定信息

# ethtool -l 数据网卡名称
ethtool -l  enp131s0f0

4. 数据库参数相关优化

数据库参数的合理设置对数据库整体性能的提升起到非常重要的作用。对于TPCC场景主要用到的性能优化参数有如下几个:

  • work_mem:设置内部排序操作和Hash表在开始写入临时磁盘文件之前使用的内存大小,适当增大该参数可以减少与磁盘之间的IO交互。
  • maintenance_work_mem:设置在维护性操作(比如VACUUM、CREATE INDEX、ALTER TABLE 、ADD FOREIGN KEY等)中可使用的最大内存,该参数的设置会影响维护性操作的执行效率。
  • max_process_memory:设置数据库节点可用的最大物理内存,根据操作系统来设置该参数,建议使用80%左右的服务器内存给到数据库使用。
  • shared_buffers:设置数据库使用的共享内存大小,增加此参数的值会使数据库比系统默认设置需要更多的内存,对提高数据库的整体性能有较好效果,建议设置为max_process_memory的60%左右。
  • enable_thread_pool:开启数据库系统内部的线程池,对线程的调度和资源的使用有改善效果,参数值分为off和on。
  • thread_pool_attr:设置线程池属性,该参数在enable_thread_pool参数为on的状态下生效。该参数分为3部分,thread_num、group_num、cpubind_info:

thread_num:线程池中的线程总数,取值范围是0-4096,其中0的含义是数据库根据系统cpu core的数量来自动配置线程池的线程数;如果大于0,线程池中的线程数等于thread_num;线程数推荐根据硬件配置设置,一般设置为cpu核心数的3-5倍,thread_num最大值为4096。

group_num:线程池中的线程分组个数,取值范围是0-64,其中0的含义是数据库根据系统NUMA的个数来自动配置线程池的线程分组个数,如果大于0,线程池中线程组的个数等于group_num。

cpubind_info:线程池是否绑核的配置参数,可选择的配置方式有以下几种:

1)nobind:线程不绑核

2)allbind:利用当前系统所有能查询到的cpu core做线程绑核

3)nodebind:1,2:利用NUMA组1,2中的cpu core进行绑核

4)cpubind:0-30:利用0-30号cpu进行绑核

5)numabind:0-30:在NUMA组内利用0-30号cpu进行绑核

一般情况下常用cpubind进行绑核,举例:

thread_pool_attr=’812,4,(cpubind:0-27,32-59,64-91,96-123)’

思路:每个numa节点分配出4个cpu处理网卡中断函数,剩余的分给数据库。在tpcc压测过程中监控系统资源及热点函数,perf top全程不能有操作5%的热点函数。

以上通过硬件、操作系统、网络中断等方面的优化,以及GBase 8c本身数据库参数的优化,可以为GBase 8c TPCC性能测试实现优化。