ECS上自建Redis服务压测报告

背景说明

最近处理的企业大客户问题中,出现好几例都是客户通过购买ECS进行自建Redis服务,并且在使用过程中碰到一些因云环境的内部限制等原因导致客户使用中碰到服务异常或者产品性能上无法满足业务需求的情况。每次处理过程都费时费力,TAM同学一直不辞辛苦的跟进,也拉动了ECS/Redis 研发,网络,存储等同学进去排查,又是抓包又是电话会议,最终可能排查下来都是因为场景使用上的不合理,导致客户在该过程用的不爽,我们支持得也累。

这里根据目前客户通常采用的Redis主备Sentinel架构模式,在ECS 上构建Redis环境进行性能压测,提炼出一些客户自建Redis可能潜在的一些注意事项。原则上我们建议客户都采用阿里云KVStore服务,但客户非要通过自建Redis服务,我们则需要把一些注意事项说明清楚,也尽量让客户去规避这些问题。
后面我再专门写一篇文章,综合对比阿里云KVStore围绕性能、价格、维护成本、可靠性几方面进行“性价比”,以便更好践行“客户第一”。

压测主机规格情况

ECS 实例 主机IP 规格名称 CPU 内存 磁盘 区域
i-2ze29lbqp06cfaxebxur 192.168.1.130 ecs.i1.xlarge 4核 16 GB 高I/O型本地盘  104GB 华北 2 可用区 A
i-2ze7ut58w9lsgtn5icbm 192.168.1.123 ecs.gn4-c4g1.xlarge 4核 30 GB SSD云盘  20GB 华北 2 可用区 A
i-2ze7ut58w9lsgtn5icbn 192.168.1.125 ecs.gn4-c4g1.xlarge 4核 30 GB SSD云盘  20GB 华北 2 可用区 A

Redis主备Sentinel集群架构

关于Sentinel 在Redis 高可用的实现上可以参阅:https://redis.io/topics/sentinel

Redis读写性能压测方法

Redis自带了可一个时间点模拟大量客户发起大量读写请求的工具
redis-benchmark(类似于Apache的ab Tool),下面为此次压测过程使用到的执行参数:

./redis-benchmark [-h <hostname>] [-a <passwrod>]  [-t <tests>] [-c <clients>] [-d <size>] [-n <requests>] [-P <numreq>]
 
-h <hostname>      Server hostname (default 127.0.0.1)
-p <port>          Server port (default 6379)
-a <password>      Password for Redis Auth
-t <tests>         Only run the comma separated list of tests. The test
                          names are the same as the ones produced as output. 
-c <clients>       Number of parallel connections (default 50)
-d <size>          Data size of SET/GET value in bytes (default 2)
-n <requests>      Total number of requests (default 100000)
-r <keyspacelen>   Use random keys for SET/GET/INCR, random values for SADD
                                  Using this option the benchmark will expand the string rand_int
                                   inside an argument with a 12 digits number in the specified range
                                   from 0 to keyspacelen-1. The substitution changes every time a command
                                   is executed. Default tests use this to hit random keys in the
                                   specified range.
 -P <numreq>        Pipeline <numreq> requests. Default 1 (no pipeline).

e.g:
./redis-benchmark -h 192.168.1.123 -a Redis123 -t set -c 100 -d 1024 -n 1000000 -P 100

压测结果分析

开启pipeline对QPS性能的影响

从上图可看出不同规格主机在写入value size只有一字节的情况下,不会出现Asynchronous AOF fsync is taking too long这样慢盘的情况。这种场景下,我们可暂时忽略ECS 存储盘性能影响。

在不开启Pipeline的情况下,本地盘SSD和云盘SSD都在小value读写下QPS相差无几,并且CPU、内存使用率都不高。但是在开启Pipeline的情况下,本地盘SSD比云盘SSD的读写性能要高出很多。
从Redis官网的介绍来看,Pipeline即对request做队列化,Redis Server 也对相应结果做队列化后再response,详细介绍可以参阅文档里头介绍的一个Request/Response Demo:
https://redis.io/topics/pipelining

哨兵sentinel down-after-milliseconds 参数设置对大value读写影响

从上面2个图对比可看出无论是本地盘SSD和云盘SSD,在redis写入value大于1024字节的情况下都会出现Disk Slow的情况,并且在哨兵配置sentinel down-after-milliseconds 计时5秒的情况下,写入value大于2048字节情况下会触发主备切换。
在发生主备切换的时候,主机CPU和内存利用率都不算高,因此在自建redis并且写入value过大的场景下,慢盘看起来貌似是一个无法规避的问题(这一块还在调研中,还在咨询存储的专家,可能因系统参数设置不合理导致?!)。

