应用性能问题解决实际案例

某项目在上线前的APT(Application Performance Testing应用程序性能测试)过程中发现性能问题,性能测试结果影响是否上线,紧急求助外部项目组技术专家。

因分属不同项目,只能通过项目组提供的信息进行分析。

第一轮评审

根据APT性能监控截图,左图为并发用户数和CPU使用率,右图为单独的CPU使用率情况。APT测试情景为并发用户数以5分钟为周期进行增加,增加用户数25人,在40分钟后达到最终200并发用户并保持1小时200用户活动状态。

很明显看出用户稳定后CPU使用率还在持续增长,怀疑有内存泄露问题。

 640?wx_fmt=jpeg

 640?wx_fmt=jpeg

分析

第一轮我们拿到的是API源代码,日志里面出现outOfMemory错误,检查一遍发现API控制器方法中创建了HttpClient实例。询问开发组回复是因为每次请求URL不同,根据经验推荐采用HttpWebRequest替换调HttpClient。同时我们调查是否是由HttpClient引起的内存泄漏问题。

由Google搜索结果HttpClient确实有内存泄漏的报告,我们着手写了一个小程序比较HttpClient和HttpWebRequest性能,并通过JMeter在本地进行性能测试。

HttpClientHttpWebRequest性能比

测试环境

测试URL: https://www.baidu.com/#{number} (number变量为随机或递增以防止HTTP缓存干扰性能对比结果)

测试节奏:10秒周期,并发用户从1到200增长

测试结果(内存使用量)

  • HttpClient: 455MB

  • HttpWebRequest: 242MB

图1: HttpClient (GetAsync)

 640?wx_fmt=png

图2: HttpWebRequest (请忽略结尾处由网络连接问题出现的凸起)

 640?wx_fmt=png

结论

将HttpClient更换使用HttpWebRequest,但根据HttpClient内存使用陡增幅度估计还有其它问题,通知开发组继续调查并提供相关资料。

第二轮评审

比较IIS内存使用和SQL Server的内存使用发现相同的增长趋势,猜测瓶颈出现在数据库查询中(如果是拒绝访问数据库不会出现内存增长,一定是已经连接了数据库并产生查询问题导致)。

推荐增加查询操作日志获得查询执行时间,安装数据库性能监视工具(可使用Windows Server自带的Performance Monitor或者第三方工具如AppDynamic),查看查询的执行计划(Execution Plan)。

图3: SQL Server – 内存 - % committed Bytes (内存使用)

 640?wx_fmt=jpeg

图4: MS IIS – 内存 - % Committed Bytes (内存使用)

 640?wx_fmt=jpeg

同时经过了解API还会调用上游系统的API(API嵌套),所以考虑检查日志是否存在因上游API瓶颈导致调用失败,导致异常阻塞请求进程。也会出现相同的现象,开发组着手调查。

上游API问题通过调整系统配置消除瓶颈,但SQL Server性能问题还无任何头绪。只能安排时间一起评审数据库及相应查询性能问题。

第三轮评审

背景

测试总时长1小时40分:从最开始每隔1分钟增长5个并发用户,40分钟左右并发数加到200,然后维持并发用户不变,又执行1小时

现象

达到200并发后的20分左右时, CPU的使用率达到30% 左右之后保持相对平稳的比例,但是在这之后的执行过程中 request queued 曲线出现排队现象, Thread Count 曲线出现突然增长的情况,并且同是response time 翻倍增长。

上次报告没有HTTP 5xx错误,本次出现HTTP 5xx错误,27日错误数量激增。

程序中有从上百万条数据中抽取数据生成级联选择(下拉菜单)的UI元素。

程序中使用了Http Cache,但在准备Cache数据的逻辑中没有锁处理,数据准备时间过长,就会造成期间大量请求访问数据库。

性能测试报告中SQL Server也显示出周期性达到100% CPU利用率,引发数据库连接超时,同时应用程序出现GATEWAY_TIMEOUT。

System.Data.Entity.Core.EntityException: The underlying provider failed on Open. ---> System.InvalidOperationException: Timeout expired.  The timeout period elapsed prior to obtaining a connection from the pool.  This may have occurred because all pooled connections were in use and max pool size was reached.
640?wx_fmt=jpeg

 640?wx_fmt=jpeg

 640?wx_fmt=jpeg

 640?wx_fmt=jpeg

640?wx_fmt=jpeg

分析

因已经做过两轮评审,开发组这次提供了全面的资料,通过代码评审发现逻辑中有使用LDAP(Windows活动目录轻量目录访问协议Light Directory Access Protocol)遍历登陆者所有活动目录下的组。

此逻辑可能会产生请求ADFS查询的瓶颈,阻塞请求。

同时发现部分被查询的表中没有创建索引(这个是在最初问过开发团队但得到的回答是肯定的)并进行索引优化,另外,API采用.NET Entity Framework编写,由SQL查询监控看出因无索引导致EF生成相同表的嵌套(笛卡尔积)查询,是导致表遍历和产生表锁的主要原因。

