本文对大量列(1000),小文件(1万-10万行)的加载性能进行测试,不同版本配置,对比V8和V9版本的性能提升情况。
列数不同的测试结果,请参考 GBase 8a在V95版本不同列、不同行数文件加载性能测试对比
目录导航
结论
针对1000列这类宽表,结论如下:
V9整体性能比V8提升30%以上,与V9元数据合并后磁盘io次数大幅减少有关。
更多的CPU核数在处理大文件时效果提升明显。
每次处理小数据(1万以内)可以开启事务,大数据不要开启事务。
单核
V9加载性能比V8,在1万行以内有50%提升,10万行有9%的提升。
V95版本在开事务后,在低于1000行(注意同时是1000列),性能比不开事务有50-90%提升。超过1万则性能下降4%-20%。
四核
V8四核对比单核,在小文件时,性能会略有下降,超过1万行后有19-32%的提升
V9四核相对单核,基本有25-54%的提升。
v9四核比V8四核,1万以内有73-81%的提升,大文件有39-58%的提升。
V9四核事务对比无事务,在低于10万行时有27-85%的提升,达到10万则下降了24%。 
详细记录
| 行数 | 文件 大小  | V9 | V9 事务  | V9 四核  | V9 四核 事务  | V8 | V8  四核  | V9单核 对比 V8单核  | V9单核 事务 对比 无事务  | V8 四核 对比 单核  | V9 四核 对比 单核  | V9四核 对比 V8四核  | V9四核 事务 对比 无事务  | 
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 10 | 55K | 7.36 | 0.73 | 4.12 | 0.67 | 23.22 | 21.91 | 68% | 90% | 6% | 44% | 81% | 84% | 
| 100 | 553K | 7.74 | 0.67 | 5.84 | 0.89 | 21.76 | 25.88 | 64% | 91% | -19% | 25% | 77% | 85% | 
| 1000 | 5.4M | 11.25 | 5.51 | 6.81 | 1.69 | 22.66 | 25.60 | 50% | 51% | -13% | 39% | 73% | 75% | 
| 10000 | 55M | 15.35 | 18.87 | 11.88 | 8.63 | 35.23 | 28.57 | 56% | -23% | 19% | 23% | 58% | 27% | 
| 100000 | 540M | 109 | 113 | 50.02 | 62.00 | 120 | 82 | 9% | -4% | 32% | 54% | 39% | -24% | 
环境
采用的是虚拟机,1核/4核,4G内存。宿主机是笔记本电脑,SSD盘。
[root@gbase_rh7_002 ~]# cat /proc/cpuinfo
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 142
model name      : Intel(R) Core(TM) i5-7200U CPU @ 2.50GHz
stepping        : 9
cpu MHz         : 2712.004
cache size      : 3072 KB
V9单节点集群
版本 9.5.2.36.125743
[gbase@gbase_rh7_001 ~]$ gcadmin showcluster vc vc01
CLUSTER STATE:         ACTIVE
VIRTUAL CLUSTER MODE:  NORMAL
==========================================================
|           GBASE VIRTUAL CLUSTER INFORMATION            |
==========================================================
|    VcName    | DistributionId |        comment         |
----------------------------------------------------------
|     vc01     |       1        | first vc with one node |
----------------------------------------------------------
=========================================================================================================
|                                 VIRTUAL CLUSTER DATA NODE INFORMATION                                 |
=========================================================================================================
| NodeName |                IpAddress                 | DistributionId | gnode | syncserver | DataState |
---------------------------------------------------------------------------------------------------------
|  node1   |                10.0.2.101                |       1        | OPEN  |    OPEN    |     0     |
---------------------------------------------------------------------------------------------------------
1 data node
V8单节点集群
8.6.2.33-R43.123184
[gbase@gbase_rh7_002 ~]$ gcadmin
CLUSTER STATE:  ACTIVE
CLUSTER MODE:   NORMAL
==========================================================
|         GBASE COORDINATOR CLUSTER INFORMATION          |
==========================================================
|   NodeName   | IpAddress  |gcware |gcluster |DataState |
----------------------------------------------------------
| coordinator1 | 10.0.2.102 | OPEN  |  OPEN   |    0     |
----------------------------------------------------------
======================================================
|           GBASE DATA CLUSTER INFORMATION           |
======================================================
|NodeName | IpAddress  |gnode |syncserver |DataState |
------------------------------------------------------
|  node1  | 10.0.2.102 | OPEN |   OPEN    |    0     |
------------------------------------------------------
[gbase@gbase_rh7_002 ~]$
测试表
1000列的随机分布表,全部都是int类型,因为在这么多列的表的业务里,都是存指标数据的,以int,decimal为主。
测试数据
用如下脚本随机生成。根据循环次数,生成不同行数的数据。
[gbase@gbase_rh7_001 50c]$ cat ../gen.sh
rows=$1
cols=$2
sign=$3
let "cols2=cols-1"
for((i=1;i<=rows;i++))do
  for((k=1;k<=cols2;k++))do
    echo -n "${RANDOM}," >> ${cols}_${rows}${sign}.txt;
  done;
  echo $RANDOM >> ${cols}_${rows}${sign}.txt;
done;
[gbase@gbase_rh7_001 50c]$ cat ../genx.sh
rows=$1
cols=$2
this_dir=`dirname $0`
let "rows2=rows/10"
for((i=0;i<10;i++))do
  sh ${this_dir}/gen.sh $rows2 $cols "_${i}_tmp" &
done
wait
for((i=0;i<10;i++))do
  cat ${cols}_${rows2}_${i}_tmp.txt >>  ${cols}_${rows}.txt
  rm -f ${cols}_${rows2}_${i}_tmp.txt
