一次压测引发的数据库 CPU 飙升

news2024/11/24 12:52:43

一次压测引发的数据库CPU飙升

作者:昀鹤

一次压测过程中,当数据库的 qps 和 tps 都正常时,如果 cpu 利用率异常的高,应该如何排查?希望通过这篇文章,给你一些启发...

一、业务背景

业务需要控制频道内兑换现金的数量,于是在产品设计上给兑换现金增加了库存限制。

在此基础上形成了秒杀场景,峰值时核心接口 qps 上涨了近 600 倍(几十到几万) ,因此需要进行压测来对系统和 DB 水位摸一下高。

二、压测准备

大致分为下面几个步骤:

1)压测流量评估:就是定一下每个接口大致压测多少 qps,以及压测时到各个下游系统的流量估计。

2)压测改造:因为压测都是用的压测账户,在频道里没有历史痕迹,很多逻辑是走不到的,并且这些逻辑的不同,会直接影响到数据库和下游的流量,因此我们需要根据频道的现有数据进行链路的 mock(包括上述的流量评估也得基于这些不同链路的比例去算),举例如下:

3)测试 &发布:既然改了代码,还是得交给可爱的测试同学回归下线上链路的,当然压测的链路就可以自己测一测了,看看改造是否符合预期,hsf 控制台可以很方便的模拟影子链路:

4)下游流量报备:当然还是得跟各个下游系统知会一声的,切勿悄悄滴进村,打枪滴不要。

5)压测数据准备:主要是压测平台上的各种接口和压测流量配置(注意减去压测时的背景流量),以及压测账号申请等等(这一步也是交给测试同学)。

6)小流量预跑:在正式压测之前,大概用 1%的流量先跑一下,看看本身系统以及下游是否有异常(这一步很有必要,有时候下游系统比较复杂,可能部分场景并不能支持压测流量,提前跑一下能发现很多问题,避免正式压测的时候下游报警,然后就是👋忙🦶乱)。

三、问题出现

好了,万事具备,经过上面一系列步骤,想必本次压测一定是顺顺利利吧!

压测,启动!

====== 10%压测流量,cpu 利用率 11% ====== 挺正常

====== 30%压测流量,cpu 利用率 20% ====== 稳中向好

====== 50%压测流量,cpu 利用率 30% ====== 符合预期

====== 80%压测流量,cpu 利用率 50% ====== 感觉有点问题,但是说不出来哪里有问题!

====== 100%压测流量,cpu 利用率 80% ===== 嗯?好像不对劲?有点高

====== 100%压测流量,稳定几分钟后,突然飙到 100% ===== .....卧槽,肯定有问题,暂停压测!

唉,还是太年轻了。

赶紧排查,先拉了压测时间段的 cpu 曲线图:

看着 cpu 的监控图,我的脑海里浮现了三个疑问:

1.同等流量下,压测时的 cpu 利用率为什么高于线上实际值(线上约等于压测 80%流量时,cpu 利用率实际 40%不到,压测时已经到 60%了)?

2.流量 80%时,为什么压测流量持续不动,cpu 利用率会缓慢上涨呢?

3.流量 100%时,分明一开始 cpu 利用率还维持在 80%以下,然后突然就飙到 100%了?

总体来说,就是 CPU 高于预期。

四、问题排查

第一时间我猜测是我的压测改造不符合预期,导致打到 db 的 qps 和 tps 过高导致

急了,开始看代码,然后挑了几个压测 trace 在鹰眼上看调用,没找到问题。

然后发现我好蠢呐(主要是有点慌张),dbservice 本身就有 tps 和 qps 的监控:



看了一下,有两点,一是持续压测的时候,qps 并没有持续上涨二是差不多同流量下 qps 的值确实略高于线上实际值,但远远没有 cpu 差值这么多,所以基本可以排除一开始的猜测。



陷入了瓶颈.....



这时候我知道今天的压测指定是不行了,所以很干脆地摆了,开始安心的找问题~

4.1 发现疑点

这时候拉了 DBA 同学一起帮我们看问题,DBA 同学表示,一,数据库在长时间高压下会发生性能劣化,这也是 cpu 从 80%突然暴涨到 100%的原因(解答了第三个问题),至于 CPU 利用率异常是表象,qps 和 tps 只是其中一个影响因素,建议我们看看其他指标。

