Java服务性能优化

 

一、优化思路

  • 清楚性能基线

只有清楚了服务当前的性能基线,才能更好的制定优化计划以及优化目标。不清楚性能基线的话,很难知道优化的效果,更无法清晰距离目标还有多远。

  • 确定优化目标

有目标的做事,才能更好的做事。有目标,才会清晰方向。往往一个项目有太多需要优化的地方,而有了目标,才能更好的分清优化点的优先级,而对时间才能做到更好的把控。那如何更好的达成目标,减少走弯路呢?需要我们走好优化测试闭环。

  • 优化测试闭环

服务性能优化是一个长期的工作,优化目标不是一两天就能达到的,而我们需要对自己的优化效果做到清晰准确。需要准备稳定的性能测试环境,在保证输入相同的情况下,我们需要看到优化的效果。在此环节最好了解服务的输入、资源的配置,做到小步优化,小步测试,可以更好的减少走弯路。那如何更好的做好优化测试闭环呢?需要我们能快速看到服务整体以及各环节的统计度量数据。

  • 统计度量数据

做好服务的统计度量工作,就可以每天都出一份性能测试报告,让工作更加数据化。而如何做好统计度量呢?可能会有很多做好,例如借助监控软件,而我们采取的是日志分类,通过日志然后去计算各环节所用的时间。这里需要结合具体的服务去决定如何去做。而做好统计度量,还有一个很重要的作用,我们可以快速的寻找到优化点。

  • 寻找性能拐点

根据统计度量数据,找到性能的拐点,逐步优化,以达到初始性能优化目标。

二、优化方向

一般情况下基于时间维度和空间维度两个方向考虑服务的性能优化。从时间维度来看可以从内存的使用、缓存的构建、IO的交互、代码的编译、数据的解析等多个角度考虑,从空间维度来看可以从缓存结构、数据结构、类的继承等多个角度考虑。

三、优化实战

(一)服务背景

该服务是基于PaaS平台部署的分布式服务,服务本身是基于Jstorm Topology开发的流式数据清洗服务。

(二)优化方向

  • Bolt之间的分发,由随机分发改为优先本地分发,网络IO优化。(最大的性能拐点)

  • 正则表达式的预编译,代码编译优化。

  • 构建FTP Client的链接池。

  • 模型标签的优化。

  • 缓存构建的优化。

  • 写文件的优化,文件IO优化。

  • Topology的优化。

  • 字符串的拷贝优化。

  • 数据结构容量的初始化优化。

  • 文件操作Buffer的大小优化。

  • 数据源读取Kafka消息的优化。

  • 文件解析的优化,将文件从NFS挪至Node本地。

  • 增加内存盘,减少IO。

猜你喜欢

转载自blog.csdn.net/u010313979/article/details/106735289
今日推荐