假设上面的问题无法规避,因此这里down-after-milliseconds 参数设置就很关键,如果设置时间过长,会导致写入失败切换时间过长,这中间相当于服务不可用。如果设置时间过短,会导致主备切换后节点状态不一致,可能造成频繁做主备切换,甚至导致整个集群不可用。
Redis官方建议的配置时间为30秒,如果并发写入量较高,建议该时间可适当设置长一点。

同等规格写入的value大小和读写QPS的关系

上图我把down-after-milliseconds 参数设置为官方建议的等待30秒,我们可以看到虽然触发了多次哨兵的aof_depayed_fsync计数,但是并未触发Sentinel主备切换,那么实际应用中则需要通过应用端的重试机制保证写入成功率。
我们再看看本地盘写入流量和IO情况:

可以看到写入量BPS峰值达到87Mbit/s,峰值写IOPS达到181Count/s
而今年首推的高I/O型本地盘在512KB顺序读写应用,可提供高达300MB/s的吞吐量能力,16KB随机读写应用,可提供高达12000的随机IOPS能力;可见对磁盘压测上远远还达不到上限。

排除磁盘性能影响,可见伴随写入value的增长,相对来说读的QPS差别不是很大,但是写入的QPS会有所下降。那高I/O型本地盘怎么发挥最大性能呢?答案上面已经说了,开启pipeline。

本地连接与远程连接的QPS性能差异

上图可以看出在同等规格写入大小一致value以及不开启pipeline的情况下,通过本地压测和远程压测的读写QPS性能差异很大,明显本地压测效果会更好点,那么远程压测的性能瓶颈在哪呢?
从访问途径上差异基本可以定位是虚拟网络的限制,其中主要关注虚拟网络内网的带宽限制和收发包数限制,我们查询了下这个规格ecs.i1.xlarge对应的限制,发现该规格的限制:
内网带宽(bit/s)为0.8G,内网收发包(PPS)为10万
因此在不开pipeline,写入value为512字节的远程写入情况下,收发包已经达到上限,故QPS就上不去了。
如果开启pipeline做队列化读写,可以大幅提供读写QPS,但内网带宽达到上限,如QPS依旧达不到本地写入的效果。
但是在实际使用场景中,基本上客户自建Redis都是通过远程写入,所以我们建议客户开启pipeline并且合理控制好虚拟内网带宽和收发包数量的限制(配置云监控),已获取一个较高的读写性能。

其他所有实例规格限制官方文档查询:
https://help.aliyun.com/document_detail/25378.html?spm=5176.doc52559.2.1.rZvgXZ#MN4

总结

客户购买ECS自建Redis Sentinel集群的情况下,推荐客户购买的ECS单独挂载使用高I/O型本地数据盘,并且对于高并发大量写入的情况下,建议设置哨兵down-after-milliseconds 大于15秒;如果写入value过大,需要留意ECS 实例规格对内网带宽和内网收发包数量的限制,建议开启pipeline实现更高的读写性能。

时间: 2024-10-01 14:37:36

ECS上自建Redis服务压测报告的相关文章

在ECS上自建MySQL手工容灾环境

1.环境介绍 很多云上的客户因为数据库规模小,可能最开始只购买了ECS,而他们也需要数据库服务器,很可能会采用自建MySQL来实现.阿里云RDS已经提供了完全的数据库运维服务,包括监控.优化.主备高可用等.而对小白用户来说,为了自己业务连续性和学习的需要,也是很有必要了解如何自建MySQL主备以及主备切换流程的.在主从复制实施前,单机单实例缺乏实时数据复制方案来保证实例出现故障时提供另一个完好且独立的实例迅速切换,短时间内恢复客户业务. 2.数据库主从复制实施 2.1.主从复制原理 MySQL提

yanf4j 1.0-stable的一个压测报告

    采用的是jboss netty的benchmark,环境是两台linux机器,都是4核16G内存以及2.6内核,网络环境是公司内网,带宽是1Gbps,JDK1.6.0_07.对比的是mina 2.0M6和yanf4j 1.0-stable,两者都在压到16K,5000并发的时候客户端退出,因此后面给出的图有个16K的在5000并发为0,事实上只是几个连接失败,但是benchmark client就忽略了这个数据.实际过程还测试了1万并发连接的情况,但是由于测试客户端很容易退出,因此最后还

后端服务性能压测实践

