记一次性能故障排查

最近一次公司服务出了一些性能的问题,主要是内存不释放。

领到任务后就开始展开工作。项目是用.net core 6写的,在框上应该不会有什么问题,这是大背景。另外服务是部署在k8s上的,于是就和性能测试人员,开发人员搭测试环境,展开问题重现的测试。

问题很简单,集中在排查几个大查询,并发10个大查询,每次请求数据在数十万到上百万条记录,pod的内存就很快飙上去了,并且之后不释放。重现了,就看看怎么解决吧,内存不释放,第一个想到的就是手动GC一下看看什么现象,结果是手动GC是管理用的,那就说明服务内部没有有效的调用GC,或调用的GC的释放内存的速度,没有请求增长内存的速度快。

这个问题可以通过修改项目配置,开启项目工作站后台并发回收模式,就能有效地改善。这是个配置,很容易做到,于是修改完后推到镜像仓库,并部署在性能pod中,再次进行测试。同样的并发,同样的请求,这时,内存会边用边回收,不会飙了。在观察各项性能指标时,发现一个问题,当并发变更时,tps始终是30来个,更奇怪的是,pod的资源有有空闲,数据库的资源也有空闲(大数据查库的方案在路中)。这不仅仅是一个问题,还是一个棘手的问题。

先看看代码逻辑,就是在service层先查一下缓存,拿上信息再查数据库,回来的数据进行重组封装,缓存用的官方分布式Redis缓存组件,数据库访问用的dapper,按理这些组件都应该是靠得住的,自己写的逻辑中到是有少许复杂。总感觉是那里有个锁,卡住了,所有资源都还有剩余,但tps起不来。

在这时,生产环境报出了504错误,网关超时,说明上游请求有超时现象。

这时又增加了排查任务,504超时,结合上面的分析,觉得tps上不来,更多的请求等待,必然会有超时的,隐隐觉得是一个问题,只要疏通那个锁,就应该能解决504超时。同时经过测试发现,只要一个大查询,数据量足够大,需要数据库等待,其他查询就会卡住,这肯定会有504出现。

继续排查吧,现在只能把这个复杂的查询分解开来测试,只进行缓存操作,没问题;只进行大数据查询,资源占用也能上来。那就是只要缓存组合慢的大查询,就有问题。

为了验证问题,把Redis分布缓存组件改成内存式分布式缓存(因为测试是在单pod上进行),再次测试时,发现问题解决了,数据库的cpu就会升起来,pod的cpu也会升,最终以数据库cpu打满结束,这个时候,tps也升到是150多个,这就足以说明官方Redis分布缓存有坑(原因是缓存包是从旧的版本升上来的,官方已发布新版本)。

到此,我的分析工作就告一段落,内存和tps上升不了(504也一样的原因)都找到问题了。接下来那就整改代码,再度进行性能测试,验证问题。

想在这里说的是,排查性能问题是个慢活,细活,通过现象推断问题,有很多时间,现象会把人带偏,没关系,再通过更多的现象进行再推断,再排查。另外,不要相信所有组件都是可靠的,有可能单个可靠,组合就有问题,一定要分段排查,完整验证,再去信任。

这次排查后,可能还有其他性能问题,没关系,那就再排查,一个好的服务性能,肯定是经过千锤百炼的,不可能是天生的。

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

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

相关文章

html单选框 点击取消选中,radio单选框再点击取消选中

html:html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">单选框选项a选项b选项c选项dcheckradio.js://参数:obj为当前点击的radio对象function onClickRadioStyle(obj){var…

开启AngularJS 1.X的学习之路(1)

概念(1) AngularJS 应用 AngularJS 模块&#xff08;Module&#xff09; 定义了 AngularJS 应用。AngularJS 控制器&#xff08;Controller&#xff09; 用于控制 AngularJS 应用。ng-app指令定义了应用, ng-controller 定义了控制器。eg: <div ng-app"myApp" ng-…

Hello boke!

Hello boke&#xff01;转载于:https://www.cnblogs.com/yikuan-919/p/9319071.html

ASP.NET Core在.NET 7 RC1中的更新

原文链接&#xff1a;https://devblogs.microsoft.com/dotnet/asp-net-core-updates-in-dotnet-7-rc-1/[1]原文作者&#xff1a;Daniel Roth翻译&#xff1a;沙漠尽头的狼(谷歌翻译加持).NET 7 Release Candidate 1 (RC1) 现已推出[2]&#xff0c;其中包括对 ASP.NET Core 的许…

html5 tab菜单切换页面,11个常用的jQuery TAB切换菜单源码及制作教程

11个常用的jQuery TAB切换菜单源码及制作教程SponsorTAB切换式菜单可以方便为我们减少很多网页布局空间&#xff0c;而且用jQuery的话可以加入一些动画效果&#xff0c;比如渐变&#xff0c;向左右滑动等&#xff0c;提升一定的用户体验&#xff0c;所以TAB菜单目前来说是很流行…

7.16 10.19-10.22

10.19 iptables规则备份和恢复[roothyc-01-01 ~]# service iptables save 保存iptables规则该命令会将规则保存在/etc/sysconfig/iptables将iptables规则备份到一个文件中[roothyc-01-01 ~]# iptables-save>/tmp/ipt.txt将iptables规则备份到ipt.txt文件中从备份规则的文件恢…

走进javascript——不起眼的基础,值和分号

