Redis异常排查实战:从问题定位到性能提升,助你成为技术领域的佼佼者!腾讯云开发者社区

在岁月静好的一天,正当笔者准备下班工作的时候,突然,告警出现了!

嗯,又是一到下班就会告警!

看来是A模块的B阶段的处理耗时突然慢了

赶紧确认反向查询哪里出了问题,因为B阶段不是A模块的第一个阶段,所以基本排除是模块间的网络通信、带宽等问题

那这里有两个思路:

首先排查A模块本身的问题,这里的经验是

横向看基础指标,纵向看代码变更

1.1先看A模块服务的基础资源数据

内存正常

CPU正常

1.2再看所在Node节点的负载情况

Node负载正常,而且一般Node有问题,不会单服务出现问题

1.3再看磁盘占用情况

存储节点一切正常

看起来,CPU、内存、网络IO、磁盘IO几个大的指标没有明显的变化

1.4那是不是最近发布出现的问题呢?

经对项目成员对齐,A模块近期也没有进行发布

再排查下数据量的问题

2.1那再看看有没有是不是数据量出现问题?

嗯,上报量确实增加了5倍,既然这样:

问题解决了!

舒服!下班!

然后,在一个寂寞无人的深夜里,笔者突然惊醒!

问题当时虽然解决了,但其实并没有真的确认根本原因,数据量也许只是一个引子,这里会不会有性能优化的点呢?

在降本增效的大背景,性能优化在服务端更是一个重要的目标

于是,笔者翻身起床,又进一步的研究了一下

既然,问题出在A模块的B阶段

那首先进行细化,到底哪个方法出现了这么就耗时

排查耗时这里也有两个思路

一般来说,先用业务打点确认大概范围,然后通过性能分析工具精确确认问题点

之所以这样是因为有两个原因,

一是业务代码一般是造成问题的主要原因,在业务代码进行有效打点,可以更快的确认问题范围、变更范围、责任范围,从而可以有明确的责任人去跟进

二是一般来说性能分析工具排查都会定位到一些组件函数、系统函数,所以可能有很多个调用者、先用耗时打点的方式确认范围,可能更小的范围确认调用者,也就是疑似点,这样组合起来会比较

1.先打点确定业务范围

1.1首先是修改了一下指标上报的代码,在监控面板上查看

1.2然后是在模块的日志中进行耗时采集和输出:

结果都基本上定位到函数是redis的计数自增逻辑

至于为什么采用两种方法进行确认,是因为,实际业务会比较复杂,很多函数并不是线性调用,获取正确且精确耗时并不容易,需要多种方案去确认

2再用性能分析工具去定位精确函数

Doublecheck!

你看,我就说这个班没有白加

我们把问题从“数据量突增”转换到“Redis可用性”上来

嗯,这里我擅长!

毕竟,我们都喜欢把问题规约到以前解决的问题中(并没有)

既然是Redis的问题,我们就看看到底如何排查Redis服务

首先,我们的问题是:Redis服务请求的回包慢

这里的思路是:Redis服务本身问题——Redis数据存储问题——请求Redis的问题

一般来说业务出现问题的可能性>服务本身出现问题的可能性

单由于,业务模块没有太多变动,所以这次先查服务本身

1.Redis服务本身问题——Redis所在节点网路延迟问题确认

按照理论上来讲,应该首选确认是Redis服务本身的问题,还是节点网络的问题

可以看到,事实上,即使到物理硬件层,网络的延迟还是有的但不大,但加上Redis所在机器上的带宽限制和网桥性能等问题,这个问题可能会到达不可忽略的地步

事实上,在这个案例中,基本排除是节点网络的问题,

一是,当数据量下降的时候,redis的回包耗时减少。

二是,Redis服务是集群内服务,通过监控发现,内网带宽并没有突破限制

2.Redis服务本身问题——Redis自身服务网路延迟问题确认

对于单实例:这里有两个比较经典的命令

2.1redis-cli-h127.0.0.1-p6379--intrinsic-latency60

即在Redisserver上测试实例的响应延迟情况

可以看到,还是响应还是挺快的

不过,这个是一个瞬时速度,需要现场抓,所以在复现问题上来说,不是那么的好用,所以可以稍微调整下命令

