一次现网redis CPU使用率异常定位

news2024/12/29 4:49:28

背景

618大促前,运维对系统做巡检时发现redis cpu利用率白天基本保持在72%左右,夜里也在60%以上。担心618流量比平时大,导致redis超负荷,因此找开发进行优化,降低redis的负载。
在这里插入图片描述

定位思路

其实资源使用率过高定位都是一个模式,不管是cpu使用率高还是内存使用率高甚至是磁盘使用率高。我们要做的就是找到明确的问题点(有bug导致不正常或者说过多的使用了资源),如果没有明确的问题点,那只能找出资源使用的分布,从高到底逐步分析代码,确认优化空间,优先对优化空间大的代码进行优化,这样才能达到小投入高回报。

  • 如果有明显的问题点,那还是很好定位的(或者说问题很容易捕捉)。比如java代码定位cpu使用率高时,通过top命令找到cpu占用高的线程,然后查看堆栈基本上就可以确认问题了。但并不是所有时候都有明显的问题点;这个时候,通过一些命令去观察时,捕捉到的数据并不是集中分布,那就不好直接确认问题。还是以java为例,使用top命令时,发现cpu占用率高的线程并不稳定,这个时候通过瞬间捕捉的高cpu使用率的线程去查看堆栈已经没太大意义了。这个时候要做的就是上述所说的找到cpu耗时的分布(像cpu可以使用火焰图),由高到底去逐个找优化空间了。

排查过程

初步观察监控,找到疑点

首先我是先看一下半夜的各项观察指标,确认可疑点。因为半夜用户数几乎可以忽略不计,用户的操作在系统整体占比非常低,这样不管去排查问题代码,还是看数据监控,都能更聚焦(对代码来说,关注后台异步操作;对监控来说,使用系统资源的指令更集中),相对容易找到问题所在。或者换个说法,半夜基本没有用户操作,能够基本消除用户操作对数据的干扰,使问题点更明显。
从监控上看,半夜使用率依然很高(超过60%),而且注意到半夜里执行的命令数下降了2/3。此处可大致推断出,半夜里面执行的操作是问题所在。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

确认半夜执行的命令分布,是否有明显的问题点

因为监控并不支持查看执行命令的分布,因此只能委托运维在业务最底的时候,使用redis的命令去导出redis执行的命令(使用的monitor指令)。
导出后发现大部分指令是session(系统用了spring session)的相关操作,这就跟实际业务情况有点矛盾了,spring session只有人操作系统时才会触发相关代码执行,半夜几乎没有用户,哪里来的人机接口调用。遂使用调用链查看半夜到底有啥接口被调用。通过调用链系统发现半夜主要就一个接口在被调用(占总体调用量的95%以上),不仅调用间隔低,而且间隔固定。于是找接口负责人确认业务场景(我是临时过来支援问题定位的,并不清楚他们的业务),他告诉我这个接口是给第三方集成用的机机接口,于是乎问题基本明了。

  • 我们去api平台注册接口给第三方用时,把接口url写错了,本应该填机机接口的,填成人机接口了。人机接口调用时会校验session,每次都会调用request.getSession获取session然后校验前端传相关认证信息。因为机机调用时没有cookie,因此每次都会创建新的session,然后半个小时候过期。

备注:从我的角度来讲,找到redis的问题命令后,就能够快速的找到问题接口以及问题,是因为我本身对系统使用的框架非常熟悉。因此,虽然定位资源利用率高的问题,有套路。但是如果对整个系统不了解(不仅是业务代码,系统使用的框架细节也要非常清楚),找到直接问题点后,很难往下一步找到问题根因。比如本问题中,该系统负责人,顺着我的思路找到有问题的redis的命令,但到了这一步后他就分析不下去了,他不知道这些redis命令是什么地方用的。

解决方案

纠正api平台上注册的url,由人机的改成机机的。

验证

因为session过期时有expire事件,因此解决措施实时后,cpu降到底部需要半个小时。因此观察cpu监控,特征是否符合。
我们大概9点实时的,半个小时候cpu如预期下降到底部,至此问题得以解决。
在这里插入图片描述

spring session相关代码分析

待续

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2050317.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大数据技术—— Clickhouse安装

目录 第一章 ClickHouse入门 1.1 ClickHouse的特点 1.1.1 列式存储 1.1.2 DBMS的功能 1.1.3 多样化引擎 1.1.4 高吞吐写入能力 1.1.5 数据分区与线程级并行 1.1.6 性能对比 第二章 ClickHouse的安装 2.1 准备工作 2.1.1 确定防火墙处于关闭状态 2.1.2 CentOS取消…

Vue UI - 可视化的Vue项目管理器

概述 Vue CLI 3.0 更新后,提供了一套全新的可视化Vue项目管理器 —— Vue UI。所以要想使用它,你的 Vue CL I版本必须要在v3.0以上。 一、启动Vue UI 1.1 环境准备 1.1.1 安装node.js 访问官网(外网下载速度较慢)或 http://nod…

民航管理局无人机运营合格证技术详解

1. 证书定义与意义 民航管理局无人机运营合格证(以下简称“合格证”)是对符合民航法规、规章及标准要求的无人机运营单位或个人进行资质认证的重要证明。该证书旨在确保无人机运营活动的安全、有序进行,保护国家空域安全,维护公众…

电子电气架构 --- 软件定义汽车需要怎么样的EE架构

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不…

反射型XSS的几种payload

目录 第一种&#xff1a;采用的是urlcode编码 第二种&#xff1a;前面用html实体编码&#xff0c;后面用urlcode编码 第三种&#xff1a;只对&#xff1a;使用urlcode编码 第四种&#xff1a;对<>进行html实体编码 第五种&#xff1a;textarea 第六种&#xff1a;和…

