阿里云Redis实例慢查剖析

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: Redis常见超时原因分析

Redis凭借着丰富的数据类型和高并发处理能力已经成为目前最受欢迎的内存数据库,很多用户对Redis的印象就是高并发,高吞吐,低时延,殊不知Redis的性能也很“脆弱”,使用不当很容易出现性能问题。

Redis原理

Redis是一个单进程单线程的模型,网络收发包、协议处理以及命令处理都是在一个线程中完成。对每一个用户连接来说,主线程会读一批数据放到QueryBuffer中,然后尝试协议解析,每解析出一个完整的Request,就先处理,然后把Reply放到OutputBuffer中等待发出,然后再尝试解析QueryBuffer中剩下的数据,直到QueryBuffer中没有数据或者没有一个完整的Request后,处理下一个连接。
image

Redis常见慢查问题

阿里云Redis正常情况下可以达到8~10W的QPS,这意味着平均一条命令处理时间基本在微妙级。Redis的快是建立在所有操作逻辑都很快速的基础上的,实际情况并非一直这么美好。

大包

如果一个Request几十MB甚至几百MB,网络IO、协议解析都必然花更长的时间。而在TCP网络层,一个Redis Request也会分成很多个packet进行传输,任何一个包发生了超时重传,意味着这整个请求的响应时间都会变慢。

O(N)命令

Redis有不少O(N)类命令,这些操作的响应时间是和数据有关的。比如说keys命令,需要遍历内存中所有key,这期间主线程不能处理任何请求。还有hgetall这类命令,耗时取决于哈希中有多少条field+value。

流控

网络流量一旦超过规格限制会触发流控,Redis会延迟接收和处理命令,对客户端来说就会发现响应变慢了。

持久化

Redis的持久化机制不管是AOF还是RDB,都会fork一个子进程。fork系统调用本身会随着Redis内存增大而消耗更长的时间。

pipeline

部分客户端使用异步模式或者批处理模式发送命令,与之相对应的是ping-pong模式。事实上Redis并不区分ping-pong还是pipeline,不管是什么模式,在多个客户端并发访问的情况下,Request/Response无非处于这几种状态:

  1. 客户端所在机器内核socket buffer中等待TCP发送
  2. 网络传输中
  3. Redis所在机器内核socket buffer中
  4. Redis的QueryBuffer中等待协议解析和处理(pipeline)
  5. 命令处理中
  6. Redis的output buffer中
  7. 内核socket buffer中 or 网络传输中
  8. 客户端所在机器内核socket buffer中 or 等待客户端处理
    一般业务测统计的Redis响应时间是从 1 -> 8 消耗的时间,Redis测统计的响应时间只包含了 4 -> 6。

由于Redis单线程的模型,一旦有一个命令慢了,意味着后面所有命令都会变慢,以1W QPS为例,有一个hgetall命令处理消耗了100ms,从客户端的角度来说,此时在在内核socket buffer以及以及读到用户态QueryBuffer中的命令都会变慢,不仅仅是这一个命令慢了,影响的可能是1000条命令。

客户端统计问题

上面提到了pipeline模式,如果客户端使用批量发送,需要特别注意客户端统计响应时间的方式。一般来说,客户端会在发送之前开始计时,在收到Response后停止计时。事实上,在批处理模式下,这种计时是很不准确的,仔细思考一下就明白,批量发送,最后一个Request的响应时间中绝大部分都是在等待前面请求处理。

命令 说明
keys, flushadb, flushall O(N),遍历所有Key
mget, mset, del, unlink, exists O(M),带的key不宜过多
smembers O(N),返回集合中所有member,避免集合过大(大key问题)
sinter, sinterstore O(N*M),避免集合过大(大key问题)
sunion sunionstore, sdiff, sdiffstore O(N),避免集合过大(大key问题)
zunionstore, zinterstore O(NK)+O(Mlog(M)),避免有序集合过大(大key问题)
hgetall, hkeys O(N),避免哈希过大(大key问题)
lrange, ltrim, lindex, linsert O(S+N),避免列表太大(大key问题)

Redis集群

阿里云Redis集群加了一层Proxy做转发,可以带来比较好的兼容性和扩展性。
Redis Proxy是集群的访问入口,挡住用户短连接。Redis Proxy和后端Redis之间使用长连接,可以最优的发挥Redis性能。
image