2.2redis-cli-h127.0.0.1-p6379--latency-history-i1

可以看到,也没啥问题

2.3吞吐量(使用infostats)

具体含义如下:

#从Rdis上一次启动以来总计处理的命令数total_commands_processed:2255#当前Redis实例的OPS,redis内部较实时的每秒执行的命令数instantaneous_ops_per_sec:12#网络总入量total_net_input_bytes:34312#网络总出量total_net_output_bytes:78215#每秒输入量,单位是kb/sinstantaneous_input_kbps:1.20#每秒输出量,单位是kb/sinstantaneous_output_kbps:2.62其实看到这里,相信很多同学会发现,这个吞吐量要是有时序图好了,嗯,事实上,这也就是为啥很多服务要配置Prometheus的原因:

对于多实例:还要考虑主从同步的问题

使用infoReplication命令

不过一般用上了主从同步这一套,基本上业务就会比较重了,运维同学也会在早期建立起监控

回到问题,这里服务没有用主从同步的方式,所以,这里的疑似点排除

3.Redis服务本身问题——CPU、Memory、磁盘IO

可以看到CPU比较高,快到了90%

这里补充一个知识点:

cpu这里,除了上面的内容外:

used_memory_rss_human:表示目前的内存实际占用——表示当前的内存情况

used_memory_peak_human:表示内存峰值占用——表示曾经的内存情况(主要是用来抓不到现场的时候查问题用的)

这里其实隐含了一个知识点:

作为内存型数据库,磁盘也是一个关键点:这里包含了两个方面(1.持久化2.内存交换)

查询的信息有这个几个:

还有一个比较特殊:latest_fork_usec,这个基本上是跟宿主机的关系比较大,如果耗时较久,一般会出现在ARM等机器上

内存交换这里其实也是一个关键点:

一是最大内存限制maxmemory,如果不设这个值,可能导致内存超过了系统可用内存,然后就开始swap,最终可能导致OOM

二是内存驱逐策略maxmemory-policy,如果设了maxmemory这个值,还需要让系统知道,内存按照什么样策略来释放

这里补充个知识点Reids4.0之后可以将驱逐策略放在后台操作,需要这样设置

lazyfree-lazy-evictionyes三是驱逐数:evicted_keys,这个可以通过infostats查看,即采用驱逐策略真正剔除的数据数目

四是内存碎片率,在上面的引用已经给出了,内存碎片率低的情况下可能导致swqp

你看,这里其实是内存和磁盘IO的联动点

回到问题

从上面的截图可以看到,除了CPU外,基本指标是正常的(maxmemory虽然没设,但内存远没到限制)

那么再来查查Redis数据存储的问题

1.Redis数据存储的问题——key的总数

命令为infokeyspace,主要是redis实例包含的键个数。

这里可以看到,总key的数目是没有超过限制的,问题点不在这

2.Redis数据存储的问题——Bigkey、内存大页

总之就是查询和删除容易造成堵塞,所以要专门看一下,当然这里还有一个关联的知识点:

内存大页:

内存页是用户应用程序向操作系统申请内存的单位,常规的内存页大小是4KB,而Linux内核从2.6.38开始,支持了内存大页机制,该机制允许应用程序以2MB大小为单位,向操作系统申请内存

具体命令:redis-cli-h127.0.0.1-p6379--bigkeys-i0.01

可以看到,没有bigkey,内存大页也没开启,问题点也不在这里

3.Redis数据存储的问题——key集中过期

看不清的话,就点上面的链接

不过,这里与这个问题应该关系不大,因为如果是过期问题,不会仅出现在数据量大的情况发生,应该是“周期性出现”,所以问题点也不在这里

既然不是数据本身的问题,那再看看是不是访问的问题

1.请求Redis的问题——客户端连接数、阻塞客户端的数

这里可能会奇怪,为什么查这个数据,一般业务服务链接redis的请求不是通过客户端,嗯,就是因为问题很少可能出现在这里,所以先查这里

连接数430个、阻塞数0个,没有超过限制,所谓问题不在这里

阻塞的经典函数包括:BLPOP,BRPOP,BRPOPLPUSH

2.请求Redis的问题——慢命令

即查看请求的命令耗时多久

