开发者
资源
openGauss+鲲鹏920 TPCC 150w跑分

openGauss+鲲鹏920 TPCC 150w跑分

openGauss鲲鹏处理器

发表于 2026/06/24

0

openGauss+鲲鹏920 TPCC 150w跑分

软硬件参考环境如下:

类型

配置

CPU

HUAWEI Kunpeng 920 7260

内存

1024GB

操作系统

openEuler 24.03 LTS-SP1

数据库

openGauss 7.0.0-RC3

压测工具

BenchmarkSQL 5.0

客户端

openGauss88

服务端

openGauss70

本文采用客户端和服务端分离的方式:

openGauss88:运行 BenchmarkSQL,作为压测客户端

openGauss70:运行 openGauss,作为数据库服务端

一、准备 BenchmarkSQL5.0

首先在客户端机器 openGauss88 上准备 BenchmarkSQL。

假设 BenchmarkSQL 安装包为:

benchmarksql-5.0.tar.gz

进入安装包所在目录,执行解压:

tar -zxvf benchmarksql-5.0.tar.gz

解压后进入目录:

cd benchmarksql-5.0

BenchmarkSQL 是 Java 工具,需要本机已经安装 JDK 和 ant。可以先检查:

java -version

ant -version

如果这两个命令都能正常输出版本信息,说明环境基本可用。

BenchmarkSQL 默认使用 PostgreSQL JDBC 驱动,但 openGauss 建议替换为 openGauss 官方适配的 JDBC 包。

下载 openGauss 对应版本的 JDBC 包,获取路径为openGauss-x.x.x-JDBC .tar.gz,例如:

openGauss-JDBC-7.0.0-RC3.tar.gz

解压:

tar -zxvf openGauss-JDBC-7.0.0-RC3.tar.gz

解压后可以得到类似下面的 jar 包:

postgresql.jar

将 BenchmarkSQL 原有的 PostgreSQL JDBC jar 替换掉。

在 BenchmarkSQL 根目录执行:

cd /your/path/benchmarksql-5.0

ant

如果编译成功,一般会看到类似:

BUILD SUCCESSFUL

二、在 openGauss 服务端创建 TPCC 数据库

接下来在服务端机器 openGauss70 上操作。

先切换到数据库用户,例如本文使用的是 wangzc:

su - wangzc

登录 openGauss:

gsql -d postgres -p 5436 -U wangzc -W

创建 TPCC 测试库:

CREATE DATABASE tpcc;

查看数据库是否创建成功:

\l

退出 gsql:

\q

因为 BenchmarkSQL 在 openGauss88 上运行,而数据库在 openGauss70 上,设置openGauss允许客户端 IP 访问。

本文假设:

服务端 openGauss70 IP:20.20.20.232

客户端 openGauss88 IP:20.20.20.88

数据库端口:5436

1. 修改 listen_addresses


在服务端 openGauss70 上执行:

gs_guc set -D $PGDATA -c "listen_addresses='localhost,20.20.20.232'"

这里的 20.20.20.232 要换成你服务端实际 IP。

2. 修改 pg_hba.conf


编辑配置文件:

vim $PGDATA/pg_hba.conf

加入客户端访问规则:

host all all 20.20.20.88/32 sha256

如果你的数据库用户使用的是 md5 认证,则写成:

host all all 20.20.20.88/32 md5

这里的 20.20.20.88 要换成你客户端机器的实际 IP。

3. 重启数据库

执行:

gs_ctl restart -D $PGDATA

查看数据库状态:

gs_ctl query -D $PGDATA

正常情况下应看到:

local_role : Normal

db_state : Normal

4. 在客户端验证远程连接

回到客户端机器 openGauss88,测试能否远程连上数据库:

gsql -h 20.20.20.232 -p 5436 -d tpcc -U wangzc -W

如果可以正常进入 gsql,说明远程连接配置成功。

三、导入 TPCC 测试数据

进入客户端 openGauss88 的 BenchmarkSQL run 目录:

cd /your/path/benchmarksql-5.0/run

复制一份独立配置文件:

cp props.pg props.opengauss.1000w

编辑配置文件:

vim props.opengauss.1000w

参考配置如下:

db=postgres

driver=org.postgresql.Driver

conn=jdbc:postgresql://20.20.20.232:5436/tpcc?prepareThreshold=1&batchMode=on&fetchsize=10

