当前位置: 首页 > news >正文

性能测试中性能调优的基本原则有哪些

对性能进行调优,需要遵循一定的原则,不然可能带来更大的隐患,以下总结了4个需要遵循的基本原则。

一、规避风险。

功能优先级永远是高于性能的,任何性能优化不能以牺牲功能正确性为前提,否则性能越高,损失越大。

二、木桶原理。

解决一块短板,才能暴露出新的短板。一个应用的可优化点可能有很多个,但每个优化点对性能的影响程度是不一样的,需要确定导致性能瓶颈的最核心原因是哪一个,针对性解决这个核心问题才能带来真正的性能提升。

例如某应用既有日志量过大导致的磁盘10瓶颈,又有爬栈问题,此时CPU消耗在60%。那么此时减少日志量,改为异步日志,或者升级磁盘才能带来明显的提升。

如果仅仅解决爬问题是不会带来特别明显的性能提升的。只有磁盘10不成为瓶颈,或者通过异步日志规避线程阻塞问题后,TPS才能得到提升。

TPS提升又会导致CPU消耗更高,所以当CPU成为瓶颈时,解决爬问题才会带来明显的TPS提升。

三、优化收益评估。

从技术人员的技术追求上来说,任何优化点都是有价值的,但对企业而言,一定要考虑优化点的优先级和性价比的。性能优化首先考虑配置优化,这样成本最小而收益往往很高。

其次考虑代码逻辑优化,需要结合改动量和项目周期来综合评估,如果可能带来功能风险,又没有足够的时间进行回归测试,则不要冒险改动,宁可通过扩容等方式临时解决。

如果前几种优化都已做到极致,依然无法满足性能指标,那往往只能进行架构优化,成本当然也是最高的。

四、会用性能分析工具不等于会调优。

性能调优的最终目的是解决性能问题,工具很重要,但是思路更重要。

开车能到的地方,骑马也能到,走路也能到。好用的工具可以提升解决问题的效率,但首先得知道路该往哪个方向走。如果缺乏思路,即使有优秀的分析工具,也很可能南辕北辙。

接下来以大家熟悉的抓取Dump为例。很多初学者会认为性能问题发生后,只要抓取了Dump文件,就可以来分析性能问题了。但实际并非如此,Dump的抓取也是有技巧的,需要考虑两个问题。

首先,Dump分为线程Dump和内存Dump,那么什么情况适合抓取线程Dump,什么情况又必须抓取内存Dump?

简单来说,如果分析高CPU问题,或者怀疑有线程池耗尽、线程阻塞等问题,通常抓取线程Dump即可。如果分析内存问题,比如频繁Full GC,或者怀疑有内存泄漏的问题,那就需要抓取内存Dump。注意,内存Dump也是可以用于分析线程问题的,但是内存Dump的成本较高,对应用造成的停顿时间较长,所以能用线程Dump分析的情况肯定优选线程Dump。

其次,抓取Dump的时机有没有讲究?

当然有,具体得看分析的是什么类型的性能问题。如果是死循环、死锁、00M这类问题,那么事后抓取Dump也是可行的。但如果是一些瞬时异常过后又恢复正常的情况,例如频繁Full GC这类问题(此时非内存泄漏,内存可以正常回收,但Full GC次数非常频繁),需要通过内存Dump来分析是哪些对象占用内存较高,此时抓取Dump的时机就很重要了。如果抓取Dump的时候刚好发生过Full GC,那么在Dump中就很可能发现不了是哪些对象在频繁创建。

所以,抓取完内存Dump要注意下文件大小。

比如堆内存是1G,而Dump文件只有200M,那么很可能在这个抓取时间点刚发生过Full GC,该Dump文件就不具备分析价值,需要重新抓取合适的内存Dump文件。

最后我们用一张图来完整呈现常见的性能调优工具,如下图:

图片

如有收获,期待你关注!!!!


http://www.mrgr.cn/news/53640.html

相关文章:

  • 基于fpga技术的脉冲信号源设计(论文+源码)
  • 字符串和编码
  • 域4:通信与网络安全 第12章 安全通讯和网络攻击
  • 速盾:cdn能加速游戏吗?
  • ros2 action server示例、拓展、练习
  • 毕业设计—基于 Inception-ResNet模型的皮肤癌分类系统实现
  • 大模型(LLM)推理体系全览
  • SFT、RLHF、DPO、IFT —— LLM 微调的进化之路_如何搭建自己的dpo
  • Cesium for UE-04-一些说明
  • Docker本地镜像发布到阿里云镜像服务的简易指南
  • 从 PDF 表到见解:在 RAG 中解析 PDF 的另一种方法
  • 基于51单片机的电子时钟数码管显示proteus仿真
  • 正则化-权重衰减
  • Vue Google 广告的配置
  • 数据库原理与应用(基于MySQL):实验六数据查询
  • rpm 命令
  • PPT自动化:如何判断PPT中的shape类型(python-pptx中常见shape类型及其代码速查表)
  • 【学习笔记】理解 C++ 中 reinterpret_cast 和 C 风格类型转换的区别
  • 动态分层强化学习(DHRL)算法详解
  • 西门子嵌入式面试题及参考答案(万字长文)
  • 【SpringBoot系列】SpringBoot中集成日志的几种方式?
  • JavaWeb 开发指南
  • JavaWeb 23.一文速通npm的配置和使用
  • 【代码模板】如何用Python脚本执行shell命令并且获取命令的输出?(subprocess.Popen,subprocess.check_output)
  • TryHackMe 第8天 | Web Fundamentals (三)
  • 如何安全运行别人上传的Python代码?