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

生产环境上有个调用很频繁的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也会用到,但这段代码实在是性能瓶颈,需要重构。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在一个流量高峰期间,我们的网站开始出现了性能问题,特别是Tomcat的worker线程居高不下。这个问题对我们的系统稳定性和用户体验产生了严重影响,因此我们立即进行了排查和解决。 首先,我们使用工具监控了Tomcat的worker线程数,发现在高峰期间线程数增长过快,并且没有下降的趋势。接下来,我们对服务器进行了资源监控,发现CPU和内存的使用率都没有超过正常范围。这表明问题不是由于服务器资源不足导致的。 然后,我们查看了Tomcat的日志文件,发现一些异常错误信息与数据库连接相关。我们怀疑是数据库连接池的问题,因此我们进一步检查了数据库的连接数和连接池的配置。经过对比分析,我们发现数据库连接池的最大连接数被设置得过小,导致在高流量时无法满足请求的需求。我们立即调整了连接池的配置,增加了最大连接数,以应对高峰期的负载。 随后,我们重启了Tomcat,并观察了一段时间。我们发现线程数在高峰期开始时仍然有所增长,但是随着时间的推移开始逐渐下降,最终稳定在一个正常的范围内。这表明我们的排查和解决措施是有效的。 为了进一步确保问题的解决,我们还增加了日志监控和报警机制,以便更及时地发现和解决类似问题。 通过这次经历,我们学到了对于高并发流量情况下的线上问题,需要全面考虑不同组件的性能和配置,并对各个环节进行监控和调整。同时,日志分析和排查是至关重要的工作,能够帮助我们准确定位问题并采取合适的解决措施,最终提升系统的稳定性和性能
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值