兼容性

Redis Proxy可以把多key命令拆分后转发到各个Redis节点上。比如说mget key1 key2 key3,key1和key3在Redis1上,key2在Redis2上,Redis Proxy会拆分成mget key1 key3和mget key2两个命令分别转发到Redis1和Redis2上。
Redis Proxy同时支持select命令。

扩展性

Redis Proxy承担了三次握手建连接、认证的过程,同时Redis Proxy可以做到无状态,方便扩展。

Redis集群常见慢查问题

排队

Redis Proxy内核为每个user connection维护了一个Session,Session中有一个队列,按照FIFO顺序记录了所有已经收到但还没有给客户端返回的Request。
所有Request按照Key映射到各个Redis分片上,类似上图所展示的,不同Redis分片上的Request并发处理,就有快有慢,而Response必须按照FIFO的顺序给客户端返回。假如Request1比Request2慢,这也就意味着在Session中Request1必须等待Request2处理完以后一起给客户端返回。如果Request1是一个耗时100ms的hgetall命令,那么Request2也会在Session中排队等待,客户端观察到的响应时间最少也是100ms。和上面Redis类似,一个慢会影响到其他大量的Request跟着慢。
image

多key命令

上面提到过,多key命令会拆分转发到多个Redis节点,拆分的所有子命令都返回聚合以后给客户端回复,这意味着任何一个子命令波动(Redis节点有慢查,网络抖动),这个请求的命令就会变慢,这个请求变慢意味着会有其他请求在排队,都会变慢。
mget k1 k2 k3被拆分分别转发到两个Redis节点上,mget k1 k3很快处理完,mget k2因为网络抖动,或者前面有一个hgetall正在执行,100ms以后才返回,这意味着Request2, 3也都必须等待mget k2。
多key命令因为会涉及多个节点,所以更容易受到影响。
image

Redis Proxy的slowlog

上面提到Redis的Slowlog只包含了命令的实际CPU处理时间,并没有包含网络IO, 协议编解码的时间。在集群模式下,Redis Proxy的slowlog从收到并解析出用户的Request开始计算,直到给用户返回Response截止,包含了与后端Redis的网络传输,Redis的协议处理,命令处理等所有环节。

Max RT & Avg RT

阿里云Redis Proxy上会统计Avg RT和Max RT(RT就是上面提到的从收到Request到给客户端回复Reponse的时间),Avg RT就是统计周期内所有Request的sum(RT) / Request数量,Max RT则是统计周期内RT最大的那个Request。
可以看到有很多原因可能导致Redis出现慢查,如果Max RT经常飙高可以根据控制台上的各项监控排查一下是否有上面提到的问题。如果只是偶发的Max RT毛刺,在排除本身有O(N)命令导致的情况下,可以结合QPS看下发生频率,假如一个Redis集群有100W QPS,一个小时出现一次Max RT的毛刺,算下来平均10亿个请求才会出现一个,基本上在网络抖动允许范围内。

慢查定位