如下图:

第一个命令是指保留慢命令的条数:128

第二个命令是慢命令的标准1000毫秒

第三个命令是查看慢命令的top2和top3

第一个值是id

第四个值是执行的命令

3.请求Redis的问题——缓存未命中

这里主要是看infostats的两个值:

不过这里并不是这个问题的重点,通过梳理业务逻辑得知,并没有未命中就去持久化数据库再去查询的逻辑

4.请求Redis的问题——Hotkey

反过来,会不会是访问了某个点太多次了,在redis4.0.3之后,可以查hotkey的情况

当然,要先把内存逐出策略设置为allkeys-lfu或者volatile-lfu,否则会返回错误:

这里有个小细节,笔者负责的模块是redis4.0.0,刚好没有hotkey监控,然后笔者尝试升级了redis到5.0.0

依然也没有,最后发现还需要升级业务服务的redis的组件库(pakeage)

还好,笔者的负责的服务自己构建了一个热度统计

嗯,看起来hotkey的问题确实存在,好,我们继续

经过以上三个方面的排查:

我们发现:CPU高、hotkey明显

这里隐含了一个点:与CPU相对的是OPS并没有很高

也就是说,虽然Redis很忙,但似乎并没有很高的服务产出——对,这句话用在工作上有时也挺合适

一般遇到这个情况,我们就要仔细分析下,到底Redis的CPU消耗在哪里了

这里就要仔细分析下Redis的服务架构了

Rrdis6.0之前,主要采用的单线程模式,为什么采取单线程

官方的回答是:

核心意思是:CPU并不是制约Redis性能表现的瓶颈所在,更多情况下是受到内存大小和网络I/O的限制,所以Redis核心网络模型使用单线程并没有什么问题,如果你想要使用服务的多核CPU,可以在一台服务器上启动多个节点或者采用分片集群的方式

使用了单线程后,可维护性高,多线程模型虽然在某些方面表现优异,但是它却引入了程序执行顺序的不确定性,带来了并发读写的一系列问题,增加了系统复杂度、同时可能存在线程切换、甚至加锁解锁、死锁造成的性能损耗。

回到正题

对于文件事件来说结构图是下图

单线程处理逻辑是:

图中的蓝色部分是一个事件循环,是由主线程负责的,可以看到网络I/O和命令处理都是单线程,所以看起来这里会有挺多的网络IO在里面,那这里会不会有坑呢?

指出:

但随着越来越复杂的业务场景,有些公司动不动就上亿的交易量,因此需要更大的QPS。常见的解决方案是在分布式架构中对数据进行分区并采用多个服务器,但该方案有非常大的缺点,例如要管理的Redis服务器太多,维护代价大;某些适用于单个Redis服务器的命令不适用于数据分区;数据分区无法解决热点读/写问题;数据偏斜,重新分配和放大/缩小变得更加复杂等等。

提高网络IO性能,典型的实现比如使用DPDK来替代内核网络栈的方式

使用多线程充分利用多核,典型的实现比如Memcached。

协议栈优化的这种方式跟Redis关系不大,支持多线程是一种最有效最便捷的操作方式。所以总结起来,redis支持多线程主要就是两个原因:

可以充分利用服务器CPU资源,目前主线程只能利用一个核

多线程任务可以分摊Redis同步IO读写负荷

咦,这里是不是就是问题的关键呢?

笔者负责的Redis的版本是5.0

且QPS这里也比较符合

而Redis6.0以前的单线程网络IO模型的处理具体的负载在哪里呢?虽然Redis利用epoll机制实现IO多路复用(即使用epoll监听各类事件,通过事件回调函数进行事件处理),但I/O这一步骤是无法避免且始终由单线程串行处理的,且涉及用户态/内核态的切换,即:

那如何确认这里的猜测呢?

按照先Demo确认——再模拟线上服务的方式

既然是网络IO多,那怎么减少网络IO呢?

两个方案:一个是pipeline、一个是Lua脚本

这里

这里就会比较麻烦,因为一到线上,数据链路就会比较长

我们先简化一下服务链路

从质量同学的角度上看:压测讲究的事是全链路模拟,不然就无法做上线前的最后的质量守护

