Java应用性能分析
前阵子处理双十一的事项,其中一个点是关于系统性能的评估和优化.
就当前的业务来说,双十一首要关注的是订单流转相关的性能问题,例如创建、审核、拣货以及末端配送信息的回填。
这些各个业务环节,会对应到系统上的一些程序单元或者模块,是否有性能问题其实也就是这些模块或者单元的一个性能情况。
在一些性能场景上,会有一些指标协助评估性能情况,例如TPS、并发、QPS、IO负载等,对于评估工作这些指标的收集也是一个必要的动作。
例如单位时间内,程序能够创建多少张订单、能够自动审核多少张订单、能够发送多少张订单到物流作业系统…
对于这些数据的收集,一种是对当前线上的日志分析获取,二是通过测试工具或者测试代码在类似于线上的环境模拟获取。
对于第二种方式,受限于一些实际情况,真实模拟到线上环境还是有一些困难,例如CPU、网络、IO等因素,但获取方式较为简单。
自己觉得第一种方式其实更好,能够从现有的环境中真实的反应出性能情况,对于一些共有服务,在不同业务中的耗时也是能准确反映出来,便于后续的问题排查,但这种方式需要依赖日常的日志收集和处理工作。
在性能评估完成后,需要对一些性能瓶颈进行优化,我们可以通过Jconsole或者jvisualvm等支持JMX的工具,对应用中的一些时间消耗、内存消耗进行观察,确定后进行后续的优化工作。
这一次的优化工作,主要是在评估出的瓶颈上,对程序做了一些并发改造、缓存支持和查询优化,提高了几乎一半的TPS。
并发改造上,为了不影响当前程序功能又避免并发问题,采取了对业务主键取模并发处理的方式,来保证业务单据能分隔到不同的线程中去。
缓存支持: 一是优化应用使用的Hibernate二级缓存配置,二是对部分查询形式的数据直接使用第三方缓存。
查询优化: 查询SQL的索引优化、查询逻辑转换为缓存查询
ps: 这标题是不是大了点··· 跟着标题点进来的不要拍我。