TiDB in Kubernetes Sysbench 性能测试

    • 测试典型公有云平台上 TiDB 性能数据
    • 测试公有云平台磁盘、网络、CPU 以及不同 Pod 网络下对 TiDB 性能的影响

    本次测试统一使用 TiDB v3.0.1 版本进行测试。

    TiDB Operator 使用 v1.0.0 版本。

    PD、TiDB 和 TiKV 实例数均为 3 个。各组件分别作了如下配置,未配置部分使用默认值。

    PD:

    TiDB:

    1. level = "error"
    2. [prepared-plan-cache]
    3. enabled = true
    4. [tikv-client]
    5. max-batch-wait-time = 2000000

    TiKV:

    1. log-level = "error"
    2. [server]
    3. status-addr = "0.0.0.0:20180"
    4. grpc-concurrency = 6
    5. [readpool.storage]
    6. normal-concurrency = 10
    7. [rocksdb.defaultcf]
    8. block-cache-size = "14GB"
    9. [rocksdb.writecf]
    10. block-cache-size = "8GB"
    11. [rocksdb.lockcf]
    12. block-cache-size = "1GB"
    13. [raftstore]
    14. apply-pool-size = 3

    TiDB 数据库参数配置

    机器型号

    在单可用区测试中,我们选择了如下型号机器:

    分别在多可用区和单可用区中对 TiDB 进行性能测试,并将结果相对比。在测试时 (2019.08),一个 GCP 区域 (Region) 下不存在三个能同时提供 c2 机器的可用区,所以我们选择了如下机器型号进行测试:

    组件 实例类型 数量
    PD n1-standard-4 3
    TiKV n1-standard-16 3
    TiDB n1-standard-16 3
    Sysbench n1-standard-16 3

    在高并发读测试中,压测端 sysbench 对 CPU 需求较高,需选择多核较高配置型号,避免压测端成为瓶颈。

    磁盘

    GKE 当前的 NVMe 磁盘还在 Alpha 阶段,使用需特殊申请,不具备普遍意义。测试中,本地 SSD 盘统一使用 iSCSI 接口类型。挂载参数参考增加了 discard,nobarrier 选项。完整挂载例子如下:

    1. sudo mount -o defaults,nodelalloc,noatime,discard,nobarrier /dev/[LOCAL_SSD_ID] /mnt/disks/[MNT_DIR]

    网络

    GKE 网络模式使用具备更好扩展性以及功能强大的 VPC-Native 模式。在性能对比中,我们分别对 TiDB 使用 Kubernetes Pod 和 Host 网络分别做了测试。

    CPU

    在单可用集群测试中,我们为 TiDB/TiKV 选择 c2-standard-16 机型测试。在单可用与多可用集群的对比测试中,因为 GCP 区域 (Region) 下不存在三个能同时申请 c2-standard-16 机型的可用区,所以我们选择了 n1-standard-16 机型测试。

    操作系统及参数

    GKE 支持两种操作系统:COS (Container Optimized OS) 和 Ubuntu 。Point Select 测试在两种操作系统中进行,并将结果进行了对比。其余测试中,统一使用 Ubuntu 系统进行测试。

    内核统一做了如下配置:

    1. sysctl net.core.somaxconn=32768
    2. sysctl vm.swappiness=0
    3. sysctl net.ipv4.tcp_syncookies=0

    同时对最大文件数配置为 1000000。

    本次测试中 sysbench 版本为 1.0.17。并在测试前统一使用 oltp_commonprewarm 命令进行数据预热。

    初始化

    ${tidb_host} 为 TiDB 的数据库地址,根据不同测试需求选择不同的地址,比如 Pod IP、Service 域名、Host IP 以及 Load Balancer IP(下同)。

    预热

    1. sysbench \
    2. --mysql-host=${tidb_host} \
    3. --mysql-port=4000 \
    4. --mysql-user=root \
    5. --time=600 \
    6. --threads=16 \
    7. --report-interval=10 \
    8. --db-driver=mysql \
    9. --rand-type=uniform \
    10. --rand-seed=$RANDOM \
    11. --table-size=10000000 \
    12. oltp_common \
    13. prewarm

    压测

    1. sysbench \
    2. --mysql-host=${tidb_host} \
    3. --mysql-port=4000 \
    4. --mysql-user=root \
    5. --mysql-db=sbtest \
    6. --time=600 \
    7. --threads=${threads} \
    8. --report-interval=10 \
    9. --db-driver=mysql \
    10. --rand-type=uniform \
    11. --rand-seed=$RANDOM \
    12. --tables=16 \
    13. --table-size=10000000 \
    14. ${test} \
    15. run

    ${test} 为 sysbench 的测试 case。我们选择了 oltp_point_select、oltp_update_index、oltp_update_no_index、oltp_read_write 这几种。

    单可用区测试

    Pod Network vs Host Network

    Kubernetes 允许 Pod 运行在 Host 网络模式下。此部署方式适用于 TiDB 实例独占机器且没有端口冲突的情况。我们分别在两种网络模式下做了 Point Select 测试。

    此次测试中,操作系统为 COS。

    Pod Network:

    Threads QPS 95% latency(ms)
    150 246386.44 0.95
    300 346557.39 1.55
    600 396715.66 2.86
    900 407437.96 4.18
    1200 415138.00 5.47
    1500 419034.43 6.91
    Threads QPS 95% latency(ms)
    150 255981.11 1.06
    300 366482.22 1.50
    600 421279.84 2.71
    900 438730.81 3.96
    1200 441084.13 5.28
    1500 447659.15 6.67

    QPS 对比:

    Latency 对比:

    Pod vs Host Network

    从图中可以看到 Host 网络下整体表现略好于 Pod 网络。

    Ubuntu vs COS

    GKE 平台可以为节点选择 。本次测试中,分别在两种操作系统中进行了 Point Select 测试。

    此次测试中 Pod 网络模式为 Host。

    COS:

    Threads QPS 95% latency(ms)
    150 255981.11 1.06
    300 366482.22 1.50
    600 421279.84 2.71
    900 438730.81 3.96
    1200 441084.13 5.28
    1500 447659.15 6.67

    Ubuntu:

    QPS 对比:

    Latency 对比:

    COS vs Ubuntu

    从图中可以看到 Host 模式下,在单纯的 Point Select 测试中,TiDB 在 Ubuntu 系统中的表现比在 COS 系统中的表现要好。

    注意:

    此测试只针对单一测试集进行了测试,表明不同的操作系统、不同的优化与默认设置,都有可能影响性能,所以我们在此不对操作系统做推荐。COS 系统专为容器优化,在安全性、磁盘性能做了优化,在 GKE 是官方推荐系统。

    K8S Service vs GCP LoadBalancer

    通过 Kubernetes 部署 TiDB 集群后,有两种访问 TiDB 集群的场景:集群内通过 Service 访问或集群外通过 Load Balancer IP 访问。本次测试中分别对这两种情况进行了对比测试。

    此次测试中操作系统为 Ubuntu,Pod 为 Host 网络。

    Service:

    Threads QPS 95% latency(ms)
    150 290690.51 0.74
    300 422941.17 1.10
    600 476663.44 2.14
    900 484405.99 3.25
    1200 489220.93 4.33
    1500 489988.97 5.47

    Load Balancer:

    Threads QPS 95% latency(ms)
    150 255981.11 1.06
    300 366482.22 1.50
    600 421279.84 2.71
    900 438730.81 3.96
    1200 441084.13 5.28
    1500 447659.15 6.67

    QPS 对比:

    Latency 对比:

    从图中可以看到在单纯的 Point Select 测试中,使用 Kubernetes Service 访问 TiDB 时的表现比使用 GCP Load Balancer 访问时要好。

    n1-standard-16 vs c2-standard-16

    在 Point Select 读测试中,TiDB 的 CPU 占用首先达到 1400% (16 cores) 以上,此时 TiKV CPU 占用约 1000% (16 cores) 。我们对比了普通型和计算优化型机器下 TiDB 的不同表现。其中 n1-stadnard-16 主频约 2.3G,c2-standard-16 主频约 3.1G。

    此次测试中操作系统为 Ubuntu,Pod 为 Host 网络,使用 Service 访问 TiDB。

    n1-standard-16:

    Threads QPS 95% latency(ms)
    150 203879.49 1.37
    300 272175.71 2.3
    600 287805.13 4.1
    900 295871.31 6.21
    1200 294765.83 8.43
    1500 298619.31 10.27

    c2-standard-16:

    Threads QPS 95% latency(ms)
    150 290690.51 0.74
    300 422941.17 1.10
    600 476663.44 2.14
    900 484405.99 3.25
    1200 489220.93 4.33
    1500 489988.97 5.47

    QPS 对比:

    n1-standard-16 vs c2-standard-16

    Latency 对比:

    使用 Point Select 测试针对不同操作系统、不同网络情况做了对比测试后,也进行了 OLTP 测试集中的其他测试。这些测试统一使用 Ubuntu 系统、Host 模式并在集群使用 Service 访问 TiDB 集群。

    OLTP Update Index

    OLTP Update Index

    OLTP Update Non Index

    Threads QPS 95% latency(ms)
    150 9230.60 23.95
    300 16543.63 54.83
    600 23551.01 61.08
    900 31100.10 65.65
    1200 33942.60 54.83
    1500 42603.13 125.52

    OLTP Update No Index

    OLTP Read Write

    Threads QPS 95% latency(ms)
    150 60732.84 69.29
    300 91005.98 90.78
    600 110517.67 167.44
    900 119866.38 235.74
    1200 125615.89 282.25
    1500 128501.34 344.082

    OLTP Read Write

    单可用区与多可用区对比

    GCP 多可用区涉及跨 Zone 通信,网络延迟相比同 Zone 会少许增加。我们使用同样机器配置,对两种部署方案进行同一标准下的性能测试,了解多可用区延迟增加带来的影响。

    单可用区:

    Threads QPS 95% latency(ms)
    150 203879.49 1.37
    300 272175.71 2.30
    600 287805.13 4.10
    900 295871.31 6.21
    1200 294765.83 8.43
    1500 298619.31 10.27

    多可用区:

    Threads QPS 95% latency(ms)
    150 141027.10 1.93
    300 220205.85 2.91
    600 250464.34 5.47
    900 257717.41 7.70
    1200 258835.24 10.09
    1500 280114.00 12.75

    QPS 对比:

    Single Zonal vs Regional

    Latency 对比:

    从图中可以看到并发压力增大后,网络额外延迟产生的影响越来越小,额外的网络延迟将不再是主要的性能瓶颈。

    此次测试主要将典型公有云部署 Kubernetes 运行 TiDB 集群的几种场景使用 sysbench 做了测试,了解不同因素可能带来的影响。从整体看,主要有以下几点:

    • VPC-Native 模式下 Host 网络性能略好于 Pod 网络(~7%,以 QPS 差异估算,下同)
    • GCP 的 Ubuntu 系统 Host 网络下单纯的读测试中性能略好于 COS (~9%)
    • 使用 Load Balancer 在集群外访问,会略损失性能 (~5%)
    • Point Select 读测试主要消耗 CPU ,计算型机型相对普通型机器带来了很大 QPS 提升 (50% ~ 60%)

    但要注意的是,这些因素可能随着时间变化,不同公有云下的表现可能会略有不同。在未来,我们将带来更多维度的测试。同时,sysbench 测试用例并不能完全代表实际业务场景,在做选择前建议模拟实际业务测试,并综合不同选择成本进行选择(机器成本、操作系统差异、Host 网络的限制等)。