`
javamonkey
  • 浏览: 169649 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

一次性能调优的过程

阅读更多

性能tuning和性能troubleshooting是有区别的。这次应该算是后者。因为系统很慢,每秒只能处理20多笔请求,用sar查看CPU利用率,只有2%。再用sar看了看磁盘,也不忙。相关数据库系统,第三方模拟系统都正常。压力机用的是Jmeter,是HTTP报文应该没有啥问题。那问题焦点就锁定在程序上。
  首先在程序的主路径上都打上日志,确定每个模块的执行时间点在哪儿。很快就发现请求在入队列缓存后,再出队列,居然要4秒时间。用JDK自带的Concurrent 队列,实际用不了一毫秒就能完成,为什么在我们程序里需要4秒?
  一开始怀疑入队列入的慢。查看代码,一切正常,入队列逻辑很简单,不可能很慢,后来发了单条请求试试,结果很快,1毫秒就完成进缓存,出缓存的操作。
  后来又怀疑JDK在UNIX上机器上补丁没有打全,通过google也排除了这个想法。
  早上时间很快过去了。我就反着想,要是我是个破坏者,怎么才能写出的代码把原来只需要1毫秒的事情变成4秒呢。这一下思路突然开窍了,从缓存读取的线程如果优先级很低的话,那被唤醒执行的机会就比较少,那缓存的消息就自然要花较长时间才有机会读出。于是更改了一下线程优先级到最高级别,效果立刻体现出来,这断代码由原来的4秒提高到几毫秒。
  代码还有一处显示更新数据库操作需要花的时间也是不可思议的长,大概也须有4秒。其功能非常简单的,就是更新数据库的状态表示业务完成。最初troubleshooting是排除了数据库瓶颈,后来又排除了数据库连接池的瓶颈(因为这个数据库连接池以前在性能测试测试过,没有问题),最后焦点还是在代码里,业务逻辑比较复杂,但都没有让速度变得如此之慢的代码。快到下班的时候,一个同事眼尖,发现方法声明用了synchronized,也就是同步了!!。从业务逻辑上看,此代码是线程安全的。当初用上,是啥原因不得知晓。但对于方法体具有主业务逻辑,且有IO(数据库)操作,用上synchronized,是极其风险的。后来去掉此关键字,性能马上由4秒提高了几十毫秒。

  修改了这俩处主要的地方,让测试人员在压力测试一下,程序TPS已经有100多了。且延迟只有200毫秒,提高了不少。再查看CPU,用到了10%,还不太满意。当然希望CPU能用的更多点,但考虑到程序序串行化处理的地方太多,导致CPU很难用上。或者也有可能是tomcat本生的效率导致CPU用不上。记得在以前的一次性能调优中,同样的web程序,用weblogic的吞吐量是tomcat的5倍多。
  当然CPU用不满一直困惑着我,碰到或者听说过别的项目都出现了这个问题,系统吞吐量小,延迟长,但硬件又没有问题,尤其是CPU,有得甚至不到20%。理论上讲应该是串行化操作太多导致CPU有劲无处使。可惜我也不知道怎么通过操作系统,或者虚拟机调优工具查看

  最后要结束调优的时候,测试人员反映连续压上几天,性能越来越慢,到最后几乎不再处理请求。这个现象以前遇到过,有种可能就是内纯溢出导致垃圾回收频繁。于是调正虚拟机最大内存为64M,让后在压力测试一下,通过jvisualvm,查看内存使用情况,果然到了后期,内存频繁变化,用jstat看,几乎一秒fullgc一次,难怪系统运行时间长了不再处理业务。
  下班时间到了,遇到内存泄漏的问题,感觉一时无法解决,就打算第二天再说了。

  后来这个问题通过看了整天代码和观察虚拟机,也没有发现。最后也是在熟习了此系统特点后才明白,原来并不是所谓的内存泄漏,而是该系统的缓存功能的溢出判断不正确,导致缓存里消息越来越多,最终缓存用满了内存空间导致的。


   通过以上调优,总结一下
   1 觉得对性能调优工具熟习是必须的,
   2 如果熟习系统功能,了解代码也是必须的,当然,如果是自己写的代码,有时候往往思维固定,很难看出来,还得找人帮忙看。
   3 需要把系统执行的各个部分时间打出来,任何好的系统,譬如UNXI,数据库等,总会包含这些数据的用于调优
   4 好的测试系统,一旦有新的调优观点,可以马上辅助实施。
   5 反向思维,如果系统有问题,可以把自己当着系统破坏者,看看如何才能让系统出问题
   6 最后就是觉得性能调优也好,troubleshooting也好,真急不来的
  
 
 
1
0
分享到:
评论

相关推荐

    linux性能调优.pdf

    总结来说,在Linux系统的性能调优过程中,我们不仅仅需要关注性能指标的选取和性能目标的设定,还要通过基准测试和性能分析来定位系统的瓶颈,并针对发现的问题进行有效的系统优化。同时,性能监控和告警机制的建立...

    DB2性能调优.pdf

    - **一次只改变一个性能参数**:避免同时调整多个参数,以免难以判断哪些更改产生了效果。 - **架构与流程概览**:理解DB2的内部架构对于有效调优至关重要。 **1.6 架构与流程概览** DB2内部结构主要包括以下几个...

    数据库性能调优技术--索引调优

    数据库性能调优是一项涉及多方面知识的综合性技能,它旨在通过一系列的技术手段和策略来提升数据库系统的响应速度和整体性能。 调优工作既简单又复杂。之所以说它简单,是因为在大多数情况下,调优并不需要深入到...

    weblogic性能调优的参数

    在WebLogic中,性能调优主要包括调整内存配置、线程池设置、JDBC连接池以及其他关键参数。以下是对标题和描述中提及的一些重要参数的详细说明: 1. **实体Bean缓存(max-beans-in-cache)**: 这个参数在`weblogic-...

    AIX性能调优 PPT

    一次意外的系统崩溃可能会带来巨大的经济损失和信誉损失。 - **提高生产效率**:通过性能调优,可以在相同的硬件基础上实现更高的处理能力,这意味着可以使用较低配置的硬件达到原本需要更高配置硬件才能实现的性能...

    JVM垃圾回收机制与GC性能调优

    本文主要探讨JVM堆内存的结构和GC的工作原理,以及如何进行性能调优。 JVM堆是Java应用程序的主要内存区域,用于存储所有类实例和数组。它分为三个主要区域:新域(Young Generation)、旧域(Old Generation)和...

    JVM性能调优分析过程

    JVM(Java Virtual Machine)性能调优是提升Java应用程序效率的关键环节,主要涉及内存管理和垃圾回收机制的...不过,实际调优过程中,还需要结合监控工具持续观察和调整,确保系统在各种负载条件下的稳定性和效率。

    J2EE应用性能调优.docx

    2. **持续优化**:性能调优不是一次性的任务,而是持续的过程。 3. **团队协作**:开发、运维和DBA等角色共同参与,共享优化成果。 总结,J2EE应用性能调优是一个综合性的工程,涉及到硬件、网络、操作系统、J2EE...

    vCenter性能调优和性能监控

    VMware vCenter Server是VMware虚拟化环境中的核心组件,它负责管理VMware ESXi主机和虚拟机,提供集中...然而,调优和监控工作并非一次性的任务,随着虚拟环境的不断变化和业务需求的增长,这些工作需要不断重复进行。

    Teamcenter性能调优.zip

    1. **批量处理**:通过批处理脚本或工具一次性处理大量数据,减少交互操作。 2. **并行处理**:利用多线程或分布式计算,加快转换速度。 3. **错误处理和重试机制**:建立完善的错误处理机制,避免因个别问题导致...

    linux性能调优方法总结

    atime记录了文件最后一次被访问的时间,每次读取文件都会更新这一记录,这无疑会增加磁盘I/O操作。禁用atime可以通过编辑/etc/fstab文件实现,在相应的挂载选项中添加noatime参数。例如,将一个挂载为ext3文件系统的...

    java性能调优文档(sun)

    2. **文档记录**:详细记录每一次调优过程及其结果,方便后续查询和回溯。 3. **备份计划**:在进行重大改动之前,做好完整的备份方案以防万一。 总之,《Sun Java System Application Server Enterprise Edition ...

    性能调优方案arthus

    **5.3 短链性能调优过程** 1. **数据准备**:包括环境准备、脚本设计与开发等。 2. **业务分析**:明确性能目标,对重要模块进行分析。 3. **测试执行**:执行测试脚本并记录结果。 4. **分析与结果**:根据测试...

    J2EE性能调优.pdf

    - 调优是一个迭代渐进的过程,每一次调优的结果都应反馈到后续的代码开发中。 - 性能调优不应牺牲代码的可读性和维护性。 3. **基本步骤**: - 明确性能目标,并按优先级排序。 - 使用科学的测试工具进行测试,...

    Informatica 性能调优

    【Informatica 性能调优】 性能调优是提升系统效率的关键环节,尤其在IT行业中,确保工具如...记住,调优并非一次性的任务,而是持续改进和适应的过程,以确保Informatica在不断变化的业务环境中始终保持最佳状态。

    PLSQL 存储过程 性能调优

    ### PL/SQL 存储过程性能调优 #### 概述 存储过程是数据库中预编译的一组SQL语句和过程控制结构,用于实现特定的功能。在Oracle数据库中,PL/SQL(Procedural Language for SQL)是用于编写存储过程的主要语言。...

    基于Java虚拟机内存模型的性能调优方法.zip

    本篇文章将深入探讨基于Java虚拟机内存模型的性能调优方法,帮助开发者优化应用程序,提高系统效率。 1. **Java内存模型** Java内存模型,也称为JVM内存结构,主要包括堆内存、栈内存、方法区、程序计数器和本地...

    HPux服务器性能调优

    总之,HP-UX服务器性能调优是一个涉及多方面技能和工具的复杂过程,其中包括使用SAR等系统性能分析工具进行监控和诊断,通过调整配置和优化资源分配来提升系统性能。对于任何管理HP-UX系统的专业人士而言,理解和...

Global site tag (gtag.js) - Google Analytics