全密态数据库性能测试报告

本文介绍全密态数据库在不同场景中对系统性能的影响,有助于您评估和选择加密方案。

测试环境

配置项

ECS实例(测试客户端部署在ECS实例上)

RDS PostgreSQL实例

说明

地域及可用区

华东2(上海)可用区L

华东2(上海)可用区L

本测试在同一地域及可用区

网络类型

专有网络VPC

专有网络VPC

本测试在同一VPC

CPU和内存

64核 128GB

32核 64GB

不涉及

实例规格族

计算型 c7

安全增强型

RDS需要选择安全增强型规格

实例规格

ecs.c7.16xlarge

pg.x2t.4xlarge.2c

不涉及

存储类型

ESSD云盘

ESSD云盘 PL1

不涉及

实例/镜像版本

Alibaba Cloud Linux 3.2104 64位

  • 大版本:RDS PostgreSQL 13

  • 小版本:20230830

不涉及

测试工具(sysbench)

sysbench是一个跨平台且支持多线程的模块化基准开源测试工具,用于评估系统在运行高负载的数据库时相关核心参数的性能表现。sysbench的更多信息及使用方法,请参见sysbench文档

测试指标

  • 每秒执行事务数TPS(Transactions Per Second):数据库每秒执行的事务数,以COMMIT成功次数为准。

  • 事务处理平均延迟(Average Latency):数据库执行一条事务的平均耗时,单位为毫秒(ms)。

测试表结构

sysbench的默认表结构如下:

CREATE TABLE test1(
  id INTEGER NOT NULL,
  k INTEGER DEFAULT '0' NOT NULL,
  c CHAR(120) DEFAULT '' NOT NULL,
  pad CHAR(60) DEFAULT '' NOT NULL,
  PRIMARY KEY (id)
);
CREATE INDEX k_1 on test1(k);

测试步骤

本测试对表中的列进行加密,分析全密态数据库不同场景下的性能。

  1. ECS实例安装PostgreSQL客户端。请参见官方文档

  2. 打开PostgreSQL命令行工具连接RDS PostgreSQL数据库。

    psql -h <数据库连接地址> -U <用户名> -p <端口号> -d postgres
    说明
  3. 创建测试数据库。

    CREATE DATABASE testdb;
    \c testdb
  4. 创建加密表,根据不同场景对列进行加密。

    场景

    说明

    SQL示例

    主键不加密,其他列加密

    常见业务场景中,id为自增字段并与业务无关,因此此场景不加密id列,将其他列作为敏感信息进行加密。

    CREATE TABLE test1(
      id INTEGER NOT NULL,
      k enc_int4 DEFAULT '\xa509008855508aade16ec573d21e6aca47ab5e490d7044e748161a6635a5d939c5bbbee4' NOT NULL,
      c enc_text DEFAULT '\x9d39006e340b9cffb37a989ca544e69e6e9c0bdb0b6500a91dcc433dc5df0496' NOT NULL,
      pad enc_text DEFAULT '\x9d39006e340b9cffb37a989ca544e69e6e9c0bdb0b6500a91dcc433dc5df0496' NOT NULL,
      PRIMARY KEY (id)
    );
    CREATE INDEX k_1 on test1(k);

    加密所有列

    此场景对主键列也进行加密。

    CREATE TABLE test1(
      id enc_int4 NOT NULL,
      k enc_int4 DEFAULT '\xa509008855508aade16ec573d21e6aca47ab5e490d7044e748161a6635a5d939c5bbbee4' NOT NULL,
      c enc_text DEFAULT '\x9d39006e340b9cffb37a989ca544e69e6e9c0bdb0b6500a91dcc433dc5df0496' NOT NULL,
      pad enc_text DEFAULT '\x9d39006e340b9cffb37a989ca544e69e6e9c0bdb0b6500a91dcc433dc5df0496' NOT NULL,
      PRIMARY KEY (id)
    );
    CREATE INDEX k_1 on test1(k);
  5. 退出数据库,使用sysbench工具加载测试数据。

    说明

    本测试中,使用sysbench加载32个表,其中每个表包含一百万行记录。

    sysbench --db-driver=pgsql \
      --pgsql-host=[database server host] \
      --pgsql-port=[database server port] \
      --pgsql-user=[database user name] \
      --pgsql-password=[database user password] \
      --pgsql-db=testdb \
      --auto_inc=false \
      --table_size=1000000 \
      --tables=32 \
      --threads=32 \
      --time=600 \
      --pg_use_encrypt=[true or false] \
      oltp_common prepare
  6. 执行自定义测试脚本。

    sysbench --db-driver=pgsql \
      --pgsql-host=[database server host] \
      --pgsql-port=[database server port] \
      --pgsql-user=[database user name] \
      --pgsql-password=[database user password] \
      --pgsql-db=testdb \
      --table_size=1000000 \
      --tables=32 \
      --threads=XXX \
      --time=600 \
      --report-interval=1 \
      --pg_use_encrypt=[true or false] \
      [lua script name] run
  7. 清理数据。

    sysbench --db-driver=pgsql \
      --pgsql-host=[database server host] \
      --pgsql-port=[database server port] \
      --pgsql-user=[database user name] \
      --pgsql-password=[database user password] \
      --pgsql-db=testdb \
      --tables=32 \
      oltp_common cleanup

