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

某项目在上线前的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,一经查实,立即删除!

相关文章

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…

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

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

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

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

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

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

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

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

asp.net core 集成JWT

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

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

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

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

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

译 | .NET Core 3.0 Preview 6 已发布

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

庆祝.NET Core悄然崛起:免费送50本优秀技术书籍,请笑纳!!

为了庆祝 .NET社区蓬勃发展,今天特地联合几位.NET大佬给大家带来50本高质量技术书籍。.NET Core自开源以来,依托微软强大的科技实力日趋完善,再也不是10年前那种封闭状态。强大的跨平台,强大的IDE,强大的语言特性&…

P2371 [国家集训队]墨墨的等式 同余最短路

传送门 题意: 思路: 一个同于最短路的板子题,初始的时候值为0,所以设dis[0]0dis[0]0dis[0]0,让后选择一个最小的a[i]a[i]a[i]作为basebasebase,跑一遍同余最短路就好啦。跑完dis[i]dis[i]dis[i]表示在模b…

ASP.NET Core WebAPI帮助页--Swagger简单使用1.0

1、什么是Swagger?Swagger是一个规范且完整的框架,提供描述、生产、消费和可视化RESTful API,它是为了解决Web API生成有用文档和帮助页的问题。2、为啥选用swagger?1)它具有交互式文档、客户端SDK生成和API可发现性等优点。2&am…

Codeforces Global Round 12 E. Capitalism 差分约束

传送门 题意: 思路: 一开始被题意迷惑了,没看出来差分约束,老菜鸡啦。首先看到ajai1a_ja_i1aj​ai​1可以把aia_iai​分成奇偶,让后这个图就变成一个二分图了。再考虑如何连边: (1) 对于b1b1b1的情况&…

8个月打磨,一份送给程序员的「分布式系统」合集

这里是Z哥的个人公众号每周五早8点 按时送达当然了,也会时不时加个餐~我的第「75」篇原创敬上整理好的文章目录在文末,可直接拉到最后是的,这份礼物最佳受众是程序员。但是,如果你不是程序员,相信这些能使你…

【翻译】无需安装Python,就可以在.NET里调用Python库

原文地址:https://henon.wordpress.com/2019/06/05/using-python-libraries-in-net-without-a-python-installation/pythonnet这个屌爆的项目的出现,使得我们可以用一种新的方式,让C#可以和Python之间进行互操作。但是它的设置和部署可能有点…

Codeforces Round #706 (Div. 2) E. Garden of the Sun 思维构造

传送门 题意: 给你一个nmnmnm的矩阵,其中包含字符′.′.′.′和′X′X′X′,你可以将任何′.′.′.′改成′X′X′X′,现在问你能否通过修改一些′.′.′.′来使′X′X′X′联通且不存在环。保证原本的′X′X′X′没有任何两个相…

Ocelot(六)- 架构图

简介Ocelot是一个用.NET Core实现并且开源的API网关,它功能强大,包括了:路由、请求聚合、服务发现、认证、鉴权、限流熔断、并内置了负载均衡器与Service Fabric、k8s 集成。这些功能只都只需要简单的配置即可完成。架构图Ocelot的目标是使用…

基于Dapper的开源Lambda扩展,且支持分库分表自动生成实体

LnskyDB是基于Dapper的Lambda扩展,支持按时间分库分表,也可以自定义分库分表方法开源地址 https://github.com/liningit/LnskyDB在此非常感谢SkyChenSky其中lambda表达式的解析参考了他的开源项目下面是用ProductSaleByDayEntity作为示例,其中StatisticalDate为分库分表字段,如…

P1297 [国家集训队]单选错位 期望

传送门 题意&#xff1a; 思路&#xff1a; 手推了一下没想到还真的能过。 对于相邻的两个数aia_iai​和ai1a_{i1}ai1​&#xff0c;分两种情况讨论&#xff1a; (1) ai<ai1a_i<a_{i1}ai​<ai1​ 时&#xff0c;答案在[1,ai][1,a_i][1,ai​]的范围内概率为aiai1\fra…

也读《人月神话》:没有银弹的软件工程

一、关于人月神话这本书记得在上大学的时候&#xff0c;就经常听学长和老师讲起《人月神话》&#xff0c;但是却一直没有阅读。记得当时一听到这个书名&#xff0c;还以为是个神马科幻类别的书&#xff0c;结果是个软件工程方面的书籍。这本书是“图灵奖得主、“IBM360系统之父…