openGauss+鲲鹏920 TPCC 150w跑分
发表于 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半小时运行结果



