记得在前些年,有一次,在客户那里做系统的性能分析和调整时,也是一点一点的分析,也没有什么头绪。有一个客户那边的负责人,对我们当时的一些做法表示不理解,当时他说了一句话:“做性能分析和调整,首先你得有自己的方法论,然后再谈具体的技术手段”。当时我们还觉得这个客户对我们有意见,觉得自己的做法没有什么不对的。但是在后面这些年里,我深刻的感觉到,这句话真是金玉良言。
其实我并不大喜欢充满哲学味道的东西,我喜欢简单直白的,但是,过于直白,直指目标的一些做法,让自己走了很多弯路,付了很多额外的代价,回过头来,再琢磨,原来那些简单又质朴的话,是不能违背的规律,是必须遵守的守则。
意识到这些之后,我特意针对性能分析和性能调优进行了很多的总结,尤其侧重在方法论,简单的描述一下吧。
第一:要判断性能分析的目标
是为了PK,还是为了实际使用?
你的真实场景,到底需要什么样的性能?
第二:你的周边环境,到底可以为你提供什么样的效率和性能?
例如数据库、例如网络
第三:业务的分析
业务流程是否可以优化?来提高效率?这个最好是对着每一个业务的流程图仔细思考。
第四:检查你的架构
软件实现层面的效率问题,很多都是由架构不良带来的,你即便每一行代码都精简,都无法扭转坏的架构带来的影响。
例如在哪里应当使用缓存,在哪里必须实时读数据库;在哪里需要等待(Sleep),在哪里可以立即进行;在哪里必须使用同步锁,在哪里可以并行或异步,等等等等。
第五:使用性能分析工具
一般来讲,一般不使用性能分析工具来判断架构是否存在问题,而是用来判断具体代码环节是否有问题。使用工具,理念就是“先查找到瓶颈,再进行优化”。实际上,应该是前边几条之后,再进行这一层面上的分析。
工具有几类,有Java自带的工具,有其他第三方工具。
Java命令行可以通过参数,直接进行CPU、内存的分析。当然,还有JConsole和VisualVM,可以用来辅助进行性能分析。还可以分析GC的活动。
第三方工具包括JProfile之类工具,可以进行更加细致的分析,分析结果直接转换成实时的曲线图,非常容易定位性能瓶颈。
使用工具,一般应该首先关注CPU(当然,除非你怀疑自己的系统有内存泄漏问题而进行排查,那样的话,优先关注内存),其次得关注线程(是否有过多的锁定和等待)。
关注CPU,直接定位到最消耗CPU的部分和方法,那么可以非常有针对性的把方法替换为高效实现,这是最简单的系统优化方法。
例如在某个系统分析时,发现Base64.encode消耗CPU非常多,于是在网上搜到了一个FastBase64的实现,替换上去,就发现系统性能马上提高一大截。
当然,最常见的是,解决了一个瓶颈,性能有所改进,又遇到另外一个瓶颈,每一步都非常艰难,每一步都有所进步。
关注线程,非常有利于发现配置不当引起的性能问题。例如数据库连接池配置的太小,例如线程池配置的太小,引起很多时候都在等待空闲连接(或空闲线程)的释放,发现哪里的问题,就可以通过调整配置的方式来改进系统。
关注内存,可以发现是否因为内存的不当使用,使系统很多时候在做GC,从而引起业务的暂停。
最后一点:要考虑系统特性的平衡
系统在某一个性能数据上,达到了一种极致。在此时,再继续做性能的优化,一定会牺牲系统的其他特性。在此时,如何折衷?是性能至上,继续高歌猛进,牺牲其他特性(例如可扩展性等等);还是优先考虑其他特性,接受当前的性能呢?这是所有架构师需要仔细考虑的问题。
说句题外话,在产品的设计、实现期间,又何尝不是如此,先要有了工作的方法论,再谈技术。没有方法论,产品变成一堆技术的杂烩,是一件可悲的事情。
相关推荐
使用场景及目标:此项目适用于高校的实训教学环节,帮助学员了解并掌握嵌入式系统开发的具体方法论及其应用场景;在真实世界环境中模拟现代农业技术的发展趋势与需求。 其他说明:文中详述了各个实施阶段的任务规划...
综上所述,本文档不仅详细阐述了微信小程序在校园健康打卡系统中的设计与实现,而且通过系统需求分析、技术选型、系统实现及测试等环节,向读者展示了整个开发流程和技术选型的参考。对于想要了解微信小程序开发或者...
综上所述,本篇文档不仅涉及到了在线考试系统的业务逻辑实现,还涵盖了系统设计和开发过程中所使用的各种技术。它展示了如何利用Java及其相关技术栈开发一个功能完善的在线考试系统,体现了软件开发流程中的需求分析...
使用场景及目标:作为大学课程设计的一部分,帮助学生理解复杂的汽车电子系统设计流程,掌握驱动防滑控制的基本原理和技术要点。同时也适用于工业界工程师们借鉴参考,应用于新产品开发。 阅读建议:本文提供了详尽...
③掌握Flask框架的核心特性和应用开发方法论;④按照规定编写整洁高效的Python源代码。 阅读建议:学习本课程设计文档的同时应当实际动手练习所学的内容,最好能在本地环境中重现各个步骤,以此确保能彻底吸收所有的...
人工智能是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。人工智能可以用于五子棋游戏中,玩家可以和计算机进行对决。计算机可以分析棋盘局势,给空位估值,找到最佳落棋...
内容概要:本文档深入探讨了基于Python实现的一个完整的可摘局部义齿智能设计支持系统。首先介绍如何利用面向对象编程的思想建立多个层次的数据模型,包括表单数据、离散型图形数据以及连续型图形数据模型,用于准确...
在计算机科学与技术领域,尤其是在人工智能方向,设计一个论文引用推荐系统,不仅能够锻炼学生的系统设计与开发能力,还能够加深对推荐算法尤其是协同过滤算法的理解。本资源项目正是这样一个实践项目,它不仅包含了...
结构化分析方法(Structured Analysis, SA)是一种传统的软件开发方法论,它主要关注系统的功能需求,强调以模块(即过程)为中心的设计思想。该方法遵循模块化原则,采用自顶向下、逐步细化的方式进行系统设计,...
适合人群:机械工程领域的研究人员和技术人员,尤其是那些希望深入了解齿轮设计和性能分析的人群。 使用场景及目标:适用于研究和开发新型齿轮传动系统,以及进行现有系统的改进和优化。主要目标是提高齿轮传动效率...
文档覆盖了需求分析、系统设计、功能设计、前后端技术选型及其具体实现、数据库设计及其实现细节、测试方法、部署策略及最终的项目评估等多个维度。其中技术栈采用了Java语言及Spring生态完成后台逻辑,并由Vue.js...
人工智能 AI 是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。在五子棋游戏中,计算机可以分析棋盘局势,给空位估值,找到最佳落棋点,如极大极小博弈树估值搜索算法、...
使用场景及目标:本项目为参与者的个人课题作业提供了指导,参与者将利用MATLAB/Simulink平台构建虚拟实验模型,探索不同的设计方法论及其背后的科学数学原理。最终目标是在确保效率的同时减少对人类劳动力的需求,...
同时,指导学生在实际开发中应用UML建模,提升系统设计的能力。 其他说明:文中提供了详细的用例表和性能测试报告,有助于学生全面理解和展示系统的需求、设计和实现过程。 -可实现的-有问题请联系博主,博主会第一...
由于【部分内容】提供的信息断断续续、存在技术性识别错误,并夹杂了一些无关紧要的技术...尽管文档片段中有些内容因为OCR技术的限制而变得模糊,但我们可以推测这是一篇专注于技术实现和软件工程方法论的毕业论文。
这些技术共同构成了现代游戏AI的强大基石,让游戏世界中的交互、故事叙述和玩法设计更加智能和引人入胜。 作为游戏开发者,不仅需要理解这些技术的基本原理和应用场景,还需要对它们的局限性有清晰的认识。由于游戏...
本作业占总成绩的30%,主要面向硬件与软件的知识掌握,涵盖嵌入式开发、顶层设计方法论的应用、程序结构的设计、装配级语言程序设计和微控制器ADC的实现等方面的内容。学生需要通过FRDM-K64F板完成特定任务,并撰写...
内容概要:该论文聚焦于拦截弹制导控制系统,旨在提升其实时性和收敛速度。文中介绍了通过引入快速收敛终端滑模控制(Fast Convergent Terminal Sliding Mode...此外提供了具体的设计流程和技术细节供相关专业人员参考。
领域驱动设计(DDD)是一种软件开发的方法论,它侧重于将复杂的业务需求转化为软件解决方案。DDD 的核心在于将领域专家的知识与软件开发人员的技术能力结合起来,以创建出能够反映业务逻辑的模型。在 DDD 中,领域...