随着微服务的大规模利用,跨微服务的分布式事务也越来越多,那么分布式事务的性能到底怎么样?性能会降落多少?是否满足业务需要?这些指标关系到分布式事务是否顺利的引入到生产利用,是大家十分关怀的问题。

本文尝试深入分析分布式事务带来的额定开销,利用中的哪些因素会影响最终的性能,瓶颈点在哪里,如何晋升性能。本文以反对多语言的分布式事务管理器https://github.com/yedf/dtm的saga事务作为性能测试的样本,对性能测试的后果,进行深度分析。

测试环境

机型CPU/内存存储零碎Mysql
阿里云ecs.c7.xlarge4核8G500G ESSD IOPS 26800Ubuntu 20.04Docker mysql:5.7

测试过程

# 在dtm目录下docker-compose -f helper/compose.mysql.yml up -d # 启动Mysql# 运行sysbench对mysql进行测试sysbench oltp_write_only.lua --time=60 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root --mysql-password= --mysql-db=sbtest --table-size=1000000 --tables=10 --threads=10 --events=999999999 --report-interval=10 preparesysbench oltp_write_only.lua --time=60 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root --mysql-password= --mysql-db=sbtest --table-size=1000000 --tables=10 --threads=10 --events=999999999 --report-interval=10 rungo run app/main.go bench > /dev/nul # 启动dtm的bench服务,日志较多,重定向到nul设施bench/run-dtm.sh # 新启动命令行,运行dtm相干的各项测试

PS:如果您须要入手进行测试,建议您购买香港或国外的主机,这样相干的github、docker拜访会快很多,可能疾速搭建好环境。我在国内购买的主机,拜访github和docker,十分慢,有时连贯不上,无奈顺畅进行测试。

测试指标

咱们会对以下几个指标进行比照:

  • Global-TPS:用户视角下,实现了多少个全局事务。
  • DB-TPS:各项测试中,在DB层面实现的事务数量
  • OPS:各项测试中,实现了多少个SQL语句

后果比照

Mysql无DTM-2SQLDTM-2SQLDTM-2SQL-Barrier无DTM-10SQLDTM-10SQLDTM-10SQL-Barrier
Global-TPS-1232575531551357341
DB-TPS2006246423002124110214281364
OPS120394928575063721062092829548

Mysql性能

咱们首先用测试了Mysql本身的性能。在DTM的这次性能测试中,写操作较多,因而咱们这次次要对Mysql的写进行了性能测试。

咱们采纳了sysbench中的oltp_write_only基准,在这个基准中,每个事务蕴含6个写SQL(有insert/update/delete)。

在这个基准下,每秒实现的事务数量大概为2006,实现SQL数量大概为为12039。这两项后果,会在后续的DTM相干测试中援用。

DTM测试

分布式事务中波及的事务模式有多种,咱们选取一个有代表性的简略Saga模式作为代表,剖析分布式事务DTM的性能。

咱们选取的Saga事务,蕴含两个子事务,一个是TransOut转出余额,一个是TransIn转入余额。转入转出各蕴含两个Sql,别离是更新余额和记录流水。

无DTM-2SQL

咱们首先测试不采纳DTM的状况,也就是间接调用TransOut和TransIn,测试后果是每秒实现了1232个全局事务。每个全局事务蕴含转出和转入两个子事务,因而DB-TPS为2464,而后每个子事务又蕴含两个SQL,因而总的SQL操作为4928。

这个后果比照MYSQL,DB-TPS更高,而DB-SQL只有一半,次要起因为每个事务都须要将数据同步到磁盘,须要额定耗费性能,此时瓶颈次要在零碎数据库的事务能力

DTM-2SQL

咱们接着测试采纳DTM的状况,采纳了DTM之后,一个SAGA事务的时序图如下:

全局事务会包含4个事务:TransIn、TransOut、保留全局事务+事务分支、批改全局事务为已实现。将每个子事务分支批改为已实现也各须要一个事务,但DTM采纳异步写进行了合并,缩小了事务。

每个全局事务包含的SQL数量为:1个保留全局事务、1个保留分支、1个读所有分支、2个批改分支为实现、1个批改全局事务为实现,一共6个额定的SQL,加上本来子事务的4个SQL是10个。

测试后果中,每秒实现全局事务数为575,那么DB-TPS为2300,OPS为5750,比照后面不采纳DTM的计划,DB-TPS略有降落,OPS有肯定的回升,瓶颈还是在零碎数据库

DTM-2SQL-Barrier

退出了子事务屏障后,每个子事务分支会多一个insert语句,每个全局事务对应的SQL数量为12.

测试后果中,每秒实现全局事务数为531,那么DB-TPS为2124,OPS为6372,比照后面DTM的计划,DB-TPS略有降落,OPS略有回升,合乎预期

无DTM-10SQL

咱们对压测的数据做调整,将每个子事务里的SQL数量,从2调整为10,将子事务中的SQL循环执行5次。

无DTM的压测后果中,每秒实现的全局事务数为551,DB-TPS为1102,OPS为10620。这个后果中,OPS与MYSQL的靠近,瓶颈次要在数据库的OPS。

DTM-10SQL

这个压测后果中,每秒实现的全局事务数为357,DB-TPS为1428,OPS为9282,其中OPS比无DTM的状况降落了百分之十几,次要起因为DTM的表,有较多的字段及索引,每个SQL的执行开销会大一些,因而总OPS会更低。

DTM-10SQL-Barrier

测试后果中,每秒实现全局事务数为341,那么DB-TPS为1364,OPS为9548,比照后面DTM的计划,DB-TPS略有降落,OPS略有回升,合乎预期

小结

因为分布式事务须要保留全局事务和分支事务的状态,会产生额定的写,大概是每个全局事务产生额定4+n(子事务数量)个SQL操作,2个数据库事务。当业务很简略,SQL少,应用分布式事务会导致事务吞吐量降落50%;如果业务较简单,SQL多,性能大概降落35%。降落的起因次要为全局/分支事务状态的保留,产生了额定的SQL操作。

从DTM的压测后果与MYSQL的压测数据比照来看,DTM产生的额定开销很小,曾经最大化的利用了数据库的能力。

一台ecs.c7.xlarge+500G磁盘的阿里云服务器,装置mysql后,大概可能提供300~600的Global-TPS,每月费用为900元(2021年10月价格),这个老本比照提供的业务能力来说,曾经很低了。

如果您须要更强劲的性能,能够购买更高配的配置,也能够在应用层部署多组DTM,两种计划的代价并不大,足以满足绝大部分公司的需要。

欢送大家拜访https://github.com/yedf/dtm我的项目,给颗星星反对咱们的工作!