记一次JAVA程序的性能调优

来源:互联网 发布:网络舆情处置应急预案 编辑:程序博客网 时间:2024/06/01 08:08

背景

笔者最近一个阶段做一个大数据方面的项目。和其他大数据项目使用Spark,ES不同,这个项目使用存文件的方式。

写文件时把用户所需要的数据全部准备好,典型的以磁盘空间换用户查询时间的方式。

大概流程如下:数据进来-->原始数据落磁盘-->小时数据汇总成各种数据报表-->天数据汇总成各种数据报表-->月数据汇总成各种报表。

原始数据量为170亿每天,最终生成各种报表后大概为200G每天,并且要做到数据具有实时性。


一些经验

1. 写代码的时候不用考虑性能问题。当前的环境是机器便宜,人贵,为了速度,时间,上线,先出东西再说。

2. 使用监控工具,比如Munin,看性能瓶颈在什么地方,是内存,CPU还是IO。

  • CPU的情况,需要找出热点地区,推荐使用VisualVM, 看CPU最长的线程,函数,找出来,看是否代码有问题,计算是否有优化空间,如果没有只有加硬件一个方法。
  • 内存情况,笔者为了减少IO情况,刚开始的时候,为了减少写磁盘的次数,把100个甚至1000个原始数据文件放在内存中,然后集中写, 但这样再遇到其他线程同时执行写磁盘操作的时候,往往造成outofmemory error 。 所以,需要根据数据量来估计内存大小。
  • 尽量集中写,对于同一个文件,尽量集中写,而不是多次写。
  • 磁盘情况。内存的buffer对磁盘IO非常重要,如果java进程挤占太多系统内存,导致buffer比较小,这会造成写磁盘非常非常的慢。buffer为操作系统对写文件操作buffer的空间,如果这个空间变小,会造成每一次写磁盘都直接跟比较慢的磁盘打交道。


内存图中绿色部分为应用程序所用,蓝色部分为buffer。 CPU图中,蓝色部分为用户所用,紫色部分为IO等待的CPU消耗时间。两边对比,可看出,当内存buffer比较小的时候,CPU IO等待时间非常大,这直接造成CPU的浪费,和数据的积压。所有java的xms参数不能把系统内存吃的太多。



0 0
原创粉丝点击