user=wangzc

password=你的数据库密码

warehouses=1000

loadWorkers=32

terminals=696

runTxnsPerTerminal=0

runMins=5

limitTxnsPerMin=0

terminalWarehouseFixed=false

newOrderWeight=45

paymentWeight=43

orderStatusWeight=4

deliveryWeight=4

stockLevelWeight=4

resultDirectory=my_result_%tY-%tm-%td_%tH%tM%tS

# 先关闭 OS 采集,等压测流程跑通后再打开

#osCollectorScript=./misc/os_collector_linux.py

#osCollectorInterval=1

#osCollectorSSHAddr=osuser@20.20.20.232

#osCollectorDevices=net_enp3s0 blk_nvme0n1 blk_nvme1n1 blk_nvme2n1 blk_nvme3n1

需要重点修改的地方有:

参数

含义

示例

conn

数据库连接地址

jdbc:postgresql://20.20.20.232:5436/tpcc?...

user

数据库用户名

wangzc

password

数据库密码

按实际填写

warehouses

TPCC 仓库数

1000

loadWorkers

导数并发 worker

32

terminals

压测并发终端数

696

runMins

正式压测时长

5

resultDirectory

结果目录

自动生成结果目录

注意:如果 BenchmarkSQL openGauss 不在同一台机器,conn 里不能写 localhost,必须写数据库服务端 IP

确认数据库已经启动,并且客户端可以远程连接后,在客户端 openGauss88 上执行导数。

进入 BenchmarkSQL run 目录:

cd /your/path/benchmarksql-5.0/run

执行:

./runDatabaseBuild.sh props.opengauss.1000w

这个脚本会完成以下事情:

1. 创建 TPCC 表

2. 导入 1000 仓数据

3. 创建索引

4. 创建约束

5. 完成数据初始化

四、启动 TPCC 压测

导数完成后,在客户端 openGauss88 上继续执行:

cd /your/path/benchmarksql-5.0/run

./runBenchmark.sh props.opengauss.1000w

压测过程中会输出每隔一段时间的事务执行情况。

压测结束后,结果会保存在配置文件中的结果目录下,例如:

my_result_2026-xx-xx_xxxxxx

进入结果目录查看:

ls -lh

重点关注结果中的:

tpmC:TPCC 标准关注的新订单事务吞吐

tpmTOTAL:所有事务类型合计吞吐

其中 TPCC 场景下,tpmTOTAL 通常会明显大于 tpmC,因为 BenchmarkSQL 中除了 NewOrder 事务,还包含 Payment、OrderStatus、Delivery、StockLevel 等事务。

五、TPCC性能调优

5.1 openGauss关键调优参数

下面是一组 TPCC 压测时使用的 openGauss 参数参考。建议在正式导数和压测前设置。

vim $PGDATA/postgresql.conf

参考参数如下:

修改完成后重启数据库:

gs_ctl restart -D $PGDATA



5.1.1 连接和并发参数

参数

含义

配置思路

max_connections

数据库最大连接数

要大于 BenchmarkSQL terminals,并预留管理连接

enable_thread_pool

是否开启线程池

高并发场景建议测试 on/off 两组

thread_pool_attr

线程池线程数、分组和 NUMA 绑定

必须结合机器 NUMA 拓扑配置

walwriter_cpu_bind

WAL writer 线程绑核

可减少 WAL 写线程调度抖动

本文 terminals 696,因此 max_connections=4096 是为了给压测连接和管理连接都留足空间。

如果 max_connections 太小,压测时可能报:

Too many clients already

5.1.2 内存参数

参数

含义

配置思路

shared_buffers

openGauss 共享缓冲区

可以设置为总内存的 20%30%左右

work_mem

单个算子可用内存

高并发下不宜过大

maintenance_work_mem

建索引、VACUUM 等维护操作内存

主要影响导数和建索引阶段

enable_huge_pages

是否使用大页

大内存场景可以开启,但要配合系统 hugepage

需要注意的是,work_mem 不是整个数据库共用的,而是可能被每个连接、每个算子使用。高并发场景下,如果 work_mem 设置过大,可能导致内存压力快速上升。

5.1.3 WAL 和写入参数

参数

含义

配置思路

wal_buffers

WAL 缓冲区

写密集场景可以适当调大

enable_double_write

是否开启双写保护

