tpcc最常用的在线事务处理(OLTP)测试基准测试,近期在客户一套生产硬件上对YashanDB做了个简单的测试,下面介绍在YashanDB单机数据库上运行基于BenchmarkSQL的TPC-C测试(非极致性能优化)。
测试环境介绍
| 软件 | 版本 |
| YashanDB for ARM | 23.4.4.108 |
| BenchmarkSQL(测试工具) | 5.0 |
| JDK (java 编译benchmarkSQL) | 1.8 |
| 操作系统 BigCloud Enterprise Linux For Euler release | 22.10U2 LTS |
| ant: apache-ant (编译工具) | 1.9.15 |
CPU
# lscpu
Architecture: aarch64
CPU op-mode(s): 64-bit
Byte Order: Little Endian
CPU(s): 128
On-line CPU(s) list: 0-127
Vendor ID: HiSilicon
BIOS Vendor ID: HiSilicon
Model name: Kunpeng-920
BIOS Model name: Kunpeng920_7260
Model: 0
Thread(s) per core: 1
Core(s) per socket: 64
Socket(s): 2
Stepping: 0x1
BogoMIPS: 200.00
Flags: fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma dcpop asimddp asimdfhm
Caches (sum of all):
L1d: 8 MiB (128 instances)
L1i: 8 MiB (128 instances)
L2: 64 MiB (128 instances)
L3: 128 MiB (4 instances)
NUMA:
NUMA node(s): 4
NUMA node0 CPU(s): 0-31
NUMA node1 CPU(s): 32-63
NUMA node2 CPU(s): 64-95
NUMA node3 CPU(s): 96-127
Vulnerabilities:
Itlb multihit: Not affected
L1tf: Not affected
Mds: Not affected
Meltdown: Not affected
Mmio stale data: Not affected
Retbleed: Not affected
Spec store bypass: Not affected
Spectre v1: Mitigation; __user pointer sanitization
Spectre v2: Not affected
Srbds: Not affected
Tsx async abort: Not affected
内存
]# free -m
total used free shared buff/cache available
Mem: 514417 332205 132361 11 84336 182212
Swap: 8191 0 8191
磁盘
4块NvME本地盘,不存在RAID卡,直接主板,切4个pv做卷管理,条带4, 条带大小64KB, XFS文件系统
# fdisk -l
Disk /dev/nvme1n1: 2.91 TiB, 3200631791616 bytes, 6251233968 sectors
Disk model: MEMBLAZE P6547DT0320Y00
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/nvme2n1: 2.91 TiB, 3200631791616 bytes, 6251233968 sectors
Disk model: MEMBLAZE P6547DT0320Y00
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/nvme3n1: 2.91 TiB, 3200631791616 bytes, 6251233968 sectors
Disk model: MEMBLAZE P6547DT0320Y00
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/nvme0n1: 2.91 TiB, 3200631791616 bytes, 6251233968 sectors
Disk model: MEMBLAZE P6547DT0320Y00
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
# 创建卷组
pvcreate /dev/nvme0n1
pvcreate /dev/nvme1n1
pvcreate /dev/nvme2n1
pvcreate /dev/nvme3n1
vgcreate -s 128M vgdata /dev/nvme0n1 /dev/nvme1n1 /dev/nvme2n1 /dev/nvme3n1
# 逻辑卷
lvcreate -l +100%FREE -i 4 -I 64K -n lvdata /dev/vgdata
# 文件系统
mkfs.xfs /dev/vgdata/lvdata;
mkdir /data;
echo "/dev/vgdata/lvdata /data xfs defaults,noatime,nodiratime 0 0">>/etc/fstab;
mount -a;
操作系统内核参数
# cat /etc/sysctl.conf
kernel.sysrq=0
net.ipv4.ip_forward=0
net.ipv4.conf.all.send_redirects=0
net.ipv4.conf.default.send_redirects=0
net.ipv4.conf.all.accept_source_route=0
net.ipv4.conf.default.accept_source_route=0
net.ipv4.conf.all.accept_redirects=0
net.ipv4.conf.default.accept_redirects=0
net.ipv4.conf.all.secure_redirects=0
net.ipv4.conf.default.secure_redirects=0
net.ipv4.icmp_echo_ignore_broadcasts=1
net.ipv4.icmp_ignore_bogus_error_responses=1
net.ipv4.conf.all.rp_filter=1
net.ipv4.conf.default.rp_filter=1
net.ipv4.tcp_syncookies=1
kernel.dmesg_restrict=1
net.ipv6.conf.all.accept_redirects=0
net.ipv6.conf.default.accept_redirects=0
## kernel
kernel.sem = 4096 2147483647 2147483646 512000 #4096 每组多少信号量 2147483647 总共多少信号量 2147483646 每个semop()调用支持多少操作 (2^31-1) 512000 多少组信号量
kernel.msgmnb = 65536 #单位字节,单个队列的最大字节数
kernel.msgmni = 65536 #系统中同时运行的最大的消息队列message queue的个数
kernel.msgmax = 65536 #单位字节,单个消息的最大字节数
## net core
net.core.wmem_default = 4194304 #单位字节,socket缺省写缓冲大小,work_mem*2 单位为bytes work_mem默认为4M
net.core.wmem_max = 4194304 #单位字节,socket最大写缓冲大小
net.core.rmem_default = 4194304 #单位字节,socket缺省读缓冲大小
net.core.rmem_max = 4194304 #单位字节,socket缺省读缓冲大小
## vm
vm.dirty_ratio = 60 #用脏数据填充的聚堆最大系统内存量,所有数据会刷盘,会有io卡顿,但是会防止内存中有过量脏数据 脏页/(空闲内存页+可回收内存页)
vm.dirty_background_ratio = 20 #存可以填充脏数据的百分比,超过会有后台进程清理脏数据 #
vm.dirty_writeback_centisecs = 150 #指定多长时间kdmflush进程还行一次,单位秒(100表示1秒),比这个值老的脏页,将被刷到磁盘
vm.dirty_expire_centisecs = 150 #指定脏数据存活时间,单位秒(100表示1秒),pdflush(或其他)后台刷脏页进程的唤醒间隔
vm.min_free_kbytes = 12582912
vm.nr_hugepages = 146354
vm.swappiness = 0
vm.overcommit_memory = 2
vm.overcommit_ratio=90
数据库参数
我们仅用了生产可用参数,非极致性能测试,防止作弊。
# cat yasdb.ini
_CLUSTER_ID=72109ff53b9a84e73792104a188406c5
NODE_ID=1-1:1
CONTROL_FILES=('?/dbfiles/ctrl1', '?/dbfiles/ctrl2', '?/dbfiles/ctrl3')
SHARE_POOL_SIZE=2G
_REPLICATION_BUFFER_SIZE=128M
REDOFILE_IO_MODE=DIRECT
REDO_BUFFER_SIZE=128M
UNDO_SHRINK_ENABLED=TRUE
WORK_AREA_HEAP_SIZE=2M
DATE_FORMAT=yyyy-mm-dd hh24:mi:ss
ARCH_CLEAN_LOWER_THRESHOLD=0
CHECKPOINT_TIMEOUT=300
REDO_BUFFER_PARTS=12
RUN_LOG_LEVEL=INFO
STATISTICS_LEVEL=BASIC
_SPLIT_BRAIN_DATA_LIMIT=1024G
MAX_WORKERS=1000
RUN_LOG_FILE_PATH=/data/yashan/log/db-1-1/run
VM_BUFFER_SIZE=30G
_DATA_BUFFER_PARTS=12
_SESSION_RESERVED_CURSORS=64
LARGE_POOL_SIZE=4G
RECOVERY_PARALLELISM=64
REPLICATION_ADDR=10.120.247.69:1689
SLOW_LOG_FILE_PATH=/data/yashan/log/db-1-1/slow
ARCH_CLEAN_IGNORE_MODE=BACKUP
DATA_BUFFER_SIZE=200G
MAX_SESSIONS=2048
UNDO_RETENTION=15
_ARCHIVE_DELAY_TIME=600
ARCH_CLEAN_UPPER_THRESHOLD=1K
LISTEN_ADDR=10.120.247.69:1688
VM_BUFFER_PARTS=12
WORK_AREA_POOL_SIZE=2G
CGROUP_ROOT_DIR=/sys/fs/cgroup
CHECKPOINT_INTERVAL=10G
CHARACTER_SET=UTF8
TIME_ZONE = +08:00
USE_LARGE_PAGES = ONLY
SQL> select name,value,DEFAULT_VALUE from v$parameter where VALUE<>DEFAULT_VALUE;
NAME VALUE DEFAULT_VALUE
---------------------------------------------------------------- ---------------------------------------------------------------- ----------------------------------------------------------------
MAX_SESSIONS 2048 1024
MAX_WORKERS 1000 0
RUN_LOG_FILE_PATH /data/yashan/log/db-1-1/run ''
USE_LARGE_PAGES ONLY FALSE
DATA_BUFFER_SIZE 200G 256M
WORK_AREA_HEAP_SIZE 2M 512K
WORK_AREA_POOL_SIZE 2G 16M
REDO_BUFFER_SIZE 128M 64M
REDO_BUFFER_PARTS 12 8
LARGE_POOL_SIZE 4G 128M
VM_BUFFER_SIZE 30G 128M
UNDO_RETENTION 15 300
RECOVERY_PARALLELISM 64 16
CHECKPOINT_INTERVAL 10G 128M
LISTEN_ADDR 10.120.247.69:1688 0.0.0.0:1688
REDOFILE_IO_MODE DIRECT DSYNC
ARCH_CLEAN_UPPER_THRESHOLD 1K 16G
ARCH_CLEAN_LOWER_THRESHOLD 0 12G
ARCH_CLEAN_IGNORE_MODE BACKUP NONE
DATE_FORMAT yyyy-mm-dd hh24:mi:ss yyyy-mm-dd
STATISTICS_LEVEL BASIC TYPICAL
SHARE_POOL_SIZE 2G 320M
SLOW_LOG_FILE_PATH /data/yashan/log/db-1-1/slow ?/log/slow
下载BenchmarkSQL
- 请自行于BenchmarkSQL官网下载BenchmarkSQL5 (opens new window)。
- 请确保服务器中已有JDK1.8及以上版本的JDK。
Benchmark SQL修改对yashanDB的支持
注意这里仅修改软件的功能支持,不修改测试SQL。因为该软件未支持国内的数据库,这也是所有国产数据库测试的必要环节,注意不要动SQL, 在表结构上的作弊没有意义。
$ vi benchmarksql-5.0/src/client/jTPCC.java
if (iDB.equals("firebird"))
dbType = DB_FIREBIRD;
else if (iDB.equals("oracle"))
dbType = DB_ORACLE;
else if (iDB.equals("postgres"))
dbType = DB_POSTGRES;
else if (iDB.equals("yashandb")) --增加类型支持
dbType = DB_YASHANDB;
else
{
log.error("unknown database type '" + iDB + "'");
return;
}
$ vi benchmarksql-5.0/src/client/jTPCC.java
if (iDB.equals("firebird"))
dbType = DB_FIREBIRD;
else if (iDB.equals("oracle"))
dbType = DB_ORACLE;
else if (iDB.equals("postgres"))
dbType = DB_POSTGRES;
else if (iDB.equals("yashandb")) --增加类型支持
dbType = DB_YASHANDB;
else
{
log.error("unknown database type '" + iDB + "'");
return;
}
$ vi benchmarksql-5.0/src/client/jTPCCConfig.java
public interface jTPCCConfig
{
public final static String JTPCCVERSION = "5.0";
public final static int DB_UNKNOWN = 0,
DB_FIREBIRD = 1,
DB_ORACLE = 2,
DB_POSTGRES = 3,
DB_YASHANDB = 4;
ant 编译Benchmark
如果未安装ant,可yum安装。
$ cd benchmarksql-5.0
$ ant
Buildfile: /home/yashan/tpc-c/benchmarksql-5.0/build.xml
init:
compile:
[javac] Compiling 11 source files to /home/yashan/tpc-c/benchmarksql-5.0/build
dist:
[mkdir] Created dir: /home/yashan/tpc-c/benchmarksql-5.0/dist
[jar] Building jar: /home/yashan/tpc-c/benchmarksql-5.0/dist/BenchmarkSQL-5.0.jar
BUILD SUCCESSFUL
Total time: 1 second
创建文件props.yashandb
$ cd /home/yashan/tpc-c/benchmarksql-5.0/run
$ vi props.yashandb
db=yashandb
driver=com.yashandb.jdbc.Driver
conn=jdbc:yasdb://localhost:1688/yashandb
user=sys
password=sys
warehouses=1000
loadWorkers=32
terminals=384
runTxnsPerTerminal=0
runMins=10
limitTxnsPerMin=0
terminalWarehouseFixed=true
newOrderWeight=45
paymentWeight=43
orderStatusWeight=4
deliveryWeight=4
stockLevelWeight=4
resultDirectory=my_result_%tY-%tm-%td_%tH%tM%tS
osCollectorScript=./misc/os_collector_linux.py
osCollectorInterval=1
修改文件funcs.sh
$ vi benchmarksql-5.0/run/funcs.sh
function setCP()
{
case "$(getProp db)" in
firebird)
cp="../lib/firebird/*:../lib/*"
;;
oracle)
cp="../lib/oracle/*"
if [ ! -z "${ORACLE_HOME}" -a -d ${ORACLE_HOME}/lib ] ; then
cp="${cp}:${ORACLE_HOME}/lib/*"
fi
cp="${cp}:../lib/*"
;;
postgres)
cp="../lib/postgres/*:../lib/*"
;;
yashandb)
cp="../lib/yashandb/*:../lib/*"
;;
esac
添加yashandb java connector驱动
$ mkdir -p /home/yashan/tpc-c/benchmarksql-5.0/lib/yashandb/
$ cp /home/yashan/yashandb_jdbc/yashandb-jdbc-1.5-SNAPSHOT.jar /home/yashan/tpc-c/benchmarksql-5.0/lib/yashandb/
修改runDatabaseBuild.sh文件
$ vi benchmarksql-5.0/run/runDatabaseBuild.sh
# AFTER_LOAD="indexCreates foreignKeys extraHistID buildFinish"
AFTER_LOAD="indexCreates foreignKeys buildFinish"
清理、装载TPC-C数据
$ cd benchmarksql-5.0/run
--清理
$ ./runDatabaseDestroy.sh props.yashandb
--装载
$ ./runDatabaseBuild.sh props.yashandb
--测试
$ ./runBenchmark.sh props.yashandb
BenchmarkSQL压测结果
./runBenchmark.sh props.yashandb
20:26:23,128 [main] INFO jTPCC : Term-00,
20:26:23,131 [main] INFO jTPCC : Term-00, +-------------------------------------------------------------+
20:26:23,131 [main] INFO jTPCC : Term-00, BenchmarkSQL v5.0
20:26:23,131 [main] INFO jTPCC : Term-00, +-------------------------------------------------------------+
20:26:23,131 [main] INFO jTPCC : Term-00, (c) 2003, Raul Barbosa
20:26:23,131 [main] INFO jTPCC : Term-00, (c) 2004-2016, Denis Lussier
20:26:23,133 [main] INFO jTPCC : Term-00, (c) 2016, Jan Wieck
20:26:23,134 [main] INFO jTPCC : Term-00, +-------------------------------------------------------------+
20:26:23,134 [main] INFO jTPCC : Term-00,
20:26:23,134 [main] INFO jTPCC : Term-00, db=yashandb
20:26:23,134 [main] INFO jTPCC : Term-00, driver=com.yashandb.jdbc.Driver
20:26:23,134 [main] INFO jTPCC : Term-00, conn=jdbc:yasdb://10.120.247.69:1688/yashandb
20:26:23,134 [main] INFO jTPCC : Term-00, user=benchmark
20:26:23,134 [main] INFO jTPCC : Term-00,
20:26:23,134 [main] INFO jTPCC : Term-00, warehouses=1000
20:26:23,135 [main] INFO jTPCC : Term-00, terminals=384
20:26:23,136 [main] INFO jTPCC : Term-00, runMins=10
20:26:23,136 [main] INFO jTPCC : Term-00, limitTxnsPerMin=0
20:26:23,137 [main] INFO jTPCC : Term-00, terminalWarehouseFixed=true
20:26:23,137 [main] INFO jTPCC : Term-00,
20:26:23,137 [main] INFO jTPCC : Term-00, newOrderWeight=45
20:26:23,137 [main] INFO jTPCC : Term-00, paymentWeight=43
20:26:23,137 [main] INFO jTPCC : Term-00, orderStatusWeight=4
20:26:23,137 [main] INFO jTPCC : Term-00, deliveryWeight=4
20:26:23,137 [main] INFO jTPCC : Term-00, stockLevelWeight=4
20:26:23,137 [main] INFO jTPCC : Term-00,
20:26:23,137 [main] INFO jTPCC : Term-00, resultDirectory=null
20:26:23,137 [main] INFO jTPCC : Term-00, osCollectorScript=null
20:26:23,138 [main] INFO jTPCC : Term-00,
20:26:23,408 [main] INFO jTPCC : Term-00, C value for C_LAST during load: 32
20:26:23,408 [main] INFO jTPCC : Term-00, C value for C_LAST this run: 110
20:26:23,408 [main] INFO jTPCC : Term-00,
Term-00, Running Average tpmTOTAL: 2648052.37 Current tpmTOTAL: 174983520 Memory Usage: 1697MB / 2163MB
20:36:25,871 [Thread-235] INFO jTPCC : Term-00,
20:36:25,872 [Thread-235] INFO jTPCC : Term-00,
20:36:25,872 [Thread-235] INFO jTPCC : Term-00, Measured tpmC (NewOrders) = 1191298.38
20:36:25,872 [Thread-235] INFO jTPCC : Term-00, Measured tpmTOTAL = 2646912.41
20:36:25,872 [Thread-235] INFO jTPCC : Term-00, Session Start = 2025-12-25 20:26:25
20:36:25,872 [Thread-235] INFO jTPCC : Term-00, Session End = 2025-12-25 20:36:25
20:36:25,872 [Thread-235] INFO jTPCC : Term-00, Transaction Count = 26480946
测试结果中的tpmC值表示每分钟内系统处理的新订单个数,即系统最大吞吐量。tpmC值常作为性能指标,值越高表示数据库性能越好。可见当前tpmC (NewOrders) = 1191298.38.
系统资源 未截图。
注:当时的CPU 使用率几乎耗尽,但是%sys 占用近20%, 存在较高的上下文切换,后面做绑核处理,性能应该会更高。
numactl –C 0-xxx,xxx-120 ./runBenchmark.sh xxx