【JavaEE】锁策略和CAS

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【Java】登神长阶 史诗般的Java成神之路 &#x1f4b0;一.常见的的锁策略 锁策略&#xff08;Locking Strategy&#xff09;是指在多线程环境中&#xff0c;为了控制对共享资源的访问&#xff0c;确保…

「OC」探索CALayer:基础知识与实用技巧简要介绍

「OC」探索CALayer&#xff1a;基础知识与实用技巧简要介绍 文章目录 「OC」探索CALayer&#xff1a;基础知识与实用技巧简要介绍前言认识CALayerCALayer的相关属性 UIView和CALayer区别联系创建UIView和CALayer的原因 开始创建CALayer视图层级CALayers 和 Sublayersposition与…

javaweb-flex布局

1. flex布局原理 flex是flexible Box的缩写&#xff0c;意味着"弹性布局"&#xff0c;用来为盒子模型提供最大的灵活性&#xff0c;任何一个容器都可以指定为flex布局。 当我们为父盒子设为flex布局以后&#xff0c;子元素的float、clear和vertical-align属性都将失…

【质因数分解】将正整数分解质因数

将一个正整数分解成质因数&#xff0c;例如&#xff1a;输入90&#xff0c;打印输出 902*3*3*5 使用C语言实现&#xff1a; #include<stdio.h>int main(){int n,i;printf("请输入需要分解的正整数&#xff1a; ");scanf("%d",&n);for(i2;i<…

六. 部署分类器-deploy-classification-basic

目录 前言0. 简述1. 案例运行2. 代码分析2.1 main.cpp2.2 model.cpp 3. 补充说明结语下载链接参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们来学习课程第六章—部署分类器&#xff…

Flutter-自适用高度PageView

需求 在 Flutter 中&#xff0c;PageView 是一个非常常用的组件&#xff0c;能够实现多个页面的滑动切换。然而&#xff0c;默认的 PageView 高度是固定的&#xff0c;这在展示不同高度的页面时&#xff0c;可能会导致不必要的空白或内容裁剪问题。为了使 PageView 能够根据每…

Educational Codeforces Round 169 (Rated for Div. 2)(ABCDE)

A. Closest Point 签到 #define _rep(i,a,b) for(int i(a);i<(b);i) int n,m; int q[N]; void solve() {cin>>n;_rep(i,1,n)cin>>q[i];if(n!2)cout<<"NO\n";else if(abs(q[1]-q[2])!1)cout<<"YES\n";else cout<<"…

堆排序-优先级队列

我们用堆排来实现优先级队列&#xff0c;那么优先级队列是什么&#xff0c;就是 我们给每一个任务都添加一个优先级&#xff0c;优先级越高执行的越早我们用&#xff0c;但是我们怎么能按照顺序优先拿到优先级高的任务呢&#xff0c;我们可以用排序 来进行&#xff0c;也可以用…

Mybatis-Plus分页插件注意事项

使用Mybatis-Plus的分页插件进行分页查询时&#xff0c;如果结果需要使用<collection>进行映射&#xff0c;只能使用嵌套查询&#xff0c;而不能使用嵌套结果映射 嵌套查询和嵌套结果映射是Collection映射的两种方式&#xff0c;下面通过一个案例进行介绍 例如有room_i…

MyBatis源码系列3(解析配置文件,创建SqlSessionFactory对象)

创建SqlSessionFactory&#xff1b; 首先读取配置文件&#xff0c;使用构造者模式创建SqlSessionFactory对象。 InputStream inputStream Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory new SqlSessionFactoryBuilder…

C++面试基础系列-struct

系列文章目录 文章目录 系列文章目录C面试基础系列-struct1.C中struct2.C中struct2.1.同名函数2.2.typedef定义结构体别名2.3.继承 3.总结3.1.C和C中的Struct区别 4.struct字节对齐5.struct与const 关于作者 C面试基础系列-struct 1.C中struct struct里面只能放数据类型&#…

算法力扣刷题记录 八十六【47.全排列 II】

前言 回溯章节第12篇。 记录 八十四【46.全排列】初步学习了集合中无重复元素的排列求解。 本文&#xff1a;记录 八十六【47.全排列 II】当集合中有重复元素时&#xff0c;求解排列&#xff1b; 一、题目阅读 给定一个可包含重复数字的序列 nums &#xff0c;按任意顺序 返回…

VirtualBox安装Oracle Linux 7.9全流程

1.准备工作 1.1 VirtualBox下载 下载地址1&#xff1a; Downloads – Oracle VM VirtualBoxhttps://www.virtualbox.org/wiki/Downloads 下载地址2&#xff1a; https://www.oracle.com/virtualization/virtualbox/ 选择以上的任意一个地址都可下载到。 1.2 Oracle Linux 操作…

购物车系统设计方案

背景 在电商领域&#xff0c;购物车&#xff08;Shopping Cart&#xff09;扮演着至关重要的角色&#xff0c;它是连接用户浏览商品与最终完成购买行为的桥梁。 从两个视角来阐述&#xff0c;作为ToC的购物车&#xff0c;存在的意义&#xff1a; 从用户角度&#xff1a; 收…

ssm大学生实习管理系统的设计与实现-计算机毕业设计源码45837

摘 要 在信息时代&#xff0c;随着网络的快速发展&#xff0c;各个行业都离不开信息的处理。在这样的背景下&#xff0c;高校需要以学生管理信息为导向&#xff0c;并与学生实习的持续创新相结合。因此&#xff0c;设计一个高校学生实习管理系统就显得非常必要。 该系统采用了B…