于是挨个查看数据库性能指标(带宽、慢 sql、RT....),然后终于发现了一个疑点:



这个缓慢升高的行读,非常符合压测流量 80%时 cpu 曲线的变化,很可能是问题二的原因...



那是不是也有可能是问题一的原因呢?

4.2 确认疑点

对比正常峰值流量下的行读指标

好吧,这都差了一个数量级了,基本可以确定问题出在行读异常上了



开始思考为什么行读这么多还在持续上涨,难道是同一个 sql 查出来的行数会变多

4.3 定位 sql

其实这时候心里已经隐隐约约猜到问题在哪了,但还是顺着这个行读异常排查下去



通过对比定位到了有问题的 sql



压测时:

正常时:



点进去也能看到具体的 sql 信息:



好吧,和我猜的一样,这下悬着的心终于死了。

4.4 代码分析

至于为什么同一条 sql 压测的平均行读会高这么多,还是得从代码层面来分析。



首先先看下改造逻辑和逻辑推导:

这么压测改造的原因是压测的账号是有限的(同一批压测账号重复的去轮询),如果所有账号都调过一遍接口,那后面的每次查询都能查到任务,不会再有 DB 写,为了更好的模拟线上实际情况,因此通过这种方法去让账号重新路由到注册逻辑。



然后看下任务的查询逻辑,如下:

private TaskInstanceParam createQueryParamByEffectiveTime(TaskQueryParam queryParam) {        final TaskInstanceParam dbQueryParam = new TaskInstanceParam();        Date now = TimeTravelManager.getCurrentTime(queryParam.getUserId());        dbQueryParam.createCriteria()            .andUserIdEqualTo(queryParam.getUserId())            .andBizTypeEqualTo(queryParam.getBizType())            .andTemplateIdEqualTo(queryParam.getSubBizType())            .andEffectiveStartTimeLessThanOrEqualTo(now)            .andEffectiveEndTimeGreaterThan(now);        dbQueryParam.appendOrderByClause(OrderCondition.EFFECTIVESTARTTIME, SortType.DESC);        dbQueryParam.setPagination(1, 1);        return dbQueryParam;    }

复制代码

其实就是查询符合 effectiveStartTime <= now < effectiveEndTime 的最新一条任务, 所以每次注册插入的任务,都会在下次同一账号查询时,为 sql 多加一条符合条件的行记录



至此原因已经很清晰了:随着压测的持续进行,每一个账户注册的任务条数会越来越多,因此同一条 sql 查询到的符合条件的行数会越来越多,CPU 就会花费越来越多的资源逐行处理。



后续的解法:

1)查询的时候 mock 到数据的 userId(提前准备好的线上实际来访 userId,随机取一个);

2)因为不影响查询了,所以插入逻辑不变。

五、原理刨析

接下来请 ChatGpt 老师上台,为我们普及下相关原理:

我 :什么是行读,行读高 cpu 利用率就高嘛?



我 :哦,听起来行读是比较笼统的概念,那什么是逻辑读和物理读呢,区别在哪里?



我:嗯哼,原理解释有点干燥,画个关系图(挑衅)?



我:啊?阿珍你来真的啊?



我:那总结一下,其实就是行读包括逻辑读和物理读两种,前者优于后者,平时的开发中,应该注意合理建立索引和优化 sql,来减少扫描整体行读数以及物理读的次数呗,说的对就夸一下我

六、反思

1.压测流量 80%时,就应该敏感地关注到 cpu 是高于日常水位的,其实可以避免压测调到 100%的 cpu 飙升;

2.对于 DB 的性能指标,压测时只关注了最表层的 cpu 利用率,其他的性能指标监控没有关注到位;

3.对于我们的任务场景下,查询的是有效期内的最新一条任务,实际上不太适合反复注册的压测 mock,所以在压测改造时,还需要关注改造方式与场景的匹配程度。

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

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

相关文章

恭喜行云绽放,24年再度荣获国家鼓励的企业软件证书