done
[gbase@gbase_rh7_001 50c]$
如下命令,生成10万行,1000列的数据,注意这个级别时间可能要很久,小时级。如果你有更好的生成工具,建议自己生成数据测试。
sh gen.sh 100000 1000
文件大小如下
[root@gbase_rh7_002 ~]# ll /home/gbase/*.txt -h
-rw-rw-r--. 1 gbase gbase 5.4M Feb  3 08:18 /home/gbase/1000.txt
-rw-rw-r--. 1 gbase gbase 553K Feb  3 08:18 /home/gbase/100.txt
-rw-rw-r--. 1 gbase gbase  56K Feb  3 08:18 /home/gbase/10.txt
-rw-rw-r--. 1 gbase gbase 540M Feb  3 08:39 /home/gbase/10w.txt
-rw-rw-r--. 1 gbase gbase  55M Feb  3 08:39 /home/gbase/1w.txt
测试方法
重复5-10次本地加载数据文件,记录结果。
V9开启事务的方法
修改gcluster配置文件,增加 gcluster_transaction_disable=0
修改gnode配置文件,增加gbase_tx_log_mode=USE,STANDARD_TRANS
然后重启集群。
gbase> show variables like '%disable%';
+----------------------------------+-------+
| Variable_name                    | Value |
+----------------------------------+-------+
| _gbase_bsi_check_disable         | OFF   |
| _gbase_disable_condition_reorder | 0     |
| _gbase_transaction_disable       | 1     |
| gbase_disable_encrypt            | OFF   |
| gcluster_transaction_disable     | 0     |
+----------------------------------+-------+
5 rows in set (Elapsed: 00:00:00.00)
gbase> ^CAborted
[gbase@gbase_rh7_001 ~]$ gncli
GBase client 9.5.2.36.125743. Copyright (c) 2004-2021, GBase.  All Rights Reserved.
gbase> show variables like '%tx%';
+------------------------------+----------------------------+
| Variable_name                | Value                      |
+------------------------------+----------------------------+
| _gbase_tx_log_check_interval | 2                          |
| _gbase_tx_log_compress       | ON                         |
| gbase_tx_log_dir             | /opt/gbase/gnode/translog/ |
| gbase_tx_log_flush_size      | 512                        |
| gbase_tx_log_flush_time      | 0                          |
| gbase_tx_log_mode            | USE,STANDARD_TRANS         |
| tx_isolation                 | REPEATABLE-READ            |
+------------------------------+----------------------------+
7 rows in set (Elapsed: 00:00:00.00)
gbase> ^CAborted
加载命令样例
如下用1行数据做样例。
gbase> load data infile 'ftp://gbase:gbase1234@10.0.2.101/1.txt' into table testload fields terminated by ',';
Query OK, 0 rows affected (Elapsed: 00:00:00.35)
Task 4099 finished, Loaded 0 records, Skipped 1 records
结果汇总
| 行数 | V9 | V9事务 | V8 | V8四核 | V9四核 | V9四核 事务  | 
| 10 | 6.42 8.57 8.45 8.18 5.16  | 1.21 0.94 0.54 0.47 0.47  | 27.58 25.95 21.87 22.08 18.61  | 21.98 21.78 20.8 23.87 21.14  | 4.25 3.75 4.42 4.06 4.14  | 0.5 0.8 0.61 0.8 0.62  | 
| 10平均 | 7.36 | 0.73 | 23.22 | 21.91 | 4.12 | 0.67 | 
| 100 | 8.53 8.00 8.10 6.32 7.75  | 0.68 0.84 0.6 0.66 0.59  | 21.67 21.51 22.23 21.9 21.48  | 26.06 23.22 27.15 26.85 26.14  | 6.08 5.14 6.98 6.87 4.14  | 0.73 0.69 1.19 0.67 1.19  | 
| 100平均 | 7.74 | 0.67 | 21.76 | 25.88 | 5.84 | 0.89 | 
| 1000 | 8.96 9.13 18.90 9.40 6.26 9.21 18.80 14.15 8.74 8.96  | 1.8 1.59 1.64 38.69 3.12 1.7 1.65 1.65 1.61 1.64  | 23.23 22.35 22.34 23.7 21.69  | 28.51 27.27 20.38 27.78 24.04  | 6.04 8.64 6.29 6.05 7.04  | 1.59 1.6 1.59 1.57 2.09  | 
| 1000平均 | 11.25 | 5.51 | 22.66 | 25.60 | 6.81 | 1.69 | 
| 10000 | 14.63 15.59 16.27 14.16 18.44 14.06 14.33  | 12.52 13.26 12.31 35.19 14.27 12.23 12.64 13.02 13.13 12.39 59.82 16.56 18  | 36.22 35.71 33.82 34.68 35.02 47.66 29.88 35.3 31.97 34.52 32.19 35.84 38.68 31.76  | 23.07 29.11 31.39 27.47 31.82  | 13.24 10.67 12.35 11.33 11.82  | 8.9 8.5 8.56 8.71 8.49  | 
| 1万平均 | 15.35 | |||||
| 100000 | 1:47.24 1:40.37 1:49.68 1:54.84 1:53.09  | 02:13.7 01:44.6 01:53.7 01:44.0 01:51.6  | 02:04.5 02:10.1 01:55.0 01:54.5 01:59.6  | 01:36.0 01:15.0 01:26.5 01:15.1 01:25.9 01:14.8  | 44.02 50.58 49.58 49.49 49.47 57.01  | 01:26.4 00:56.0 00:57.8 01:06.4 00:56.6 00:52.4  | 
| 10万平均 | 109 | 113 | 120 | 82 | 50.02 | 62.00 |