控制台上查看Redis服务监控,包括流量、QPS、CPU、Avg Rt、Max RT等,如果监控数据比较正常,而业务感知到和Redis监控不一致的超时,可以看下ECS测是否存在干扰、客户端统计是否合理。也可以直接在ECS层直接抓包确定是否有网络重传或者其他原因。
如果发现监控数据不符合预期,可以继续在监控上看是否有比较耗时的命令,同时也可以控制台的“日志管理”中查看慢日志,对集群来来说,慢日志包括Redis Proxy层采集的和Redis采集的,找到罪魁祸首。
如果只是频率很小的Max RT抖动,只要业务没有影响,可以忽略,如果抖动较大可以提工单排查。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
7天前
|
弹性计算 大数据 数据处理
阿里云服务器实例哪些属于入门级,哪些是企业级?有何区别?
阿里云服务器的实例规格从级别上来说分为入门级和企业级,从实例规格种类上来说,又分为突发性能型、共享型、计算型、通用型、内存型、大数据型等,2024年截止目前在阿里云的活动中,可选的云服务器实例规格有轻量应用服务器、经济型e、通用算力型u1、计算型c7、计算型c7a、计算型c8a、计算型c8y、通用型g7、通用型g7a、通用型g8a、通用型g8i、通用型g8y、内存型r7、内存型r8y等,有的新手用户不是很清楚2024年阿里云活动中的云服务器实例哪些属于入门级,哪些是企业级?有何区别?下面根据官方的各种资料介绍为大家解答下这些疑问,帮助您能更清楚地了解阿里云服务器,快速找到自己对云服务器产品的需
阿里云服务器实例哪些属于入门级,哪些是企业级?有何区别?
|
26天前
|
云安全 弹性计算 安全
电子好书发您分享《阿里云第八代企业级ECS实例,为企业提供更安全的云上防护》
阿里云推出第八代企业级ECS实例,强化云安全,搭载英特尔TDX技术,结合CIPU与飞天系统,提供高效且安全的云服务解决方案。[阅读详情](https://developer.aliyun.com/ebook/8303/116162?spm=a2c6h.26392459.ebook-detail.5.5c0b7e5aZhSJ9V)
15 2
|
10天前
|
NoSQL Java Redis
使用Redis实例搭建网上商城的商品相关性分析程序
本教程将指导您如何快速创建实例并搭建网上商城的商品相关性分析程序。(ApsaraDB for Redis)是兼容开源Redis协议标准的数据库服务,基于双机热备架构及集群架构,可满足高吞吐、低延迟及弹性变配等业务需求。
17148 0
|
2月前
|
弹性计算 网络协议 关系型数据库
ECS域名问题之国内实例能不能导入阿里云新加坡的ECS和RDS如何解决
ECS(Elastic Compute Service,弹性计算服务)是云计算服务提供商提供的一种基础云服务,允许用户在云端获取和配置虚拟服务器。以下是ECS服务使用中的一些常见问题及其解答的合集:
|
3天前
|
存储 弹性计算 运维
深度解读:阿里云服务器ECS经济型e实例配置整理和性能参数表
阿里云推出经济型ECS e系列服务器,适用于个人开发者、学生和小微企业。该系列采用Intel Xeon Platinum处理器,支持多种CPU内存配比,性价比高,2核2G3M配置只需99元/年,新老用户不限量购买且续费不涨价。提供相同可用性SLA和安全标准,具备ESSD Entry云盘等企业级特性。适合中小型网站、开发测试和轻量级应用
|
4天前
|
存储 弹性计算 运维
阿里云服务器ECS经济型e实例特点、适用场景和使用常见问题解答
阿里云新推经济型e系列服务器,适用于个人开发者、学生和小微企业。该系列基于Intel Xeon Platinum处理器,提供1:1、1:2、1:4内存比选项,性价比高,不限购,续费不涨价。2核2G3M配置只需99元/年,企业用户2核4G5M服务器199元/年。具备价格优惠、品质保障、充足供应和多样化配置等特点。支持IPv4/IPv6,仅限专有网络VPC。实例规格和性能指标详表见原文,适合中小型网站、开发测试和轻量级应用。更多信息访问阿里云ECS页面。
|
5天前
|
弹性计算 运维 Serverless
Serverless 应用引擎产品使用之在阿里函数计算中,使用阿里云API或SDK从函数计算调用ECS实例的服务如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
29 4
|
5天前
|
存储 弹性计算 运维
阿里云服务器ECS经济型e实例详细介绍
阿里云新推经济型e系列服务器,适用于个人开发者、学生和小微企业。该系列采用Intel Xeon Platinum处理器,支持多种CPU内存配比,性价比高,不限购,续费不涨价。2核2G3M配置仅需99元/年,企业用户2核4G5M服务器199元/年。具备价格优势、品质保障和充足供应,但性能可能不及企业级实例。支持IPv4/IPv6,仅限专有网络VPC。更多规格和性能指标可见官方文档。
阿里云服务器ECS经济型e实例详细介绍
|
5天前
|
消息中间件 运维 Serverless
Serverless 应用引擎产品使用之在阿里云函数计算FC中,函数的执行时间是根据实例的存活时间进行计算如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
24 0
|
5天前
|
关系型数据库 Serverless 异构计算
Serverless 应用引擎产品使用之在阿里云函数计算中使用包含GPU的实例并且镜像超过10GB了如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
27 0