

每秒1w+分布式事务--dtm的Redis存储性能测试分析
source link: https://studygolang.com/articles/35390
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

每秒1w+分布式事务--dtm的Redis存储性能测试分析
yedf · 2天之前 · 149 次点击 · 预计阅读时间 3 分钟 · 大约8小时之前 开始浏览之前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往集群的方向发展,提供集群能力,允许动态扩容等。这方面需要看未来的使用情况,再做相关规划。
关于分布式事务更多的理论知识与实践,可以访问以下项目和公众号:
https://github.com/dtm-labs/dtm
关注【分布式事务】公众号,获取更多分布式事务相关知识,同时可以加入我们的社群
有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:701969077
Recommend
-
65
摘要: 原创出处 http://www.iocoder.cn/MyCAT/xa-distributed-transaction/ 「芋道源码」欢迎转载,保留摘要,谢谢!本文主要基于 MyCAT 1.6.5 正式版1. 概述2. XA 概念3. MyCAT 代码实现3.1 JDBC De
-
55
-
60
欢迎关注个人公众号:石杉的架构笔记(ID:shishan100)周一至周五早8点半!精品技术文章准时送上!“上一篇文章我们聊了聊Redisson这个开源框架对Redis分布式锁的实现原理,如果有不了解的兄弟可以看一下:拜托,面试请不要再问我Redis分布式锁的
-
10
2020 年 11 月,我们开始了一次大规模的迁移,将 PostgreSQL 集群从 9.6 版本升级到 12.4 版本。在这篇文章中,我将概要地介绍下我们在 Coffee Meets Bagel 采用的架构,带你看一下我们在累计停机时间不到 30 分钟的情况下完成升级所采取的步骤,...
-
6
深度剖析分布式事务性能 yedf · 大约6小时之前 · 11 次点击 · 预计阅读时间 4 分钟 · 大约8小时...
-
7
华为云苏光牛:未来分布式数据库凭事务+存储破局,HTAP是特性但非万能丨新创访谈 新创访谈 2022-01-25 09:49:26 承...
-
3
分布式事务的性能设计 精选 原创 key_3_feng 2022-11-04 16:52:46...
-
6
源码分析 hashicorp go-memdb 存储的事务及索引的设计实现原理 – 峰云就她了
-
6
Intel新一代超算安装完成 最大性能每秒2百亿亿次计算 ...
-
2
一、测试目的验证 AngusTester 在 HTTP 协议基准测试(最小延迟小于1毫秒)时的性能表现。演示 AngusTester 图形化界面(GUI)测试的一般步骤。命令行(CLI)方式测试过程和结果请查看:
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK