实测2U ARM服务器YashanDB基于BenchmarkSQL的TPC-C

tpcc最常用的在线事务处理(OLTP)测试基准测试,近期在客户一套生产硬件上对YashanDB做了个简单的测试,下面介绍在YashanDB单机数据库上运行基于BenchmarkSQL的TPC-C测试(非极致性能优化)。

测试环境介绍

软件版本
YashanDB for ARM23.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

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

Leave a Comment