TiProxy 性能测试报告

本次报告测试了 TiProxy 在 OLTP 场景下的 Sysbench 性能表现,并和 HAProxy 的性能做了对比。

结果显示:

  • TiProxy 的 QPS 上限受工作负载类型的影响。在 Sysbench 的基本工作负载、同等 CPU 使用率的情况下,TiProxy 的 QPS 比 HAProxy 低约 25%
  • TiProxy 能承载的 TiDB server 实例数量根据工作负载类型而变化。在 Sysbench 的基本工作负载下,一台 TiProxy 能承载 5 至 12 台同机型的 TiDB server 实例
  • 查询结果集的行数对 TiProxy 的 QPS 有显著影响,且影响程度与 HAProxy 相同
  • TiProxy 的性能随 vCPU 的数量接近线性增长,因此增加 vCPU 的数量可以有效提高 QPS 上限
  • 长连接的数量、短连接的创建频率对 TiProxy 的 QPS 影响很小

测试环境

硬件配置

服务类型实例机型CPU 型号实例数
TiProxy4C8GIntel(R) Xeon(R) Silver 4214R CPU @ 2.40GHz1
HAProxy4C8GIntel(R) Xeon(R) Silver 4214R CPU @ 2.40GHz1
PD4C8GIntel(R) Xeon(R) Silver 4214R CPU @ 2.40GHz3
TiDB8C16GIntel(R) Xeon(R) Silver 4214R CPU @ 2.40GHz8
TiKV8C16GIntel(R) Xeon(R) Silver 4214R CPU @ 2.40GHz8
Sysbench8C16GIntel(R) Xeon(R) Silver 4214R CPU @ 2.40GHz1

软件版本

服务类型软件版本
TiProxyv1.0.0
HAProxy2.9.0
PDv8.0.0
TiDBv8.0.0
TiKVv8.0.0
Sysbench1.0.17

参数配置

TiProxy 参数配置

本次测试中,客户端与 TiProxy 之间、TiProxy 与 TiDB server 之间均未开启 TLS 连接。

proxy.conn-buffer-size: 131072

HAProxy 配置 - haproxy.cfg 文件

global # 全局配置。 log 127.0.0.1 local2 # 定义全局的 syslog 服务器,最多可以定义两个。 pidfile /var/run/haproxy.pid # 将 HAProxy 进程的 PID 写入 pidfile。 maxconn 4096 # 单个 HAProxy 进程可接受的最大并发连接数,等价于命令行参数 "-n"。 nbthread 4 # 最大线程数。线程数的上限与 CPU 数量相同。 user haproxy # 同 UID 参数。 group haproxy # 同 GID 参数,建议使用专用用户组。 daemon # 让 HAProxy 以守护进程的方式工作于后台,等同于命令行参数 “-D” 的功能。当然,也可以在命令行中用 “-db” 参数将其禁用。 stats socket /var/lib/haproxy/stats # 统计信息保存位置。 defaults # 默认配置。 log global # 日志继承全局配置段的设置。 retries 2 # 向上游服务器尝试连接的最大次数,超过此值便认为后端服务器不可用。 timeout connect 2s # HAProxy 与后端服务器连接超时时间。如果在同一个局域网内,可设置成较短的时间。 timeout client 30000s # 客户端与 HAProxy 连接后,数据传输完毕,即非活动连接的超时时间。 timeout server 30000s # 服务器端非活动连接的超时时间。 listen tidb-cluster # 配置 database 负载均衡。 bind 0.0.0.0:3390 # 浮动 IP 和 监听端口。 mode tcp # HAProxy 要使用第 4 层的传输层。 balance leastconn # 连接数最少的服务器优先接收连接。`leastconn` 建议用于长会话服务,例如 LDAP、SQL、TSE 等,而不是短会话协议,如 HTTP。该算法是动态的,对于启动慢的服务器,服务器权重会在运行中作调整。 server tidb-1 10.9.18.229:4000 check inter 2000 rise 2 fall 3 # 检测 4000 端口,检测频率为每 2000 毫秒一次。如果 2 次检测为成功,则认为服务器可用;如果 3 次检测为失败,则认为服务器不可用。 server tidb-2 10.9.39.208:4000 check inter 2000 rise 2 fall 3 server tidb-3 10.9.64.166:4000 check inter 2000 rise 2 fall 3

基本工作负载测试

测试方案

该测试的目的是对比 point select、read only、write only、read write 四种工作负载下 TiProxy 与 HAProxy 的 QPS。每种工作负载分别使用不同的并发度测试 TiProxy 和 HAProxy,对比 QPS。

执行的测试命令:

sysbench $testname \ --threads=$threads \ --time=1200 \ --report-interval=10 \ --rand-type=uniform \ --db-driver=mysql \ --mysql-db=sbtest \ --mysql-host=$host \ --mysql-port=$port \ run --tables=32 --table-size=1000000

Point Select 测试结果

TiProxy 测试结果:

并发数QPS平均延迟 (ms)P95 延迟 (ms)TiProxy CPU 使用率TiDB CPU 总使用率
20412730.480.64190%900%
501002550.500.62330%1900%
1001376880.731.01400%2600%

HAProxy 测试结果:

并发数QPS平均延迟 (ms)P95 延迟 (ms)HAProxy CPU 使用率TiDB CPU 总使用率
20448330.450.61140%1000%
501036310.480.61270%2100%
1001630690.610.77360%3100%

Read Only 测试结果

TiProxy 测试结果:

并发数QPS平均延迟 (ms)P95 延迟 (ms)TiProxy CPU 使用率TiDB CPU 总使用率
507207611.0912.75290%2500%
10010970414.5817.63370%3800%
20011751927.2132.53400%4100%

