每秒1w+分布式事务--dtm的Redis存储性能测试分析
概述
之前dtm给出了Mysql作为存储引擎的性能测试报告,在一个普通配置的机器上,2.68w IOPS,4核8G机器上,能够支持大约每秒900+分布式事务,能够满足大部分公司的业务需求。
此次带来的是Redis存储引擎的测试报告,在一个普通配置的机器上,能够达到大约10800每秒的分布式事务能力,对比Mysql存储,有10倍左右的性能提升,满足绝大部分公司的业务需求。
下面我们来详细说明测试的步骤,并分析其中影影响性能的各个因素。
测试环境
下面的服务器都来自阿里云,地区为东京(外网访问比较方便)
Redis服务器:ecs.hfc6 4核8G CPU主频为3.1 GHz/3.5 GHz 内网收发包50万PPS ubuntu 20.04
两台应用服务器:ecs.hfc6 8核16G CPU主频为3.1 GHz/3.5 GHz 内网收发包80万PPS ubuntu 20.04 redis5.x
测试步骤:
准备好Redis
注意:涉及应用服务器的,那么两台服务器都需要进行相关操作
在应用服务器上面准备好Redis,这次因为考虑到极限性能,因此不采用docker安装,而是采用apt install 安装,运行如下命令
apt update
apt install -y redis
# 修改/etc/redis/redis.conf,找到其中的bind,改为bind 0.0.0.0
systemctl restart redis-server
复制代码
配置应用服务器
apt update
apt install -y git
git clone https://github.com/dtm-labs/dtm.git && cd dtm && git checkout 5907f99 && cd bench && make
复制代码
配置dtm
修改 dtm目录下的conf.sample.yml,配置使用Redis,例如:
Store:Driver: 'redis'Host: 'redis ip'Port: 6379# 另外再把ExamplesDB里面的配置删除,因为我们没有安装mysql
复制代码
启动bench服务器
LOG_LEVEL=warn go run bench/main.go redis
启动测试
ab -n 1000000 -c 10 "http://127.0.0.1:8083/api/busi_bench/benchEmptyUrl"
获得结果
我这看到ab的结果显示,每秒完成的操作数量两台应用服务器加总为10875
Redis性能分析
我们首先来看Redis本身的性能,影响它的因素是哪些,先看下面的这些测试数据:
redis-benchmark -n 300000 SET 'abcdefg' 'ddddddd'
每秒完成的请求数10w
redis-benchmark -h 内网其他主机IP -p 6379 -n 300000 SET 'abcdefg' 'ddddddd'
每秒完成的请求数10w
从这上面的两个结果看,本地Redis测试和远程Redis测试,性能差异并不明显。我也测试过其他更多的命令,也未发现明显差异,因此下面主要就测试本地Redis性能,不再比较本地和远程的差别。
redis-benchmark -n 300000 EVAL "redis.call('SET', 'abcdedf', 'ddddddd')" 0
Lua脚本每秒完成的请求数10w
redis-benchmark -n 300000 EVAL "redis.call('SET', KEYS[1], ARGS[1])" 1 'aaaaaaaaa' 'bbbbbbbbbb'
Lua脚本每秒完成的请求数10w
redis-benchmark -n 3000000 -P 50 SET 'abcdefg' 'ddddddd'
走Pipeline的话,每秒完成的请求数150w,这个性能对比单个Set操作有大幅提升。从这个数据和单个操作的对比看,Redis本身内存操作开销不大,很多的开销花在了网络IO上,因此批量任务能够大幅提升吞吐量
redis-benchmark -n 300000 EVAL "for k=1, 10 do; redis.call('SET', KEYS[1], ARGS[1]); end" 1 'aaaaaaaaa' 'bbbbbbbbbb'
我们在Lua内部,连续执行10次Set,每秒完成的请求数6.1w,和只执行1次Set差别没有很大。这个结果在我们的预期之内,因为前面Pipeline的结果显示Redis的内存操作开销大幅小于网络。
dtm性能分析
dtm需要跟踪全局分布式事务的进度,我们以Saga举例,大概涉及以下操作:
- 保存事务信息,含全局事务、事务分支、还有查找过期事务的索引,dtm用一个Lua脚本来完成这些操作
- 每个事务分支完成时,修改事务分支状态。由于修改状态时,需要确认全局事务未回滚,避免回滚中的事务还往前执行,因此dtm也用一个Lua脚本来完成
- 全局事务完成,修改全局事务为成功,此时也需要避免已超时回滚中的事务被覆盖,也是一个Lua脚本
那么一个具备两个事务分支的全局事务在Redis上的理论开销大约是4个Lua脚本的开销,那么从前面每秒能够完成大约6w个简单Lua脚本来看,每秒最理想能够完成1.5w个分布式事务。由于实际的Lua脚本比我们测试的更复杂,传输的数据量更大,因此最终每秒完成1.08w个事务,已经是差不多的性能极限值。当达到1.08w每秒的事务性能时,观测到Redis的CPU已经是100%,到了性能瓶颈。
展望
每秒1w事务已经是非常高的性能,足够应对绝大多数的场景。包括消息队列、秒杀等。
当Redis能够支撑这么大的事务量时,如果是长时间这么大的事务量,那么redis的存储空间很快就不够了,后续可能添加选项,允许及时清理掉已完成的事务
未来dtm的性能是否还能提高?我们可以从两方面看:
一个是在目前单进程的情况下,dtm能够达到1w事务每秒,在redis6.0上,官方的数据显示,4CPU性能大约提升150%,这样的话dtm预计能够支撑2.5w事务每秒。
另一个是dtm往集群的方向发展,提供集群能力,允许动态扩容等。这方面需要看未来的使用情况,再做相关规划。
项目地址
关于分布式事务更多的理论知识与实践看下方
每秒1w+分布式事务--dtm的Redis存储性能测试分析相关推荐
- 解析redis存储结构丨 redis与mysql存储对比丨redis存储原理分析
90分钟视频讲解搞懂redis存储原理 1. redis与mysql存储对比 2. redis存储原理分析 3. redis存储与持久化的关系 [后端开发系列]解析redis存储结构丨 redis与m ...
- 关于分布式事务: 阿里开源的分布式事务框架 Seata 和 LCN的分析
之前使用过LCN分布式事务, 最近看到面试者简历中另一种方案 Seata, 通过它来在实战中解决分布式事务的问题.故 去简单了解了一下Seata是什么, 和LCN的区别在哪里, 如果是你 你怎么选择解 ...
- 那些用Go实现的分布式事务框架之DTM
图片拍摄于2021年12月04日 山东青岛 我爱这座城市 开篇 上一篇那些用Go实现的分布式事务框架我们主要介绍的是seata-golang.一个对标seata的go语言实现,当然版本还是落后Java ...
- Spring Cloud Alibaba微服务项目中集成Redis实现分布式事务锁实践
引言 我们知道同一个进程里面为了解决资源共享而不出现高并发的问题可以通过高并发编程解决,通过给变量添加volatile关键字实现线程间变量可见:通过synchronized关键字修饰代码块.对象或者方 ...
- mysql平台workb_MySQL分布式事务
一.分布式事务 在说分布式事务(XA)之前,可以先看一下"以交易系统为例,看分布式事务架构的五大演进",阐述了分布式事务解决了什么问题? InnoDB存储引擎提供了对XA事务的支持 ...
- 【华为云技术分享】HDC.Cloud|华为云Stack大咖说:如何实现微服务架构下的分布式事务
离华为开发者大会2020(Cloud)开幕仅剩一月左右,让开发者们和华为大咖近距离沟通的扫地僧早午餐会也已经开放预约.但是,有些小伙伴们已经等不及到二月了,别急,福利这不就来了吗!华为云Stack混合 ...
- 《深入理解分布式事务》第二章 MySQL 事务的实现原理
shua# <深入理解分布式事务>第二章 MySQL 事务的实现原理 文章目录 一.Redo Log 1.Redo Log 基本概念 2.Redo Log 基本原理 3.Redo Log ...
- 分布式系统(三) 分布式事务服务搭建
分布式系统(三)分布式事务服务搭建(入门) 接着前面说的分布式事务,本章节是用来记录分布式事务的服务的一个搭建过程 1.微服务环境准备 服务注册配置中心:nacos 服务调用和负载均衡:OpenFei ...
- RXA-Thanos是一个SpringCloud 分布式事务解决方案
Rxa-Thanos RXA-Thanos是一个SpringCloud 分布式事务解决方案,基于Redis框架发布订阅方式通信,汲取了XA两阶段提交和最大努力一阶段提交等思想,倾向于强一致性事务 1. ...
最新文章
- 关于DWG文件转换成PDF
- 【论文写作分析】之一 《基于混合注意力Seq2seq模型的选项多标签分类》
- a与a:link、a:visited、a:hover、a:active
- webgl 着色器_如何在WebAssembly中使用WebGL着色器
- 进入opencv内部函数调试
- Globe宣布将在Balancer拍卖14,000,000枚GDT代币
- 【mysql】mysql常用语句
- 实验一 组合逻辑电路的设计与测试
- postman常用断言
- html不支持lang属性,html的lang属性学习笔记
- C++数组求和:关于accumulate函数的使用,简化编写代码量的方法
- java 新浪 发送邮件_发邮件时终于可以通过sina的smtp验证了
- 数据库关系图—sql
- MyBatis官方文档-Java API
- html窗口最小宽度和高度,html设置尺寸大小的方法
- 不用迭代算法而快速实现的jsp树结构
- alex股票查询小程序练习
- centos 虚拟机glibc升级_CentOS 6.5升级Glibc
- sparksql hive mysql_SparkSql 整合 Hive
- 《让子弹飞》系列——杀人不眨眼的老四
热门文章
- USEARCH11新功能——OTU表抽平otutab_rare
- 史上最详细的微生物扩增子数据库整理
- R语言str_subset函数和str_which函数:str_subset函数提取字符串向量中所有包含匹配字符的字符串、str_which函数返回字符串向量中所有包含匹配字符的位置(索引)
- R语言将dataframe长表转化为宽表实战:使用reshape函数、使用tidyr包的spread函数、使用data.table
- 如何从Oracle数据库中的表中获取列名(字段名)列表?
- java data使用_@Data注解详解及使用方法-Fun言
- java 画笔粗细_用JAVA做个画笔,有画笔和橡皮功能就行。越简单越好
- DNA RNA 蛋白质
- 数字图像处理笔记二 - 图片缩放(最近邻插值(Nearest Neighbor interpolation))
- github用相对路径显示图片_url-图像未显示在GitHub的README.md中