`
propig
  • 浏览: 779 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

记一次线上产品的性能问题的分析

 
阅读更多

生产环境上有个调用很频繁的service,性能不太好。表现为平均500次调用有5,6次极慢以至于客户端超时,也就是说失败率为百分之一。在高并发的情况下尤其明显。

这个问题摆到了我的面前。暂且叫这个service为A吧

还有什么办法,从日志入手吧。

首先,从海量日志中过滤出有关A的调用,方法很多,我用了vim中的正则表达式匹配,这个问题按下不表,以后有机会再专门谈正则表达式。过滤出来的日志记录了A的调用发生时间,结束时间,调用状态,SessionID等重要信息。

第二,分析一下吧,该服务从晚上22:15:37开始,到22:20:01结束,一共不到五分钟

总调用数:

491

平均值:

8.185484

标准差:

17.575592

小于5秒的调用数:

421

大于5秒的调用数:

70

调用失败的个数

6

最小调用时间:

0.32004

最大调用时间

64.9905

这不到5分钟的时间里,发生了近500次的调用,其中调用时间正常的有421次,绝大部分的调用时间都在0到2秒以内。其中有6次失败为数据库失败,出错信息为:1) failed: [GetCustomer] failed: 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.

 

继续分析日志,可以得出,在数据库出错先后,服务调用的返回时间在30秒和60秒这个量级,远远高于正常水平。

 
 
<!--[endif]-->

地方又发现,该服务A返回时间的长短和并发数量有显著的关系。

 

 该图的横轴是时间轴,纵轴的指标有两个,蓝色代表服务执行的时间,红色代表并发量,由图上可以看到,两个阶段服务时间的延迟是由于并发量突然增大而导致。

 

第三,分析代码

    为啥在并发量突然增大的情况下,该服务的调用时间会有指数级别的增加?还得回到代码分析。

 

    这段代码首先关闭当前的Customer,在根据已经有的参数重新装入。此处用了C#锁的机制,根据UserId和CustomerId来限制进入这段代码的线程数量。但由于不同的User打开的Customer不一定相同,所以应该不能限制访问该代码的线程数量,于是大量的数据库请求涌入数据库连接池。CloseCustomer与LoadCustomer都是非常费是时的操作,导致许多线程得不到数据库连接,处于等待状态,甚至超时,失败返回。

 

结论,

根据以上分析,我给出了两个结论

1. 增大数据库连接池的大小

2. LoadCustomer不但本Service要用,其他的Service也会用到,但这段代码实在是性能瓶颈,需要重构。

  • 大小: 56 KB
  • 大小: 19.9 KB
  • 大小: 19 KB
分享到:
评论

相关推荐

    [OOM] 记一次线上OOM的问题 - ado19861

    本文将详细探讨一个线上出现的OOM问题,以及如何通过日志分析、使用Eclipse的Memory Analyzer Tool(MAT)以及最佳实践来定位和解决问题。 首先,我们看到的现象是Tomcat服务器在运行过程中出现了OOM错误,这通常...

    《程序人生》记一次敖丙的线上P2事故.pdf

    "程序人生记一次敖丙的线上P2事故" 概述: 本文档记录了敖丙的线上P2事故,详细记录了事故的过程、原因和解决方案。事故的原因是由于CPU使用率达到99%,导致系统响应时间增加,影响用户体验。通过分析,发现问题的...

    《程序人生》记一次敖丙的线上P2事故1

    "《程序人生》记一次敖丙的线上P2事故1" knowledge points: 1. 程序 BUG 的处理:文章中提到 P2 级别的 BUG,是指系统中出现的严重错误,需要立即修复,以避免更大的损失。 2. 线上事故处理:文章中提到线上事故...

    记一次因线上mysql优化器误判引起慢查询事件

    本文讲述了线上MySQL数据库中由于优化器误判索引选择导致的慢查询事件,并分享了如何通过强制指定索引来解决此问题。这个案例涉及到了MySQL的查询优化器、索引选择机制、以及慢查询优化方面的知识。 1. MySQL优化器...

    快餐店线上点餐系统.zip

    该系统基于Java技术和MySQL数据库,提供了一整套完整的源码,确保用户可以根据自身需求进行二次开发或部署。 一、Java技术 Java作为后端开发的主要语言,具有跨平台、性能稳定和丰富的库支持等特点。在快餐店线上...

    基于ssm+jsp的线上选课系统.zip

    【描述】该压缩包文件中的内容是针对Java Web开发的一次实际应用,使用了Spring作为核心的依赖注入和AOP(面向切面编程)框架,SpringMVC负责处理HTTP请求并调度控制器,MyBatis则作为持久层框架,用于数据库操作。...

    《海量数据处理与大数据技术实战》、《MySQL技术大全:开发、优化与运维实战》作者 旨在分享各种编程语言、开发技术、分布式与微服

    记一次线上重大事故:二狗子竟然把线上数据库删了!! 面试官问我:MySQL如何实现无数据插入,有数据更新?我是这样回答的! 我这样分析MySQL中的事务,面试官对我刮目相看!! 如何添加新数据库到MySQL主从复制环境...

    清晖8.1线上文字辅导(第二十一课)1

    克劳斯比则强调质量应符合要求,主张一次性做好,追求零缺陷。石川馨的因果图(鱼骨图)是问题分析的有力工具,田口玄一倡导设计阶段就考虑质量,反对事后检查。六西格玛则是一种追求极高的合格率标准,旨在减少错误...

    互联网性能测试经验分享

    - 通过对该子系统的功能分析以及其读取数据的方式探究,最终发现导致性能下降的根本原因是由于特定的操作系统配置与子系统间的兼容性问题。 #### 案例三:网络环境对性能的影响 - **测试对象**:由两个模块组成的...

    ASP.NET思威线上CRM客户关系管理系统

    ASP.NET思威线上CRM客户关系管理系统是一款基于ASP.NET技术构建的高效、易用的企业级解决方案,旨在帮助企业管理和优化与客户的关系,提升销售效率和服务质量。CRM(Customer Relationship Management)系统的核心...

    互联网产品生产流程图.pdf

    - **二次开发**:根据用户反馈和数据分析,进行产品功能的调整和优化。 - **系统运维**:确保产品上线后的稳定运行,包括故障排查、性能监控等。 - **产品验收**:每个迭代周期结束后,都需要进行验收,确认产品...

    课程设计基于SpringBoot+SpringCloud的高校线上课程报名服务系统源码.zip

    SpringCloud是构建大型分布式微服务系统的工具集,它为SpringBoot应用提供了云应用所需的配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态等功能。...

    应用系统分析与设计

    现有的系统不足之处在于领票和订场都需要现场排队,且存在用户一次性领取多张票的情况,这不仅导致资源浪费,还可能导致公平性问题。 为了解决这些问题,提出了网上订场系统的设计理念。通过线上平台,用户可以便捷...

    记一次公司JVM堆溢出抽丝剥茧定位的过程解析

    在本篇《记一次公司JVM堆溢出抽丝剥茧定位的过程解析》中,作者详细阐述了一次处理公司线上JVM堆溢出问题的排查和解决过程。问题发生在线上Tomcat服务中,该服务合并部署了8个微服务,以节省服务器资源。在上线后...

    基于单片机的逻辑分析仪资料制作及测试过绝对可用全套设计及说明材料.zip

    在电子工程领域,逻辑分析仪是一种非常重要的工具,它能够帮助开发者分析数字信号的时序、状态和脉冲特性...此外,自己动手制作逻辑分析仪不仅节省成本,还可以根据个人需求定制功能,是一次充满挑战和乐趣的学习经历。

    互联网行业网站测试公司网站压力测试手册模板.pdf

    压力测试不是一次性的任务,随着业务发展和技术更新,应定期进行,以确保系统的健壮性和用户体验。 总的来说,这份手册将指导测试团队有效地进行压力测试,为互联网行业的网站提供稳定、高效的服务。它不仅关注技术...

    销售管理系统源码(c c# c++ 毕业设计)

    销售管理系统是一种用于企业内部管理销售...对于初学者来说,这是一次很好的实践机会,可以提升编程技能和理解软件工程的全貌。同时,对于有一定经验的开发者,这个源码可以作为参考,了解不同的设计方案和优化技巧。

    隽隽在线书店的分析与设计

    3. 购物车:用户可以将多本书加入购物车,方便一次性结算。 4. 订单处理:支持用户下单、付款、取消订单及查看订单状态等功能。 5. 用户账户管理:用户可以注册、登录、修改个人信息、查看购买历史等。 6. 客户服务...

Global site tag (gtag.js) - Google Analytics