HAProxy 测试结果:

并发数QPS平均延迟 (ms)P95 延迟 (ms)HAProxy CPU 使用率TiDB CPU 总使用率
507576010.5612.08250%2600%
10012173013.1415.83350%4200%
20013171224.2730.26370%4500%

Write Only 测试结果

TiProxy 测试结果:

并发数QPS平均延迟 (ms)P95 延迟 (ms)TiProxy CPU 使用率TiDB CPU 总使用率
100819577.3210.27290%3900%
30010304017.4531.37330%4700%
50010486928.5952.89340%4800%

HAProxy 测试结果:

并发数QPS平均延迟 (ms)P95 延迟 (ms)HAProxy CPU 使用率TiDB CPU 总使用率
100817087.3410.65240%3700%
30010600816.9531.37320%4800%
50012236924.4547.47350%5300%

Read Write 测试结果

TiProxy 测试结果:

并发数QPS平均延迟 (ms)P95 延迟 (ms)TiProxy CPU 使用率TiDB CPU 总使用率
505857117.0719.65250%2600%
1008843222.6029.19330%3900%
20010875836.7351.94380%4800%

HAProxy 测试结果:

并发数QPS平均延迟 (ms)P95 延迟 (ms)HAProxy CPU 使用率TiDB CPU 总使用率
506122616.3319.65190%2800%
1009656920.7026.68290%4100%
20012016331.2849.21340%5200%

结果集测试

测试方案

该测试的目的是对比不同结果集行数对性能的影响。该测试固定使用 100 并发数,分别使用行数为 10、100、1000、10000 的结果集,对比 TiProxy 和 HAProxy 的 QPS。

执行的测试命令:

sysbench oltp_read_only \ --threads=100 \ --time=1200 \ --report-interval=10 \ --rand-type=uniform \ --db-driver=mysql \ --mysql-db=sbtest \ --mysql-host=$host \ --mysql-port=$port \ --skip_trx=true \ --point_selects=0 \ --sum_ranges=0 \ --order_ranges=0 \ --distinct_ranges=0 \ --simple_ranges=1 \ --range_size=$range_size run --tables=32 --table-size=1000000

测试结果

TiProxy 测试结果:

返回行数QPS平均延迟 (ms)P95 延迟 (ms)TiProxy CPU 使用率TiDB CPU 总使用率入站流量 (MiB/s)出站流量 (MiB/s)
10801571.251.61340%2600%140140
100559361.792.43370%2800%820820
1000103139.6913.70310%1500%13701370
10000106493.88142.39250%600%14301430

HAProxy 测试结果:

返回行数QPS平均延迟 (ms)P95 延迟 (ms)HAProxy CPU 使用率TiDB CPU 总使用率入站流量 (MiB/s)出站流量 (MiB/s)
10943761.061.30250%4000%150150
100701291.421.76270%3300%890890
1000950111.1814.73240%1500%11801180
10000955104.61320.17180%1200%12001200

扩展性测试

测试方案

该测试的目的是验证 TiProxy 的性能与规格成正比,以确保升级 TiProxy 的规格能提升其 QPS 上限。该测试分别使用不同 vCPU 数量的 TiProxy 实例和并发数,对比 QPS。

执行的测试命令:

sysbench oltp_point_select \ --threads=$threads \ --time=1200 \ --report-interval=10 \ --rand-type=uniform \ --db-driver=mysql \ --mysql-db=sbtest \ --mysql-host=$host \ --mysql-port=$port \ run --tables=32 --table-size=1000000

测试结果

核数并发数QPS平均延迟 (ms)P95 延迟 (ms)TiProxy CPU 使用率TiDB CPU 总使用率
240585080.680.97190%1200%
4801048900.761.16390%2000%
61201555200.771.14590%2900%
81602021340.791.18800%3900%

长连接测试

测试方案

该测试的目的是验证客户端使用长连接时,大量空闲连接对 QPS 的影响很小。该测试分别创建 5000、10000、15000 个空闲的长连接,然后执行 sysbench

测试中 TiProxy 的 conn-buffer-size 配置保持默认值:

proxy.conn-buffer-size: 32768

执行的测试命令:

sysbench oltp_point_select \ --threads=50 \ --time=1200 \ --report-interval=10 \ --rand-type=uniform \ --db-driver=mysql \ --mysql-db=sbtest \ --mysql-host=$host \ --mysql-port=$port \ run --tables=32 --table-size=1000000

测试结果

连接数QPS平均延迟 (ms)P95 延迟 (ms)TiProxy CPU 使用率TiProxy 内存使用 (MB)TiDB CPU 总使用率
5000966200.520.64330%9201800%
10000961430.520.65330%17101800%
15000960480.520.65330%25701900%

短连接测试

测试方案

该测试的目的是验证在客户端使用短连接时,频繁创建和销毁连接对 QPS 的影响很小。该测试在执行 sysbench 的同时,启动另一个客户端程序,分别每秒创建并断开 100、200、300 个短连接。

执行的测试命令:

sysbench oltp_point_select \ --threads=50 \ --time=1200 \ --report-interval=10 \ --rand-type=uniform \ --db-driver=mysql \ --mysql-db=sbtest \ --mysql-host=$host \ --mysql-port=$port \ run --tables=32 --table-size=1000000

测试结果

每秒新建连接数QPS平均延迟 (ms)P95 延迟 (ms)TiProxy CPU 使用率TiDB CPU 总使用率
100955970.520.65330%1800%
200946920.530.67330%1800%
300941020.530.68330%1900%