值 有时我很想知道javascript解析引擎是如何区分一个变量的值&#xff0c;比如下面这段代码。 var x javascript; //javascript x "hello"; // hello x 555; //555 x null; //null x a; //a is not defined x true; //true 对于数字是直接赋值的&#xff0c;因…

ConcurrentDictionary字典操作竟然不全是线程安全的?

好久不见&#xff0c;马甲哥封闭居家半个月&#xff0c;记录之前遇到的一件小事。ConcurrentDictionary<TKey,TValue>绝大部分api都是线程安全的[1]&#xff0c;唯二的例外是接收工厂函数的api&#xff1a;AddOrUpdate、GetOrAdd&#xff0c;这两个api不是线程安全的&…

码农小汪-Hibernate学习8-hibernate关联关系注解表示@OneToMany mappedBy @ManyToMany @JoinTable...

近期我也是有点郁闷&#xff0c;究竟是程序中处理关联关系。还是直接使用外键处理关联关系呢&#xff1f;这个的说法不一致&#xff01;程序中处理这样的关联关系的话。自己去维护这样的约束。这样的非常乐观的一种做法&#xff01;或者是直接在数据库中处理这样的直接的外键关…

HTML中弹窗中加入图片,javascript里怎么实现点击图片弹出对话框?

JavaScript中可以使用document.getElementsByTagName方法后去img标签&#xff0c;然后遍历所有img标签并为其添加点击事件实现点击弹出对话框。JavaScript实现点击图片弹出对话框&#xff1a;img {width: 500px;height: 300px;}//获取所有的img标签var imgObjs document.getEl…

Java学习优秀网站

各类程序员学习路线图&#xff1a; http://www.runoob.com/coder-learn-path 博学谷&#xff1a; http://v.itcast.cn/map/22.html 慕课网&#xff1a; http://www.imooc.com/course/programdetail/pid/31 转载于:https://www.cnblogs.com/Arsene/p/6441831.html

Dcloud课程2 什么是Dcloud

Dcloud课程2 什么是Dcloud 一、总结 一句话总结&#xff1a;DCloud提供了一套快速开发应用的跨平台技术方案。 1、DCloud的产品架构&#xff1f; MUI(H5)HBuilder 2、什么是MUI&#xff1f; 最接近原生体验的移动App的UI框架。 3、什么是H5&#xff1f; html5功能增强标准 二、…

html5 轮询自动刷新数据,后台调用exe,前端定时轮询调用结果

前提使用asp.net core 2.1前端使用vueui使用element-ui前端发送请求用Axios新建asp.net core程序1.jpg修改Index.html{Layout null;}test{{ msg }}发送请求打开记事本// 创建 Vue 实例&#xff0c;得到 ViewModelvar vm new Vue({el: #app,data: {msg: 准备发送请求打开exe},…

洛谷 P2951 [USACO09OPEN]捉迷藏Hide and Seek

题目描述 Bessie is playing hide and seek (a game in which a number of players hide and a single player (the seeker) attempts to find them after which various penalties and rewards are assessed; much fun usually ensues). She is trying to figure out in which…

使用ssh免密码登录Linux服务器

频繁登录Linux服务器时&#xff0c;使用ssh <username><host>的方式登录&#xff0c;但是每次都需要输入密码是件很麻烦的事。我们还可以使用私钥/公钥对的方式在免密码登录服务器。首先需要在远程服务器中安装ssh-server服务&#xff0c;才可以使用ssh登录。如果没…

linux下tomcat开启远程调试

1.center下&#xff0c;在startup.sh文件首行中添加如下语句 declare -x CATALINA_OPTS"-server -Xdebug -Xnoagent -Djava.compilerNONE -Xrunjdwp:transportdt_socket,servery,suspendn,address8000"(不要换行&#xff0c;要在同一行)Ubuntu下&#xff0c;在catali…

.NET 7 RC1 发布

原文链接&#xff1a;https://devblogs.microsoft.com/dotnet/announcing-dotnet-7-rc-1/[1]原文作者&#xff1a;Jeremy Likness&#xff0c;Angelos Petropoulos&#xff0c;Jon Douglas翻译&#xff1a;沙漠尽头的狼(谷歌翻译加持)今天我们宣布 .NET 7 候选版本 1。这是生产…

html 字符串最后加空格,html space空格符

htmlcss 代码在网页中如何插入打出空格字符实现方法**摘要浏览器总是会截短 HTML 页面中的空格。HTML将所有空格字符&#xff0c;制表符&#xff0c;空格和回车符压缩为一个字符。如果要缩进段落&#xff0c;则不能简单地键入五个空格然后开始文本。 如果您在文本中写 10 个空格…

.NET MAUI实战 FilePicker

1.概要最近在迁移 GeneralUpdate.Tool的时候需要用到文件选择&#xff0c;在MAUI中可以使用FilePicker进行选择。ref1: https://gitee.com/Juster-zhu/GeneralUpdateref2:https://docs.microsoft.com/zh-cn/dotnet/maui/platform-integration/storage/file-picker?tabswindows…

SQL Server中,with as使用介绍

一&#xff0e;WITH AS的含义 WITH AS短语&#xff0c;也叫做子查询部分&#xff08;subquery factoring&#xff09;&#xff0c;可以让你做很多事情&#xff0c;定义一个SQL片断&#xff0c;该SQL片断会被整个SQL语句所用到。有的时候&#xff0c;是为了让SQL语句的可读…