后端服务性能压测实践 标签(空格分隔): 性能 压测 后端服务 压测实践 作者:王清培(Plen wang) 背景 环境检测 压力机及压力工具检测 Linux openfiles limit 设置 排查周边依赖 空接口压测检测 聚合报告中 throughput 计算 压测及性能排查方法 关注各纬度 log Linux 常规命令 性能排查两种方式(从上往下.从下往上) 总结 背景 最近大半年内有过两次负责性能压测的一些工作.一件事情做了一次可能还无法总结出一些东西,两次过后还是能发现一些共性问题,

性能测试 PTS 铂金版来袭!阿里云发布T级数据压测的终极秘笈

无限接近真实流量的全链路压测,具备超高并发能力,多维动态支持压测场景下的多变环境,1分钟即可设置简单压测场景--这个神奇的压测"黑科技"就是PTS铂金版! 有别于PTS企业版,PTS铂金版具有完全不同的出身,说起它,不得不从阿里巴巴每年的全球剁手党狂欢-双11说起.因为和其他APM服务商不同,阿里云的压测解决方案-性能测试服务 PTS 脱胎于阿里巴巴内部平台,而这个内部平台堪称双11保障的核武器.在经过超高峰值.超高复杂度的千锤百炼后,PTS铂金版正式对外输出,让广大企业级用户能用最低

全链路压测-大促备战核武器

全链路压测被誉为大促备战的"核武器",如果之前有关注过阿里双11相关的技术总结,对"全链路压测"一定不会陌生,这个词的出场率几乎100%,从对双11稳定性的价值来看,用"核武器"来形容全链路压测毫不为过. 1. 背景 时间:2016年10月29日凌晨:地点:阿里西溪园区1号楼7楼"光明顶":事件:200多人聚在一起,精神抖擞,摩拳擦掌.这阵势,是要去约群架吗?别紧张,他们只是在进行一次双11的模拟演习-全链路压测. 历年的双1

详解双11终极“核武器”:全链路压测如何诞生?

本文内容来自阿里巴巴集团双11技术团队撰写的<尽在双11:阿里巴巴技术演进与超越>一书.该书被阿里巴巴集团CTO行癫盛赞为"迄今为止对双11技术演进最客观.最详实的还原",目前正在全国火热销售中. 全链路压测被誉为大促备战的"核武器".如果之前关注过阿里双11相关的技术总结,对全链路压测一定不会陌生,这个词的出场率几乎是100%,从对双11稳定性的价值来看,用"核武器"来形容全链路压测毫不为过. 背 景 历年的双11备战过程中,最大的

记5.28大促压测的性能优化—线程池相关问题

目录: 1.环境介绍 2.症状 3.诊断 4.结论 5.解决 6.对比java实现 废话就不多说了,本文分享下博主在5.28大促压测期间解决的一个性能问题,觉得这个还是比较有意思的,值得总结拿出来分享下. 博主所服务的部门是作为公共业务平台,公共业务平台支持上层所有业务系统(2C.UGC.直播等).平台中核心之一的就是订单域相关服务,下单服务.查单服务.支付回调服务,当然结算页暂时还是我们负责,结算页负责承上启下进行下单.结算.跳支付中心.每次业务方进行大促期间平台都要进行一次常规压测,做到心里

系统稳定性保障核武器——全链路压测

为什么要做全链路压测? 对阿里巴巴而言,每年最重要的一天莫过于双11.这是因为在双11的零点,系统会遭遇史无前例的巨大洪峰流量冲击,保证双11当天系统的稳定性对高可用团队来说是巨大的挑战.在这个挑战中会有很多不确定因素,大致分为两方面: 技术架构带来的不确定性,阿里在08年开始对系统进行拆分,由原有的单一系统拆分成了分布式架构,包括CDN.网关.负载均衡.分布式页面系统等,整体的技术生态十分丰富.分布式环境任意环节出了问题都可能会对系统造成影响: 业务发展带来的不确定性,系统的可用性随着业务增长

在阿里云容器服务上创建Spring Boot应用之压测篇

  Spring Boot框架的第一个稳定版本是在2014年由Pivotal发布的,该框架的宗旨在于为基于Spring的Web应用提供快速设计开发,并追求小而美.约定胜于配置.快速开发.自包含且便捷.Spring Boot当前开发中的版本是1.4.   上一篇文章"在阿里云容器服务上创建第一个Spring Boot应用",讲述了如何通过Maven的Docker plugin上传镜像到阿里云的容器Hub,并通过阿里云的容器服务快速在云环境创建应用.本文将描述下,如果在阿里云环境里继续对这