测试场景1:主键不加密,其他列加密

说明
  • 本次测试的每个结果均为运行10次测试的TPS和处理延迟的平均值,其中每次测试执行10分钟。

  • 性能测试结果包含了在客户端对返回的加密字段进行解密的性能损耗。

  • 测试结果图例中柱形图表示每秒执行数TPS,折线图表示事务处理平均延迟。

测试数据

  • 点查询性能

    比例

    SQL模板

    100%

    说明

    比例指一条事务中执行SQL模板中定义的SQL所占的比例。

    SELECT c FROM test1 WHERE id=?;
    场景1点查询
    表 1. TPS(千)性能对比

    并发线程数

    未开启全密态数据库扩展

    开启全密态数据库扩展

    性能损失

    8

    46.99

    39.94

    15.0%

    16

    91.07

    79.86

    12.3%

    24

    132.78

    117.64

    11.4%

    32

    173.58

    154.28

    11.1%

  • 范围查询性能

    比例

    SQL模板

    100%

    SELECT SUM(k) FROM test1 WHERE id BETWEEN ? AND ?;
    说明

    范围查询的长度默认为100。

    场景1范围查询
    表 2. TPS(千)性能对比

    并发线程数

    未开启全密态数据库扩展

    开启全密态数据库扩展

    性能损失

    8

    14.81

    12.09

    18.3%

    16

    28.88

    23.22

    19.6%

    24

    41.62

    33.12

    20.4%

    32

    54.27

    42.48

    21.7%

  • 写性能

    比例

    SQL模板

    25%

    UPDATE test1 SET k=k+1 WHERE id=?;

    25%

    UPDATE test1 SET c=? WHERE id=?;

    25%

    DELETE FROM test1 WHERE id=?;

    25%

    INSERT INTO test1 (id, k, c, pad) VALUES (?, ?, ?, ?);
    场景1写性能
    表 3. TPS(千)性能对比

    并发线程数

    未开启全密态数据库扩展

    开启全密态数据库扩展

    性能损失

    8

    6.62

    6.37

    3.8%

    16

    11.36

    10.91

    4.0%

    24

    15.05

    14.68

    2.6%

    32

    19.13

    17.74

    7.3%

测试结论

非密文主键查询场景下,开启全密态数据库扩展后,性能损失较小。

测试场景2:加密所有列

说明
  • 本次测试的每个结果均为运行10次测试的TPS和处理延迟的平均值,其中每次测试执行10分钟。

  • 性能测试结果包含了在客户端对返回的加密字段进行解密的性能损耗。

  • 测试结果图例中柱形图表示每秒执行数TPS,折线图表示事务处理平均延迟。