两个角度都没有问题,事实上,笔者认为,只有从两个角度看问题,才能更好的平衡质量和效率

1.首先将kaf装在了kafka的一个服务中

2.然后抓取线上的数据30条(之所以抓的这么少,是因为线上就是hotkey的问题,这里模拟的就是大量相似数据访问的场景)

3.使用kaf给到10000次的生产数据

catxxx-test|kafproducekv__0.111-n10000-bqapm-tencent-cp-kafka:9092

结果,压力不够

foriin{0..8};docatxxx-test|kafproducekv__0.111-n10000-p${i}-bqapm-tencent-cp-kafka:9092;done

结果,压力还是不够

那就将kaf装在每一个kafka的服务中

结果:

有效果,但Redis的CPU还是不是很高

看下监控

啊,服务Y的CPU一直也不高,看来,服务Y并没有感受到压力

给服务Y加协程,CPU上来了

但内存提前满了

加内存

这里其实也是一个资源调优的经验,事实上,一个服务的内存和CPU的比例关系需要结合线上的负载来看,而且要定期看,不然也会导致资源浪费

好的,CPU和内存都调整了,搞起!

终于,Redis的CPU上去了!

看下OPS

嗯,OPS低、CPU高,问题复现了!

果然:hotkey其实就会导致cpu变高,而这时,因为大量的cpu都在数据切换和存储上,导致其他的请求比较慢

现象对上了!

那如何解决呢?

也是三板斧:

1.如果是多实例的话,就是经典的读写分离!

2.如果是单实例的话,就使用pipeline批量写入

3.如果pipeline无法满足业务的话,就在业务服务只加一层缓存

