性能测试中性能调优的基本原则有哪些
对性能进行调优,需要遵循一定的原则,不然可能带来更大的隐患,以下总结了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文件。
最后我们用一张图来完整呈现常见的性能调优工具,如下图:
如有收获,期待你关注!!!!