对于大量出现的5xx错误,因上次性能测试没有,主要针对修改的代码进行评审发现增加了EF查询逻辑,这也是导致循环嵌套的原因。

结论

表索引优化是主要解决办法。EF查询最终改为明文查询并SQL查询优化。

总结

性能问题首先由测试入手,根据测试报告发现错误和性能瓶颈,主要以解决错误消除瓶颈为主要原则。对于有数据库存在的情景,注意查询和索引优化,保证连接池有效支持应用并发。问题调研期间要了解整体架构(本次API嵌套问题和LDAP的使用都是后期由开发组告知)和所使用的技术,才能给出全面建议。从开发组角度应该训练发现性能问题的敏感度。所有问题的发现和解决以测试事实数据说话,不会存在莫须有的性能问题,所有问题皆有因缘。

640?wx_fmt=jpeg

原文地址:https://www.cnblogs.com/richardcuick/p/11008387.html

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

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

相关文章

BZOJ#3786. 星系探索(平衡树,fhq-treap,弱化版ETT)

BZOJ#3786. 星系探索 Solution 子树加,换fatherfatherfather(保证还是树),询问到根路径和。 树上路径求和不好动态维护,于是转化到序列上,维护一个括号序,dfndfndfn处贡献为www,fn…

Worker Service in ASP .NET Core

介绍提到 ASP.NET Core,我们多半会想到 ASP.NET MVC、ASP.NET Web API、Razor page 及 Blazor。随着 .NET Core 3.0 的推出,今天会介绍一个全新推出的功能:Work Service 。我们可以在 Visual Studio 2019 中通过预定的项目模版快速创建一个 W…

Codeforces Round #693 (Div. 3) G. Moving to the Capital dp + 思维

传送门 题意&#xff1a; 给一个图&#xff0c;111号点为中心点&#xff0c;定义dis[i]dis[i]dis[i]表示111号点到iii的距离。现在有三种移动方式 (1)(1)(1)从iii移动到jjj且dis[i]<dis[j]dis[i]<dis[j]dis[i]<dis[j]。 (2)(2)(2)从iii移动到jjj且dis[i]>dis[j]dis…

AGC038D - Unique Path(建图)

AGC038D - Unique Path Solution 此题较水。 大概就是简单路径唯一意味着连成一棵树&#xff0c;因此先给这些限制的端点放在同一个连通块内&#xff0c;然后如果有多条路径的限制的两端点在同一个连通块内&#xff0c;则无解。 然后考虑如果没有多条路径的限制&#xff0c;…

ASP.NET Core 奇淫技巧之动态WebApi

一.前言接触到动态WebApi&#xff08;Dynamic Web API&#xff09;这个词的已有几年&#xff0c;是从ABP框架里面接触到的&#xff0c;当时便对ABP的这个技术很好奇&#xff0c;后面分析了一波&#xff0c;也尝试过从ABP剥离一个出来作为独立组件来使用&#xff0c;可是后来因与…

CF1478A - Nezzar and Colorful Ball(数学)

CF1478A - Nezzar and Colorful Balls Solution 真不戳&#xff0c;这AAA题真不戳&#xff0c;我直接好家伙。 讲一下我搞了半个小时的垃圾做法 &#xff08;好吧后来看了看标算好像和我是一样的&#xff09; 。 大概是容易发现你两个数(x,y)(x,y)(x,y)做来做去最后一定是ax…

Codeforces Round #693 (Div. 3) E. Correct Placement 思维

传送门 题意&#xff1a; 思路&#xff1a; 对于每个人都有个二元组(x,y)(x,y)(x,y)&#xff0c;从题意中提取有效信息就是&#xff1a;当(x1,y1)(x_1,y_1)(x1​,y1​)的最大值大于(x2,y2)(x_2,y_2)(x2​,y2​)的最大值&#xff0c;(x1,y1)(x_1,y_1)(x1​,y1​)的最小值大于(…

记录一次生产发布事件——(简单的非空验证也能引发大问题)

事件经过下午四点&#xff0c;发布生产g环境(生产环境m为正式环境&#xff0c;g为内测环境)。这时测试有人提出“服务器忙”。听到这里我赶紧翻了翻内测日志&#xff0c;发现了最熟悉的老朋友——未将对象引用设置到对象的实例。问题出现在如下代码上。(我下面附上了伪代码&…

Codeforces Round #705 (Div. 2) D. GCD of an Array 质因子分解 + stl维护

传送门 题意&#xff1a; 给nnn个数&#xff0c;让后qqq个操作&#xff0c;每次选择一个位置的数使其乘xxx&#xff0c;每次询问后输出所有数的gcdgcdgcd。 思路&#xff1a; 这个题思路算是比较好想的。首先就是一个计算方式即计算所有数的gcdgcdgcd&#xff0c;这个比较容易…