THE END
1.必修1《技术与设计1》2017年单元测试卷(1)高中通用试卷一、选择题(共20小题,每小题2分,满分40分)1.如图所示的家庭光伏发电设备,光伏组件吸收太阳光后产生直流电,逆变器将直流电转化为交流电供家庭使用,多余电量可上传至公共电网中.下列关于该发电技术的说法中正确的是( ) A.所发的电既可家用,又可上传电网,体现了技术的综合性 B.光伏发电受天气影响,体现了技术的https://www.jyeoo.com/sj/4b72f014-c4a5-475a-a192-0a99cbeb26c9
2.测试答案人工智能与科学之美智慧树知到答案1答案: 【错】 5、AI 技术越来越复杂,AI开发与应用的门槛却越来越低。企业AI部署将呈现自动化、便捷化,“普惠AI”时代来临。 A:对 B:错 答案: 【对】 绪论 单元测试 1、2016年被称为人工智能元年。( ) A:对 B:错 答案: 【 对 】 第一章 单元测试 http://www.ppkao.com/wangke/daan/8b746a1c3db54b7bbd689703dd47f3e7
3.计算机科学与技术(080901)历年真题模拟试题及答案计算机科学与技术(080901) [切换] 每日一练 历年真题 试题库 错题库 试题收藏 测试记录 学员专用 章节练习 模拟试卷 知识点练习 高频考点 高频错题 论文范文 热门试卷 00910《网络经济与企业管理》真题及答案解析(2020.10) 541 发布时间:2021-07-23 00910《网络经济与企业管理》真题及答案解析(https://wx.xisaiwang.com/tiku2/idx-1517.html
4.管理会计实验及答案(精选6篇)与室间质量评价相比,实验室比对的优势? 是指按照预先规定的条件,由两个或多个实验室对相同或类似检测物品进行检测的组织、实施和评价,从而可以得到参加EQA所获得的相似信息。优势:消除或减少基质效应;能够评估与分析前处理过程相关的各种因素 5.实验室比对操作的评价标准是什么? 篇3:会计模拟试题及参考答案 一、单项https://www.360wenmi.com/f/fileel14kjdv.html
5.?计算机科学与技术专业培养方案(2022)长沙理工大学计算机科学与技术专业坚持立足湖南,面向全国,“以学生为中心”的办学理念,秉承“博学、力行、守正、拓新”校训,致力于国家与地方经济建设和行业发展需要,围绕厚基础、宽口径、高素质、强能力的人才培养目标,不断深化教育教学改革,培养具有家国情怀、国际视野、创新思维、自我学习和适应社会发展的复合型高素质https://www.csust.edu.cn/jtxy/info/1148/21434.htm
6.LeetCode算法解析:全面掌握编程挑战与面试技能简介:LeetCode作为一个在线编程平台,提供了丰富的算法问题,帮助程序员提升编程技能和面试准备。内容覆盖了多种计算机科学领域,包括数据结构和算法,以及各类编程难题。解决这些问题有助于深化对编程语言、数据结构和算法的理解,并提高系统设计和软件开发能力。本解析可能会包含一个名为“leetcode-master”的开源项目,该项目https://blog.csdn.net/weixin_33506815/article/details/142219630
7.25个计算机科学技术面试题与答案51CTO博客25个计算机科学技术面试题与答案 21CTO导读:有关计算机科技技术相关工作面试的最好的是问技术问题,并不是很难预测。如果你想加入程序员或IT开发相关工作,应该对该领域有足够的了解,并掌握牢固的计算机科学基础知识。本文汇总每个计算机科学专业的学生应该知道的25个最常见和最重要的面试问题。https://blog.51cto.com/u_15127566/2665437
8.运动训练学试题及答案6篇(全文)2、领导群体中的成员,必须有明确的分工,使职责与权力相称。 五、论述题:(2题计40分) 1、什么是领导决策体制?科学的领导决策体制应该如何设置? 2、试论领导个体素质提高的基本途径。 西南民族大学 2009级行政管理专业专升本班 《行政领导学》试题参考答案 一、名词解释:(4小题计20分) 1、行政领导:行政领导是指https://www.99xueshu.com/w/file44c4pc6y.html
9.美国国家科学技术委员会《2020美国国家科学技术委员会的跨机构工作组编制了《2020-2024 进展报告:推进可信赖的人工智能研究与开发》报告,该报告总结了2020-2024年间美国联邦政府在人工智能研究与开发方面的进展,旨在支持可信赖AI的创新,并管理其潜在风险。 报告背景 机构角色: 科学技术政策办公室(OSTP):提供科学和技术方面的政策建议。 http://www.360doc.com/content/24/0805/01/48115167_1130482749.shtml
10.物理复习用书+测试卷附答案江西科学技术出版社上海高中物理合格上海新高考 高考新思维地理等考模拟试题分类精编 地理 附答案上海高考一模二模模拟试题集 高一高二高三高中地理正版 ¥51.70 2022年 上海高中物理合格考 学业水平测试 物理 测试卷 含答案 物理学业水平测试 江西科学技术出版社 上海高二物理合 ¥26.60 2023一本阅读训练100篇中考文言文+古诗+名句九年人教部编http://product.dangdang.com/11308061412.html
11.第六单元文化的传承与保护洋务运动时期的留学生主要学习西方先进的军事和科学技术,主张“师夷之长技以制夷”,通过学生赴外留学的途径主动引进西学。随后,在戊戌维新运动到辛亥革命这一时期,留学生学习了西方近代民主制度。在民国初期至五四运动时期,留学生学习了西方的启蒙思想与文化精神。1915年爆发的新文化运动,将“民主”与“科学”两面旗帜https://zujuan.xkw.com/thematiclist/17pt3112ct8767n230830.html
12.式”综合实训平台管理与运行赴美培训团组总结一、培训概况 12月2日至23日,由来自湖南科技职业学院3个部门共19名教师组成的电子商务研修团队赴美参加了以“电子商务VR融合三维度‘集中式’综合实训平台管理与运行”为主题的研修班。研修期间,赴美团队一行走访了旧金山州立大学、伯克利大学等6所知名高校,听取了10余场专业讲座,并实地参观考察了微软、苹果、亚马逊https://kjt.hunan.gov.cn/zxgz/kjrc/jyjl_1/201904/t20190423_5319760.html
13.网络中心11.2术语与缩略语 前言 当今社会,以互联网、大数据、云计算、物联网、人工智能、5G、VR/AR、区块链等信息技术为代表的科技革命对人类生活、工作、学习等各个方面产生了巨大的影响,在教育领域数字校园已成为办学的基本条件,特别是职业院校数字校园已成为支撑教育教学、沟通校企合作、促进师生发展的必需环境。 http://www.xtzy.com/wlzx/detail.jsp?public_id=153330