在刚刚过去的五月份&#xff0c;行云绽放再次传来一个好消息&#xff0c;那就是2024年行云绽放再度荣获国家鼓励的企业软件证书。 什么是国家鼓励的企业软件证书&#xff1f; 国家鼓励的企业软件证书被称为“国家鼓励的软件企业证书”&#xff0c;这一证书由中国软件行业协会…

网站https逐渐普及,选择合适的SSL证书

目录 为什么实现https访问逐渐成为主流&#xff1a; 为什么要选择合适的SSL证书&#xff1a; 目前主流的三种域名证书及IP证书&#xff1a; 怎样申请SSL证书&#xff1a; 随着国内网络安全信息的逐渐普及&#xff0c;绝大部分的网站目前都配置了SSL证书用于实现https访问&a…

ModelScope联手OpenDataLab:直接调用7000+开源数据集,赋能AI模型加速研发

在人工智能的演进历程中&#xff0c;数据和模型的整合是推动技术发展的核心动力。随着AI技术的不断进步&#xff0c;整合各类关键资源&#xff0c;构建一个高效、协同的开发环境&#xff0c;已成为加速创新应用发展的关键。 基于这一理念&#xff0c;OpenDataLab浦数与ModelSc…

解锁私域电商潜力:构建与维护强大私域生态

大家好&#xff0c;我是专注于私域电商领域的技术专家&#xff0c;拥有丰富的行业经验。在今天的分享中&#xff0c;我将带大家深入理解私域流量的精髓&#xff0c;并探讨如何构建一个充满活力且高效的私域生态。在数字化浪潮下&#xff0c;如何深化用户关系并挖掘其潜在价值&a…

mybatis动态传参pgsql日期Interval

在navicat16中&#xff0c;标准写法 SELECT * FROM business_status_info WHERE create_time > (NOW() - INTERVAL 5 minutes) 在mybatis中&#xff0c;错误写法 SELECT * FROM business_status_info WHERE create_time > (NOW() - INTERVAL #{monitorTimeInterval,jdbc…

git 配置私人令牌

这里写自定义目录标题 获取私人令牌配置个人令牌 获取私人令牌 在个人设置里点击私人令牌选型&#xff0c;之后生成令牌即可。注意&#xff1a;令牌只会出现一次&#xff0c;务必保存好。 配置个人令牌 个人令牌&#xff1a;3c15c866fa61066212a83c66fd8133ba # 进入项目文…

使用开源的 LLM 充当 LangChain 智能体

开源 LLM 现已达到一定的性能水平&#xff0c;可堪作为智能体工作流的推理引擎。在我们的测试基准上&#xff0c;Mixtral 甚至已超越 GPT-3.5&#xff0c;而且我们还可以通过微调轻松地进一步提高其性能。 引言 经由因果语言建模任务训练出的大语言模型&#xff08;LLM&#…

智源联合多所高校推出首个多任务长视频评测基准MLVU

当前&#xff0c;研究社区亟需全面可靠的长视频理解评估基准&#xff0c;以解决现有视频理解评测基准在视频长度不足、类型和任务单一等方面的局限性。因此&#xff0c;智源联合北邮、北大和浙大等多所高校提出首个多任务长视频理解评测基准MLVU&#xff08;A Comprehensive Be…

ES全文检索支持繁简和IK分词检索

ES全文检索支持繁简和IK分词检索 1. 前言2. 引入繁简转换插件analysis-stconvert2.1 下载已有作者编译后的包文件2.2 下载源码进行编译2.3 复制解压插件到es安装目录的plugins文件夹下 3. 引入ik分词器插件3.1 已有作者编译后的包文件3.2 只有源代码的版本3.3 安装ik分词插件 4…

超声波清洗机的优势到底有哪些?四款精良爆品总结安利,质量放心

眼镜是现代人生活中的必备物品&#xff0c;但是很多人可能对于如何正确清洗眼镜感到困惑。传统的清洗方法可能会在清洗过程中对眼镜造成损坏&#xff0c;例如使用普通肥皂或清水清洗时容易划伤镜片。为了解决这个问题&#xff0c;家用眼镜超声波清洗机应运而生。超声波清洗机利…

四川赤橙宏海商务信息咨询有限公司可信吗?

