---
title: openGauss+鲲鹏920 TPCC 150w跑分-官方技术文章-鲲鹏社区
description: 介绍基于鲲鹏920与openGauss 7.0的TPCC 150万订单压测流程，涵盖环境配置、BenchmarkSQL部署、TPCC数据导入、性能调优参数设置及结果分析，重点优化数据库连接、内存、WAL等核心参数以提升TPCC吞吐量。
keywords: Gauss,TPCC,跑分,官方技术文章,鲲鹏社区,鲲鹏,准备,BenchmarkSQL
url: https://www.hikunpeng.com/developer/techArticles/20260624-1?envFlag=1
section: (其他)
---

# openGauss+鲲鹏920 TPCC 150w跑分-官方技术文章-鲲鹏社区

URL: https://www.hikunpeng.com/developer/techArticles/20260624-1?envFlag=1
描述: 介绍基于鲲鹏920与openGauss 7.0的TPCC 150万订单压测流程，涵盖环境配置、BenchmarkSQL部署、TPCC数据导入、性能调优参数设置及结果分析，重点优化数据库连接、内存、WAL等核心参数以提升TPCC吞吐量。
关键词: Gauss,TPCC,跑分,官方技术文章,鲲鹏社区,鲲鹏,准备,BenchmarkSQL

官方技术文章 [了解详情](https://www.hikunpeng.com/zh/developer/techArticles)

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.5TPCC半小时运行结果

本页内容