CF938G Shortest Path Queries(线性基,线段树分治,并查集)

CF938G Shortest Path Queries Solution 套路题。 xorxorxor最短路可以用线性基维护&#xff08;把每个环的边权异或和放进线性基&#xff0c;询问时把树边路径边权异或和放在线性基里跑出最小值即可&#xff09;。 然后因为线性基删除比较慢而麻烦&#xff08;注意线性基是…

程序员过关斩将--你为什么还在用存储过程?

点击上面“蓝字”关注&#xff0c;带你看好电影菜菜哥&#xff0c;我新接手了一个项目&#xff0c;看的我头疼呀业务有这么复杂呀&#xff1f;不是的&#xff0c;这个老项目完全是用存储过程写的&#xff0c;每个存储过程都好几百行这样呀&#xff0c;是够头疼的~有没有办法帮我…

Educational Codeforces Round 101 (Rated for Div. 2) C. Building a Fence 思维取范围

传送门 题意&#xff1a; 思路&#xff1a; 刚看到这个题其实是没什么思路&#xff0c;想过从前往后推或者从后往前推&#xff0c;但是都不是很可行。因为两边都有一个固定的挡板挡住&#xff0c;我们可以根据其中的一个算出来每个位置高度的范围&#xff0c;让后检查一下范…

CF1237F Balanced Domino Placements(组合计数,dp)

CF1237F Balanced Domino Placements Solution 显然可以先考虑横着的骨牌&#xff0c;再考虑竖着的骨牌。但是思路卡在了选取横着的骨牌会对竖着的骨牌的相邻对数产生影响。 然而事实上我们只需要换一个统计顺序&#xff0c;先考虑横着的骨牌的列和竖着的骨牌的行&#xff0…

asp.net core 集成JWT

【什么是JWT】JSON Web Token&#xff08;JWT&#xff09;是目前最流行的跨域身份验证解决方案。JWT的官网地址&#xff1a;https://jwt.io/通俗地来讲&#xff0c;JWT是能代表用户身份的令牌&#xff0c;可以使用JWT令牌在api接口中校验用户的身份以确认用户是否有访问api的权…

2021年度训练联盟热身训练赛第一场 E Early Orders 思维 + 栈

传送门 题意&#xff1a; 给nnn个数&#xff0c;一个kkk&#xff0c;求aaa中包含1−k1-k1−k且字典序最小的子序列。 思路1&#xff1a; 记p[i]p[i]p[i]为iii出现的最后位置&#xff0c;让后维护一个栈&#xff0c;当这个数不在栈里时将其入栈&#xff0c;入栈的时候跟栈顶比…

CF855G. Harry Vs Voldemort(边双,并查集,dp)

CF855G. Harry Vs Voldemort Solution 考虑每增加一条边都会把路径上的边双都连成一个大边双&#xff0c;考虑合并xxx和yfaxy fa_xyfax​ 这两个边双的贡献&#xff0c;分类讨论&#xff1a; 选取三个同边双内的点。选取在同一个边双内选两个点&#xff0c;剩下一个在其他边…

xBIM(eXtensible Building Information Modelling)可扩展的建筑信息模型

一、xBIM 简介BIM&#xff08;Building Information Modelling&#xff09;建筑信息模型&#xff0c;xBIM&#xff08;eXtensible Building Information Modelling&#xff09;可扩展的建筑信息模型。它是一个.NET 开源软件开发BIM工具包&#xff0c;支持BuildingSmart数据模型…

Codeforces Global Round 12 C1 C2. Errich-Tac-Toe 思维构造 好题

传送门 题意&#xff1a; 给了如下规则&#xff0c;上面三个只要出现一个情况就是非平局&#xff0c;现在给你个字符矩阵&#xff0c;让后其中XXX字符有KKK个(hardhardhard版本XXX和OOO一共KKK个)&#xff0c;每次操作可以将XXX变成OOO&#xff0c;OOO变成XXX&#xff0c;用不…

AGC019D - Shift and Flip(枚举)

AGC019D - Shift and Flip 很久之前WAWAWA的题&#xff0c;终于补掉了。。。这题细节是真的烦。 Solution 这题数据范围较小&#xff0c;于是我们枚举最终AAA与BBB的哪一个字符开始匹配&#xff0c;设这个位置为SSS。 然后考虑分顺时针/逆时针转到SSS两种情况讨论。 以逆时…

译 | .NET Core 3.0 Preview 6 已发布

原文&#xff1a;Richard Lander翻译&#xff1a;Edi Wang今天&#xff0c;我们宣布 .NET Core 3.0 Preview 6。它的更新包括编译程序集以改进启动、使用链接器和 EventPipe 改进优化应用程序的大小。我们还在 ARM64 上发布了针对 Alpine 的新 Docker 镜像。立即在 Windows、ma…