前言:上一文章里总结了怎么做好一个性能测试的流程,下面来细说一下在遇到性能问题时,怎么对某个现象进行正确的分析。首先肯定要根据现象来确定问题,比如现象是游戏帧率低,需要确定帧率低是由什么导致的;通过采集性能数据,可能和CPU,GPU,内存等有关;然后再针对具体问题具体分析。
目录
8条分析性能的战术
1. 心中熟知硬件图
分析性能问题要从数据入手,而数据是操作系统中产出的,操作系统又是基于硬件设备的,所以我们首先需要了解计算机硬件的模型,下图模型可以分为4类:
- 执行计算:CPU+GPU
- 存储:Cache+RAM+SSD/HDD+Graphics中的显存
- 通讯线路:CPU和Graphics的内部通讯线路+DIMM+PCIE+DMI+USB+Network
- 其他电路模块:PCH等
补充:CPU到GPU的数据流模型图
- 将数据从RAM中复制到显存中
- CPU发送指令驱动GPU
- GPU中的每个计算单元进行并行处理,如果需要数据会从显存中获取
- 计算结束后GPU将显存中的结果返回RAM
分析性能问题的时候应该始终都要考虑软件程序在什么样的硬件系统上运行,对于不同硬件配置的机器,我们的分析策略,产生问题的因素也不一样,任何时候都不能跳出硬件框架去分析软件性能。
2. 了解数据流的方向
数据流的作用:
- 通过数据流的方向可以知道程序在计算机中的执行逻辑;
- 通过观察数据流在哪个地方流的比较慢,或者在哪个地方长时间没有数据流过,我们就可以评估出可能的性能瓶颈在哪里。
3.了解各个模块衔接的管道粗细
管道的粗细决定着单位时间内允许通过的数据量的大小,比如PC上进行CPU和其他硬件通信的总线的带宽很大,而USB和network传输的数据量就比较小,所以了解各个模块衔接的管道带宽对我们分析出性能瓶颈所在是非常重要的。
下面给出相应线路数据带宽:
- DIMM
- PCIE
- DMI
4. 能评估各模块的数据处理能力
数据处理能力主要是:
- CPU和GPU单位时间内处理指令的能力(一般情况下在单位时间内CPU和GPU能够执行各种类型的指令多少条)
- 磁盘和网络IO的数据处理能力(单位时间内磁盘和网络IO能够反馈给目标多少请求数据)
不同型号的硬件的处理能力不同,同一个硬件在不同环境的处理能力也可能不同,所以要衡量一个硬件的数据处理能力,要通过各项指标同步去分析和评估,单一的指标在当前环境中可能不能说明这个模块是否遇到了瓶颈,比如:帧数,帧耗时,CPU,GPU等;不同的环节所参照的指标也不同,每一个指标都有一个浮动区间,在区间范围内是正常,反之不正常。
5. 利用各种指标去匹配性能热点产生的原因
比如:游戏发生渲染帧数下降,采集一份数据发现逻辑帧满帧,CPU利用率上升,GPU利用率下降;渲染帧数下降,逻辑帧数满帧说明和逻辑线程无关,重心应该关注渲染线程;GPU利用率下降说明和GPU关系不大,CPU利用率上升说明CPU要计算的东西变多了,这时就可以定位到该问题是CPU类的问题;
用到的指标:
- 渲染帧数指标
- 逻辑帧数指标
- GPU利用率指标
- CPU利用率指标
下图为各个指标的性能因果分析总结:
6.通过控制变量法验证热点产生的原因
找到可能造成性能热点的原因后,要对这些原因加以验证;在分析出可能是由多个原因导致性能热点的时候,我们要用控制变量法保持其余变量不变的基础上,验证当前变量触发后是否会产生性能热点。
如果条件允许,尽可能在验证之前先重现一下该问题。
7. 尽量提出通过实验得到的可行建议来优化该热点
在验证得到问题产生的原因后,还需要能向开发者提供出有效的解决方案,这里需要我们学习很多项目相关的逻辑代码和资源的处理过程,这可能会花费很多的时间去学习新的知识,但是这些学习会让我们在之后做类似的事情的时候对问题的分析和验证更有经验和底气。
8.再次对优化结果加以验证
优化很难一步到位,将一个性能热点解决可能会连锁产生其他的问题,这种时候我们需要做到耐心的面对问题,对问题不断的进行验证和优化,在验证中可能又会发现新的问题,而再次的验证可能会帮助我们找到更好的解决方法,帮助我们积累更多的经验。