为保证数据安全,建议开启

xloginsert_locks

WAL 插入锁数量

高并发写入场景可适当调大

wal_file_init_num

WAL 文件预初始化数量

减少运行期间频繁初始化 WAL 文件的开销

TPCC 是写事务比例较高的场景,WAL 压力通常比较明显,因此 WAL 相关参数和 WAL 分盘都比较重要。

5.2 系统内核参数

系统内核参数参考:

net.ipv4.tcp_max_tw_buckets = 10000

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_keepalive_time = 30

net.ipv4.tcp_keepalive_intvl = 30

net.ipv4.tcp_retries2 = 12

net.core.wmem_max = 21299200

net.core.rmem_max = 21299200

net.core.wmem_default = 21299200

net.core.rmem_default = 21299200

net.ipv4.tcp_rmem = 8192 250000 16777216

net.ipv4.tcp_wmem = 8192 250000 16777216

net.core.netdev_max_backlog = 65535

net.ipv4.tcp_max_syn_backlog = 65535

net.core.somaxconn = 65535

kernel.sem = 250 6400000 1000 25600

vm.min_free_kbytes = 52762283

vm.nr_hugepages = 800

kernel.shmall = 1152921504606846720

kernel.shmmax = 18446744073709551615

net.ipv4.ip_local_reserved_ports = 14989-14996,15389-15396

net.core.gro_normal_batch = 1

使配置生效:

sysctl --system

查看大页配置是否生效:

grep -i huge /proc/meminfo

可以关注:

HugePages_Total

HugePages_Free

Hugepagesize

5.3 网络绑核

TPCC 压测时,客户端会持续向服务端发送大量请求。如果网卡中断随机跑到数据库工作线程所在 CPU 上,可能会和 gaussdb 抢 CPU,导致压测结果波动。因此,建议把服务端网卡 IRQ 绑定到预留 CPU 上。

DEV="enp4s0"

CORES=(29 30 31 61 62 63 93 94 95 125 126 127)

echo "Start binding IRQ for device: $DEV"

if [ ! -d /sys/class/net/$DEV ]; then

   echo "ERROR: network device $DEV not found"

   exit 1

fi

IRQS=$(grep "$DEV" /proc/interrupts | awk -F: '{print $1}' | tr -d ' ')

if [ -z "$IRQS" ]; then

   echo "ERROR: no IRQ found for device $DEV"

   exit 1

fi

echo "Found IRQs: $IRQS"

i=0

for irq in $IRQS

do

   core=${CORES[$((i % ${#CORES[@]}))]}

   if [ -f /proc/irq/$irq/smp_affinity_list ]; then

       echo $core > /proc/irq/$irq/smp_affinity_list

       echo "bind irq $irq to cpu $core"

   else

       echo "WARN: /proc/irq/$irq/smp_affinity_list not found"

   fi

   i=$((i+1))

done

echo "IRQ binding finished."

5.4 数据库分盘

TPCC 中写事务比例较高,WAL 写入非常频繁。如果 WAL 和数据目录放在同一块盘上,容易产生 IO 竞争。因此可以将 WAL 单独拆到另一块盘,例如本文将 WAL 拆到 /data2。

1. 停止数据库

迁移 WAL 前必须先停库:

gs_ctl stop -D $PGDATA

确认数据库已经停止:

ps -ef | grep gaussdb

2. 创建 WAL 目标目录

mkdir -p /data2/opengauss_wangzc/pg_xlog

chown -R wangzc:wangzc /data2/opengauss_wangzc

chmod 700 /data2/opengauss_wangzc/pg_xlog

3. 迁移原 WAL 文件

确认 $PGDATA/pg_xlog 存在:

ls -lh $PGDATA/pg_xlog

迁移 WAL 文件:

mv $PGDATA/pg_xlog/* /data2/opengauss_wangzc/pg_xlog/

4. 创建软链接

删除原目录:

rmdir $PGDATA/pg_xlog

创建软链接:

ln -s /data2/opengauss_wangzc/pg_xlog $PGDATA/pg_xlog

检查软链接:

ls -ld $PGDATA/pg_xlog

正常情况下应看到类似:

pg_xlog -> /data2/opengauss_wangzc/pg_xlog

5. 启动数据库

gs_ctl start -D $PGDATA

5.5 TPCC半小时运行结果



本页内容