在数字化浪潮席卷全球的今天&#xff0c;电商行业正以前所未有的速度蓬勃发展。作为这一领域的佼佼者&#xff0c;四川赤橙宏海商务信息咨询有限公司凭借其在抖音电商服务领域的深厚积累和卓越表现&#xff0c;成为了引领行业创新发展的重要力量。 四川赤橙宏海商务信息咨询有…

海豚调度调优 | 正在运行的工作流(DAG)如何重新拉起失败的任务(Task)

&#x1f4a1; 本系列文章是DolphinScheduler由浅入深的教程&#xff0c;涵盖搭建、二开迭代、核心原理解读、运维和管理等一系列内容。适用于想对 DolphinScheduler了解或想要加深理解的读者。 *祝开卷有益。 * 本系列教程基于 DolphinScheduler 2.0.5 做的优化。&#xff…

uniapp 打包 H5 实现在 uniapp 打包 APP 的 webview 通信

一、前言 遇到 uniapp 打包的 APP 在 webview 内嵌入 uniapp 打包的 H5 页面的需求&#xff0c;并实现通信。本篇主要总结了如何实现并总结遇到的问题&#xff0c;希望可以帮助大家减少负担。 实现需求主要有三个地方需要处理&#xff1a; index.html 的打包配置导入 uni.we…

SVN学习(003 svn安装和配置subversive)

尚硅谷SVN高级教程(svn操作详解) 总时长 4:53:00 共72P 此文章包含第30p-第p41的内容 介绍 安装 字符集记得先改成utf-8 这里无svn的插件 打开应用插件市场&#xff08;需要有网络&#xff09; 重启 svn文件夹 安装svn连接器 这两个用哪个都行 svn版本号是1.6 所以…

代码随想录算法训练营第六十六天 |101.孤岛的总面积、102.沉没孤岛、103.水流问题、104.建造最大岛屿

101.孤岛的总面积 文字讲解&#xff1a;101. 孤岛的总面积 | 代码随想录 解题思路 本题要求找到不靠边的陆地面积&#xff0c;那么我们只要从周边找到陆地然后 通过 dfs或者bfs 将周边靠陆地且相邻的陆地都变成海洋&#xff0c;然后再去重新遍历地图 统计此时还剩下的陆地就…

360°环绕拍摄图片的作用 欧保图 ORBITVU

360环绕拍摄图片在电商中的应用及其优势 ORBITVU 波兰 欧保图 360环绕拍摄图片是一种动态的产品展示方式&#xff0c;它允许消费者从不同角度全方位地查看产品&#xff0c;这种交互式的体验大大增强了用户的购物体验。以下是360环绕拍摄图片在电商中的一些具体应用及其带来的优…

FreeRTOS学习 -- 时间管理

在使用 FreeRTOS 的过程中通常会在一个任务函数中使用延时函数对这个任务延时&#xff0c;当执行延时函数的时候会进行任务切换&#xff0c;并且此任务就会进入阻塞态&#xff0c;直到延时完成&#xff0c;任务重新进入就绪态。 FreeRTOS 延时函数 1、函数 vTaskDelay() 在F…

Ubuntu下载QT5.8安装包-bestswinger课程

最近在看UP的QT开发课&#xff0c;真的找了巨久这个安装包&#xff0c;谁都不想在安装上花太多时间。。出一版小小教程吧&#xff5e; 首先打开qt download官网&#xff0c;5.8好像在镜像网站上没有看到&#xff0c;所以我最后还是老老实实官网了&#xff0c;而且5.8会小一点 …

90%网络工程师还是搞不清三层交换机是啥?

6月29日&#xff0c;HCIA新开班啦什么是三层交换机&#xff1f; 首先&#xff0c;我们先来解释一下三层交换机是什么。简单来说&#xff0c;它就是网络中的一个小老板&#xff0c;负责管理数据的流动。与普通的网络设备不同&#xff0c;三层交换机不仅能认识「MAC地址」&#…

小程序使用接口wx.getLocation配置

开通时需详细描述业务&#xff0c;否则可能审核不通过 可能需要绑定腾讯位置服务&#xff0c;新建应该&#xff0c;绑定到小程序 配置 权限声明&#xff1a;在使用wx.getLocation前&#xff0c;需要在app.json的permission字段中声明对用户位置信息的使用权限&#xff0c;并提…