性能调优的层次

      为了提升系统性能,我们可以从系统的各个角度和层次对系统进行优化。除了最常见的代码优化外,在软件构架上,JVM虚拟机层,数据库及操作系统层面都可以通过各种手段进行调优,从而在整体上提升系统的性能。

1.设计调优

设计调优处于所有调优手段的上层,它往往需要在软件开发之前进行。在软件开发之处,软件设计构架师就应该评估系统可能存在的各种潜在问题,并给出合理的设计方案。由于软件设计和构架对软件整体质量有决定性的影响,所以,设计调优对系统性能的影响也是最大的。如果说,代码优化,JVM优化都是对系统微观层面上“量”的优化,那么设计优化就是对系统在宏观层面上“质”的优化。

设计优化的一大显著特点是,它可以规避某一组件的性能问题,而非改良该组件的实现。比如,系统中组件A需要等待某事件E才能触发一个行为。如果组件A通过循环监控不断监测事件E是否发生,其监控行为必然会占有部分系统资源,因此,开发人员必须在监测频率和资源消耗间取得平衡。如果监测太低,虽然减少了资源消耗,但是系统实时反应性就会降低。如果进行代码层的调优,就需要优化监测方法的实现以及求得一个最为适当的监测频率。

而若将此问题预留在设计层解决,便可以使用事件通知的方式将系统行为进行倒置。如使用设计模式的观察者模式,在事件E发生的时刻,由事件E通知组件A,从而触发组件A的行为。这种设计方法弃用了存在性能隐患的循环监控,从根本上解决了这一问题。

进行设计优化时,设计人员必须熟悉常用的软件设计方法,设计模式,基本性能组件和常用优化思想,并将其有机地集成在软件系统中。

ps.一个良好的系统设计可以规避很多潜在的性能问题。因此,尽可能多花些时间在系统设计上,是创建高性能程序的关键。

2.代码调优

代码调优是在软件开发过程中,或者软件开发完成后,软件维护过程中进行的对程序代码的改进和优化。代码优化涉及很多编码技巧,需要开发人员熟悉相关开发语言的API,并在适当的场景中正确使用相关API或类库。同时,对算法,数据结构的灵活使用,也是代码优化的重要内容。

虽然代码优化是微观上对性能进行优化,但是一个好的实现和一个坏的实现对系统影响也是非常大的。如,同样作为List的实现,LinkList和ArrayList在随机访问上的性能可以相差几个数量级;又如,同样是文件的读写,使用Stream方式与java NIO的方式,其性能可能又会相差一个数量级。

因此,虽然和设计优化相比,将代码优化称为在微观层次上进行优化,但是他却是对系统性能产生最直接影响的优化方法。

3.JVM调优

由于java软件总是运行在JVM虚拟机上,对JVM虚拟机进行优化也能在一定程度上提升java程序的性能。jvm调优通常可以在软件开发后期进行,如在软件开发完成或在软件开发的某一里程碑阶段。

作为java软件的运行平台,jvm的各项参数将会直接影响java程序的性能。比如,jvm的堆大小,垃圾回收策略等。

要进行jvm层面的调优,需要开发人员对jvm的运行原理和基本内存结构有一定的了解。如内存的结构,GC的种类等。然后依据应用程序的特点设置合理的jvm启动参数。

4.数据库调优

对绝大部分系统而言,数据是必不可少的一部分。对数据库的调优可以分为3个部分:

  • 在应用层对SQL语句进行优化;如对于大量的拥有相同结构的SQL,可以使用PreparedStatement代替Statement,以提高数据库的查询效率;select 显示查询列名,不用”*“。
  • 对数据库进行优化;主要目的是建立一个良好表结构的数据库。如,为了提高多表级联查询效率,可以合理使用冗余字段;对于大表,可以使用行的水平切割或类似Oracle的分区表技术;为了提高数据库查询速率,可以建立有效合理的索引。
  • 对数据库软件进行优化。根据不同的数据库,优化配置一些参数。如内存,缓冲池大小等。这些对性能都有较大的影响。

5.操作系统调优

作为软件运行的基础平台,操作系统的性能对应用也有较大的影响。不同类型的操作系统,调优的手段有所不同。比如,在主流的Unix系统中,共享内存段,共享内存最大值(shmmax),共享内存最小值(shmmin)等都是可以优化的系统资源。此外,如最大文件句柄数,虚拟内存大小,磁盘的块大小等参数都可能对软件的性能产生影响。

 

 

posted on 2014-03-17 21:36  梦之秋泪  阅读(711)  评论(0编辑  收藏  举报