测试数据

  • 点查询性能

    比例

    SQL模板

    100%

    SELECT c FROM test1 WHERE id=?;
    场景2点查询
    表 4. TPS(千)性能对比

    并发线程数

    未开启全密态数据库扩展

    开启全密态数据库扩展

    性能损失

    8

    46.99

    18.31

    61.0%

    16

    91.07

    35.66

    60.8%

    24

    132.78

    49.85

    62.5%

    32

    173.58

    63.34

    63.5%

  • 范围查询性能

    比例

    SQL模板

    100%

    SELECT SUM(k) FROM test1 WHERE id BETWEEN ? AND ?;
    说明

    范围查询的长度默认为100。

    场景2范围查询
    表 5. TPS(千)性能对比

    并发线程数

    未开启全密态数据库扩展

    开启全密态数据库扩展

    性能损失

    8

    14.81

    2.83

    80.9%

    16

    28.88

    5.52

    80.9%

    24

    41.62

    7.12

    82.9%

    32

    54.27

    8.71

    84.0%

  • 写性能

    比例

    SQL模板

    25%

    UPDATE test1 SET k=k+1 WHERE id=?;

    25%

    UPDATE test1 SET c=? WHERE id=?;

    25%

    DELETE FROM test1 WHERE id=?;

    25%

    INSERT INTO test1 (id, k, c, pad) VALUES (?, ?, ?, ?);
    场景2写性能
    表 6. TPS(千)性能对比

    并发线程数

    未开启全密态数据库扩展

    开启全密态数据库扩展

    性能损失

    8

    6.62

    2.67

    59.7%

    16

    11.36

    4.62

    59.3%

    24

    15.05

    5.92

    60.7%

    32

    19.13

    7.04

    63.2%

测试结论

加密所有列相比于不加密主键列的查询结果,除了客户端的解密开销外,由于加密列的索引查询需要调用Intel SGX相关指令的频率更高,总代价更大,性能损失较大。

测试场景3:非主键列查询

说明
  • 本次测试的每个结果均为运行10次测试的TPS和处理延迟的平均值,其中每次测试执行10分钟。

  • 性能测试结果包含了在客户端对返回的加密字段进行解密的性能损耗。

  • 测试结果图例中柱形图表示每秒执行数TPS,折线图表示事务处理平均延迟。

本测试场景使用了阿里云推出的encdb_btree插件,能够有效提高全密态数据库密文索引相关操作的效率。更多信息,请参见加速密文索引(encdb_btree)

测试数据

  • 点查询

    比例

    SQL模板

    100%

    SELECT c FROM test1 WHERE k=?;
    非主键查询
    表 7. TPS(千)性能对比

    并发线程数

    未开启全密态数据库扩展

    开启全密态数据库扩展

    开启全密态数据库扩展+使用encdb_btree插件加速

    8

    47.27

    18.49

    27.86

    16

    90.41

    35.85

    54.4

    24

    132.66

    49.97

    78.21

    32

    172.96

    63.32

    99.38

  • 范围查询

    比例

    SQL模板

    100%

    SELECT SUM(k) FROM test1 WHERE k BETWEEN ? AND ?
    说明

    范围查询的长度默认为100。

    非主键加密范围查询
    表 8. TPS(千)性能对比

    并发线程数

    未开启全密态数据库扩展

    开启全密态数据库扩展

    开启全密态数据库扩展+使用encdb_btree插件加速

    8

    14.97

    2.83

    7.8

    16

    28.89

    5.53

    15.2

    24

    42.38

    7.15

    20.09

    32

    54.8

    8.75

    24.86

测试结论

数据库在非主键列上的查询表现与主键列上的表现类似,并且开启全密态数据库扩展后,可以通过encdb_btree插件进一步提升密文数据的查询性能。

全密态数据库扩展使用建议

建议开启全密态数据库扩展后,只对关键的敏感数据列加密。