gitbook/高楼的性能工程实战课/docs/357539.md
2022-09-03 22:05:03 +08:00

473 lines
32 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 05 | 性能方案:你的方案是否还停留在形式上?
你好,我是高楼。
性能方案在性能项目中是非常重要的文档之一,它指导着整个项目的执行过程,同时也约束着项目的边界,定义相关人员的职能。但令人痛心的是,如今它变得“微不足道”。
在很多常见的性能项目中,性能方案就是一个文档,并且是一个静态的文档。里面写的东西是什么,项目后续会不会按这个内容去做,基本上没有人关心。它就成了一个形式,只有在评审方案的时候才会被拿出来看看。甚至在一些第三方测试项目中,我看到有些甲方连方案的内容都不看,直接问有没有。如果有就过去了。你看,一个必需的交付物却无人关心。
**在我的性能工程理念中,性能方案是一个重量级的文档。**在性能项目中,它被叫成是“性能测试方案”。在我这里,我要把“测试”二字拿掉。为什么要拿掉?因为这取决于我在前面课程中提到的性能工程理念,我希望把整个项目的过程都描述在方案中。
我讲的性能方案和那些常见的性能方案究竟有什么区别呢?我们不妨先来看看,后者普遍都是什么样的。
这些目录相信你并不陌生,我们经常能看到有这样目录的性能测试方案。
![](https://static001.geekbang.org/resource/image/72/80/724a358cc2fyy85e6e80168baceec180.jpg)
这里我就不一一列举了,再看更多的目录,其实也是类似的。这样的目录大纲,在我看来分为这么几个部分。
* **常规项目信息**:比如说测试背景、测试范围、测试准则、测试环境、实施准备、组织结构、项目风险、里程碑。
* **性能实施信息**:比如说测试模型、测试策略、监控策略。
* **项目输出**:比如说测试脚本、测试用例/测试场景、监控采集数据,测试报告、调优报告。
从性能测试方案的角度来说,这些内容似乎够了。但是,如果抛弃掉“测试”这个视角,从一个完整的性能项目的角度来看,这些内容其实还不够。
以前经常有人问我要一个性能项目方案模板,我一直不太理解,就这么一个目录,为什么还非得要呢?自己一个字一个字也照样写得出来吧。后来我慢慢理解了,他们要的其实不是大纲目录,而是一个完整的性能方案内容。
不过,我们知道,项目实施的性能方案基本上都不太可能直接发出来,即便做了脱敏,一些内容也可以看出是属于某些企业的。所以,出于职场的素养,这些内容不得不放在硬盘里,直到过时,直到烂掉。这也就是为什么我们在网上看不到非常完整的性能方案。
可是,尽管网上的方案不完整,在性能市场上,我们还是看到有太多的性能方案是抄来抄去的,总体的结构大同小异。这也就导致了在性能项目中,大量的方案都只有形式上的意义。
因为我们这个课程需要基于一个完整的项目来编写,所以,我把这个项目整体的方案写在这里。你将看到,我认为的真正完整并且有意义的性能方案是什么样子,希望能给你一些启发。
由于性能方案的内容比较多,并且相对琐碎,我给你整理了一张性能方案的目录表格,你可以对应这张表格,来学习具体的内容。
![](https://static001.geekbang.org/resource/image/23/80/23f4edc62fbe347019198152bc2c9780.jpg)
# 性能项目实施方案
## 背景
### 项目背景
我们刚才提到,这个课程需要搭建一个比较完整的性能项目。但由于各企业的商业软件有限制,我们只能选择一个开源的项目,并且这个项目最好可以覆盖常见的技术栈,以便能给你提供更多可借鉴的内容。
基于上述原因,我们搭建了一套电商项目。对此,我要说明两点:第一,这个项目是较为完整的;第二,当前电商的系统比较典型,并且这个项目完全开源,便于我们改造。
不过,也因为这是一个开源的项目,功能和性能都不知道会有什么样的问题,我们只有在性能实施的过程中一步步去发掘,所以这是一个非常符合我们当前目标的项目。
### 性能目标
1. 根据经典的电商下单流程,测试当前系统的单接口最大容量。
2. 根据业务比例设计容量场景,充分利用当前资源,找到当前系统的性能瓶颈,并优化,以达到系统的最佳运行状态。
3. 根据稳定性场景,判断当前系统可支持的系统最大累加容量。
4. 根据异常场景,判断当前系统中的异常对性能产生的影响。
**在每一个性能项目中,性能目标都会影响项目的整个过程。因此,对目标的把握将决定一个性能项目的走向。**
记得我在之前的一个项目中客户方要求做到支持1000万人在线项目不算小开发团队有300人左右。到那里后我一看只有两个性能测试人员而且其中一个还是刚毕业还处于打野练级的状态。于是我就过去找他们科技部的老大说这个项目我做不了。因为根据这个目标和这样的人员配置我清楚这个坑根本不是我能填得上的所以得赶紧认怂。
后来,那个科技部的老大问,需要什么样的资源才能做下去呢?于是我提了几个必需的条件,直到这些条件都满足了,我才敢接这个项目。
我举这个例子是想让你明白,性能目标在上下级眼中根本是不一样的,而我这样的处理,是希望把性能目标在上下级的脑袋中变得一致。这一点很重要。
## 测试范围
### 需要测试的特性
电商主流程,如下所示:
![](https://static001.geekbang.org/resource/image/d0/57/d04fd451655e345cca2355d5c0a1d657.jpg)
### 不需要测试的特性
批量业务。
## 准则
### 启动准则
1. 确定系统逻辑架构和部署架构和生产一致。
2. 确定基础数据和生产一致或按模型缩放。
3. 确定业务模型可以模拟生产真实业务。
4. 环境准备完毕,包括:
4.1. 功能验证通过。
4.2. 各组件基础参数梳理并配置正确。
4.3. 压力机到位,并部署完毕。
4.4. 网络配置正确,连接通畅,可以满足压力测试需求。
5. 测试计划、方案评审完毕。
6. 架构组、运维组、开发组、测试组及相关专家人员到位。
### 结束准则
1. 达到项目要求的性能需求指标。
2. 关键性能瓶颈已解决。
3. 完成性能测试报告和性能调优报告。
### 暂停/再启动准则
**1\. 暂停准则**
* 系统环境变化:举例:系统主机硬件损坏、网络传输时间超长、压力发生器出现损坏、系统主机因别的原因需升级暂停等。
* 测试环境受到干扰,比如服务器被临时征用,或服务器的其他使用会对测试结果造成干扰。
* 需要调整测试环境资源,如操作系统、数据库参数等。
* 该测试机型无法达到规划指标要求。
* 出现测试风险中列出的问题。
**2\. 再启动准则**
* 测试中发现问题得以解决。
* 测试环境恢复正常。
* 测试风险中出现的问题已解决。
* 环境调整完毕。
## 业务模型和性能指标
### 业务模型/测试模型
![](https://static001.geekbang.org/resource/image/7d/b4/7d25892ee40bbdfa8074fb50c59634b4.jpg)
请你注意,这个模型并不是随便填写的,而是直接从生产环境中取得的业务比例。关于如何从生产中取出这样的业务比例,有很多种手段。这个并不复杂,通过统计日志就可以做到。
不过,在有些企业中,生产数据都在运维手里,性能团队怎么也得不到,因为没有权限,就连做业务模型的数据都没有。如果是这样的话,那性能项目是可以直接终止的,因为做了也没有多大的意义,最多也就是找那些瞎吹牛的架构师和乱写代码的开发人员,犯的一些错而已。
### 业务指标/性能指标
![](https://static001.geekbang.org/resource/image/76/99/76567b1ef8cec388c2698bb50b936499.jpg)
在不清楚项目目标TPS的情况下我们暂定目标TPS为1000。为什么暂定1000呢因为根据经验来说在这样的硬件环境下定为1000并不算高除非是没有合理的软件架构。
## 系统架构图
### 系统技术栈
系统技术栈是让我们知道整个架构中用了哪些技术组件。而这些技术组件中有哪些常见的性能瓶颈点,有哪些性能参数,我们都可以在查看技术栈时得到一些相关信息。而在后续的工作中,我们也要整理出相应的关键性能参数配置。
下面这张表格,就是我们在后续课程的案例分析中,会用到的技术栈。我在搭建这个系统时,考虑的是尽量覆盖当前技术市场中的主流技术组件。
![](https://static001.geekbang.org/resource/image/b1/99/b1691631357554701bfc4bd54cd8ae99.jpg)
### 系统逻辑架构图
画系统的逻辑架构图是为了后续性能分析的时候,脑子里能有一个业务路径。我们在做性能分析时,要做响应时间的拆分,而只有了解了逻辑架构图才可以知道从哪里拆到哪里。
![](https://static001.geekbang.org/resource/image/9b/8b/9b5730bbfb2a191a00ab3b569acbff8b.jpg)
### 系统部署架构图
画部署架构图是为了让我们知道有多少节点、多少机器。在执行容量场景时,你的脑子里要有一个概念,就是这样的部署架构最大应该可以支持多少的容量上限。
此外对一些无理的性能需求你看了部署架构之后其实就可以拒绝。比如说前段时间有个人跟我说他们有一个CRM系统在做性能的时候说要达到1万的并发用户。而实际上那个系统就算是上线了总用户数可能都不到1万。
![](https://static001.geekbang.org/resource/image/f2/2f/f2294e162a078c7053ef0887f86b762f.png)
## 性能实施前提条件
### 硬件环境
通过对整体硬件资源的整理我们可以根据经验知道容量大概能支持多少的业务量级而不至于随便定无理的指标。比如说当看到下面表格中这样的硬件配置我想没有人会把指标定为10000TPS。因为即使是对于最基础的接口层来说这样的硬件也支持不了这么大的TPS。
![](https://static001.geekbang.org/resource/image/a3/6a/a309ab88d76b436241856126a7305a6a.jpg)
我们可以看到当前服务器总共使用在应用中的资源是64C的CPU资源128G的内存资源。NFS服务器不用在应用中故不计算在内。因为单台机器的硬件资源相对较多所以在后续的工作中我们可以将这些物理机化为虚拟机使用以方便应用的管理。
在成本上所有物理机加在一起大概8万左右的费用这其中还包括交换机、机柜、网线等各类杂七杂八的费用。
我之所以会对硬件的成本进行一个说明,主要是因为在当前的性能行业中,很少有性能工程师去做成本的计算。我们说性能项目的目标是让线上的系统运行得更好,与此同时,我们也要知道使用了多少成本在运行业务系统。
在当前的性能行业中有大量的线上主机处于高成本低使用率的状态当中这是极大的资源浪费和成本消耗。我经常在性能项目中看到一台256C512G的硬件服务器里只运行了一个4G JVM的Tomcat性能工程的价值完全没有在这样的项目中应用起来。
因此,我时常会痛心疾首地感慨性能行业的不景气:
* 企业中没有意识到性能的价值,觉得摆个高配置的硬件服务器,业务系统的性能就能好起来。其实完全不是这样。
* 性能市场从业人员完全没有把性能的价值,透明化地体现出来。并且很多性能人员自身的技术能力不足,这也让一个企业完全看不到性能本该有的价值。
鉴于此,**作为性能从业人员,我们必须要了解硬件配置和整体业务容量之间的关系。**
### 工具准备
#### 测试工具
![](https://static001.geekbang.org/resource/image/d0/89/d00a8d9947301974dbb9c8ed2bf2ea89.jpg)
在测试过程中我们将使用JMeter的backend Listener把数据直接发到InfluxDB中然后再由Grafana来展现。我们不使用JMeter的分布式执行功能或本地收集数据的功能因为这样会消耗本地的IO。
然而,现在还是有很多性能人员,仍然在项目中频繁地使用那些性能工具的低性能操作手段,同时还在不断抱怨性能这么差。对于这种现状,我希望你可以明白一点:我们要理智地使用工具,不要觉得一个性能测试工具拿起来就可以用。
#### 监控工具
![](https://static001.geekbang.org/resource/image/e9/e1/e93f194c5b8be2089ee368yy85a8cee1.jpg)
根据RESAR性能工程中的全局-定向的监控思路,我们在选择第一层监控工具时,要采集全量的全局计数器,采集的计数器包括各个层级,这里请参考前面的架构图。
但是请你注意在全局监控中我们要尽量避免使用定向的监控手段比如说java应用中的方法级监控、数据库中的SQL监控等。因为在项目开始之初我们不能确定到底在哪个层面会出现问题所以不适合使用定向监控思路。
那全局监控怎么来做才最合理呢?这里我们可以参考线上运维的监控手段。注意,我们在性能监控过程中,尽量不要自己臆想,随意搭建监控工具。
有时我们可能为了能监控得更多,会在测试环境中用很多监控手段。但实际上,线上运维时并不用那些手段,这就导致了监控对资源的消耗大于生产环境的资源消耗,我们也就得不到正常有效的结果。
前面我们提到在选择第一层监控工具时,需要采集全量的全局计数器。在我们采集好全局的计数器后,还需要分析并发现性能问题,然后再通过查找证据链的思路,来找性能瓶颈的根本原因。
### 数据准备
#### 基础数据
![](https://static001.geekbang.org/resource/image/39/ab/397yycb462ac6ff675251130a359b3ab.jpg)
在性能工程中,我们一直强调基础数据要满足两个特性:
1. **满足生产环境的真实数据分布**要想做到这一点最合理的方式是脱敏生产数据。如果你要自己造数据的话也一定要先分析业务逻辑。在我们这个系统中我造了243万条用户数据和250万条地址数据。
2. **参数化数据一定要使用基础数据来覆盖真实用户**:一直以来,很多人都在使用少量数据做大压力,这种逻辑是完全不对的。在性能脚本中一定要用基础数据来做参数化,而用多少数据取决于性能场景的设计。
## 性能设计
### 场景执行策略
#### 场景递增策略
对于性能场景,我一直在强调一个观点,那就是性能的场景必须满足两个条件:
* 连续
* 递增
所以在这次的执行过程中,我也会把这两点应用到下面的业务场景中。
你也许会问,如果不连续递增的话会有什么问题呢?比如说下面这样的图:
![](https://static001.geekbang.org/resource/image/46/27/46319a3b6200f22516a51d9166026427.png)
在图中画红框的地方,其实就是递增带来的性能问题表现。因为在递增过程中,被测系统的资源要动态分配。系统会不会在这个时候抖动,我们完全可以从这样的图中看出来,而这样的场景才是真实的线上场景。
如果不连续递增,就不会有图中红框这样的部分。当然了,要是不连续递增,也就不能模拟出线上的真实场景。
高老师画重点!敲黑板了!**要模拟生产场景,连续递增一定要做到的,不容迟疑。**
而在不同工具中,设置连续递增的方式是不同的。
LoadRunner设计如下
![](https://static001.geekbang.org/resource/image/1b/06/1b739eaa3eb3f9152b0e753fa6ff1b06.png)
JMeter设计如下
![](https://static001.geekbang.org/resource/image/74/b4/74bc6a59yy4e6bbce713fdc71ef84cb4.png)
总之,请你记住,在设计场景中,我们一定要做到上面这种连续递增的样子。
#### 业务场景
在RESAR性能工程中性能场景只需要这四类即可
![](https://static001.geekbang.org/resource/image/7d/03/7df293f3b57eed500d95acf156c05303.jpg)
执行顺序先后为:基准场景、容量场景、稳定性场景、异常场景。
请你注意,除了这四类性能场景外,再没有其他类型的场景了。在每一个场景分类中,我们都可以设计多个具体的场景来覆盖完整的业务。
下面我给你一一解释一下。
**1\. 基准场景**
我经常看到有人说,用脚本加上三五个线程跑上多少次迭代,就算是基准场景了。你可以想想这样的场景意义何在?它仅能验证一下脚本和场景是正确的而已。所以,我不把这样的步骤称为基准场景。
在我的RESAR性能工程理念中**基准场景必须是容量场景的前奏**。具体怎么做呢那就是在基准场景中我们也要通过递增连续的场景做到最大TPS。也就是说在基准场景中我们要把单接口或单业务压到最大TPS然后来分析单接口或单业务的瓶颈点在哪里。
可能你会问,在基准场景中有没有必要做调优的动作呢?
根据我的经验应该先判断当前单接口或单业务的最大TPS有没有超过目标TPS。如果超过并且响应时间也在业务可接受的范围之内那就不用调优。如果没有超过那必须要做调优。
另外根据RESAR性能工程理论性能执行的第一阶段目标就是把资源用光第二阶段的目标是将系统优化到满足业务容量。要知道任何一个系统要调优都是无止境的而我们的目标是要保证系统的正常运行。
因为在我们这个课程的示例项目中只有一个系统,所以,我们先做接口级的,然后把接口拼装成完整的业务量,并实现业务模型,然后再在容量场景中执行。在这里,我们将执行测试范围中接口的基准场景。
**2\. 容量场景**
有了基准场景的结果之后,我们就进入了容量场景的阶段。在容量场景中,我们还是要继续秉承“连续、递增”的执行思路,最重要的是,要实现我们前面提到的业务模型,来真实模拟线上的业务场景。
我们可以经常看到,现在很多的性能项目里,大部分性能需求都提得不是很具体,从而导致性能场景的模型和生产场景不一致,这是一个严重的问题。
还有一个严重的问题是,即便业务模型和生产一致了,也会由于性能工程师在执行过程中没有严格模拟业务模型中的比例,性能场景的结果变得毫无意义。要知道,在执行过程中,响应时间会随着压力的增加而增加,我们仅用线程数来控制比例是非常不理智的,因为在执行的过程中会出现业务比例失衡。
那应该如何控制这个比例关系呢如果你是用JMeter的话可以使用Throughput Controller来控制业务比例如下所示
![](https://static001.geekbang.org/resource/image/fa/09/fa700cbb38e65500c211f38f4d11c809.png)
当然,你也可以用其他方式来实现。总之,在场景执行结束之后,我们要把业务比例做统计,并且要和业务比例对比,当比例一致时,才算是合理的场景。
在容量场景中我们还有一个要确定的事情就是什么是最大的TPS。
我想请你看一下这张图你觉得最大的TPS是多少呢
![](https://static001.geekbang.org/resource/image/1e/32/1e9945005c788bcbef8e15d97ca8e332.png)
你是不是想说最大的TPS是700
不管你给出的是不是这个答案,在我的性能理念中,我都想跟你强调一点:**容量场景的最大TPS是指最大的稳定TPS。**
那么你看上面这张图已经抖动了已经不稳定了我们再去找它的最大TPS还有什么意义呢你敢让一个生产系统运行在这样抖动的状态中吗所以对于上图中这样的TPS曲线我会把最大的稳定TPS定为第三个阶梯也就是在600左右而不会定在700。
另外,也请你注意,在性能场景中,特别是在容量场景中,经常有人提到“性能拐点”这个词,并且把性能拐点称作是判断性能瓶颈的关键知识。对此,我先不做评判,我们来看一下什么是拐点,它在数学中的定义是这样的:
> 拐点,又称反曲点,在数学上指改变曲线向上或向下方向的点。直观地说,拐点是使切线穿越曲线的点(即连续曲线的凹弧与凸弧的分界点)。
那么在TPS曲线中你真的能找到这样的点吗反正我是找不到。就以我们上面那张图为例图中哪里是拐点呢也许有人会说这个曲线没有拐点。咳咳那就没得聊了……
可见,性能拐点其实是一个在具体执行过程中非常有误导性的概念。请你以后尽量不要再用“性能拐点”这个词来尝试描述性能的曲线,除非你是真的看到了拐点。
**3\. 稳定性场景**
在完成了容量场景之后,我们就要进入稳定性场景的阶段了。到现在为止,在性能的市场中,还没有人能给出一个稳定性场景应该运行多长时间的确切结论。我们知道根据业务属性不同,稳定性场景也有不同的设计思路,可是这样说起来未免有些空泛。所以,我在这里给出一个稳定性场景的运行指导思路。
在稳定性场景中,我们只有两个关键点:
**第一个关键点:稳定性场景的时长。**
关于稳定性场景的时间我经常看到网上有人说一般运行两小时、7\*24小时之类的话。可是什么叫“一般”什么又叫“不一般”呢作为从业十几年的老鸟我从来没有按照这样的逻辑执行过也从来没有看到过这些运行时长的具体来源只看到过很多以讹传讹的文章。
在性能领域中,这样的例子实在太多了,现在我也见怪不怪,毕竟保持本心做正确事情最为重要。下面我给你解释一下什么才是合理的稳定性场景时长。
我们知道一个系统上线之后运维人员肯定会做运维巡检如果发现有问题就会去处理。有的系统是有固定的运维周期比如说会设定固定的Job来做归档之类的动作有的系统是根据巡检的结果做相应的动作。
而稳定性要做的就是保证在运维周期之内业务可以正常。 所以,在性能的稳定性场景中,我们要完全覆盖业务容量。比如说对于下面这张图:
![](https://static001.geekbang.org/resource/image/cc/5d/cc63a34d0df3e245d92d8b007173235d.jpg)
在运维周期内有1亿笔业务容量。根据上面容量场景中的测试结果假设最大稳定TPS是500那稳定性场景的执行时长就是
$$稳定性时长 = 100000000 \\div 500 \\div 3600 \\div 24 \\approx 2.3 (天)$$
通过这样的计算,我们就能知道稳定性场景应该跑多长时间,这也是唯一合理的方式。
**第二个关键点用多大的TPS来执行。**
对此我看到网上有人提到用最大TPS的80%来运行稳定性场景。这里我不禁要问了,为什么?凭什么不能用最大的来运行呢?
记得我在做培训的时候有过多次这样的讨论。有人说之所以用最大TPS的80%,是因为在执行稳定性场景时不能给系统太大的压力,否则容易导致系统出现问题。
这种说法就奇怪了。既然容量场景都能得出最大的TPS为什么稳定性就不能用呢如果用最大的TPS执行稳定性场景会出现问题那这些问题不正是我们希望测试出来的性能问题吗为什么要用低TPS来避免性能问题的出现呢
所以用最大TPS的80%来做稳定性场景是一个错误的思路。
在我的性能理念中,**在执行稳定性场景时完全可以用最大的稳定TPS来运行只要覆盖了运维周期之内的业务容量即可**。如果你不用最大的稳定TPS来运行而是用低TPS来运行那也必须要覆盖运维周期之内的业务容量。
讲到这里,我觉得上述内容足以指导你做出正确合理的稳定性场景测试了。
**4\. 异常场景**
对于异常场景,有些企业是把它放到非功能场景分类中的,这个我倒觉得无所谓。不管放在哪里都是要有人执行的。我之所以把异常场景放在性能部分,是因为这些异常场景需要在有压力的情况下执行。
对于常规的异常场景,我们经常做的就是:
* 宕主机;
* 宕网卡;
* 宕应用。
除此之外,在现在微服务盛行的时代,我们还有了新的招——宕容器。
当然你也可以用一些所谓的“混沌工程“的工具来实现对容器的随机删除、网络丢包、模拟CPU高等操作不过这就是一个大话题了。在这后面的课程里我会设计几个常用的异常性能场景来带你看下效果。
### 监控设计
#### 全局监控
其实,有了前面的监控工具部分,监控设计就已经出现在写方案之人的脑子里了。对于我们这个课程所用的系统,全局监控如下所示:
![](https://static001.geekbang.org/resource/image/c4/dd/c4fcbd3e0cc44ac772b7dfe334deb1dd.jpg)
从上图来看我们使用Prometheus/Grafana/Spring Boot Admin/SkyWalking/Weave Scope/ELK/EFK就可以实现具有全局视角的第一层监控。对工具中没有覆盖的第一层计数器我们只能在执行场景时再执行命令来补充了。
#### 定向监控
那后面的定向监控怎么办呢?在这里我也大体列一下常用的工具。不过,请你注意,这些工具是在有问题的时候才会去使用。
![](https://static001.geekbang.org/resource/image/6b/e8/6b96495d6983f668981f73b3805392e8.jpg)
其实在性能分析中,除了表格中的这三个工具之外,还有很多工具会在查找性能瓶颈证据链时使用,我在这里无法全部罗列出来,只能根据系统使用到的技术组件,大概罗列一下我能想到的常用工具。在后续课程的操作中,如果你发现我们用了表格中没有列出的工具,也请你不要惊讶。
## 项目组织架构
在性能方案中,我们一定要画出项目的组织架构图,并且请你一定要在这部分写明各组织人员的工作范围和职责,避免出现扯皮的情况。我大体画一下常见的组织架构:
![](https://static001.geekbang.org/resource/image/a7/7e/a74520ff665ba1fbef725f3ee178337e.jpg)
这是我按照事情来划分的,而非职场中的工作职位,我觉得这是一个合理的组织架构。在这张图中,性能脚本工程师所负责的事情,其实是现在大部分性能从业人员都在做,并且仅仅在做的事。至于性能分析工程师,在很多性能项目中几乎不存在,也没有这样的固定职位。其实,性能分析工程师很有必要存在。
此外,架构师、开发工程师、运维工程师都需要在支持性能分析的状态。请注意,我说的“支持”,并不是指站在旁边看着,而是在有了问题之后,要能具体地给出支持,而非推诿责任。
业务方是性能的业务需求来源,这是一定要有的。如果业务方提不出来什么合理的性能需求,那这个项目基本上会是稀碎的样子。
至于老板这个角色在性能项目中我经常看到的老板都不懂什么叫性能只会叫着要支持XXX并发用户数支持XXX在线用户数。其实这样的老板沟通起来也很简单就是拿结果给他就好了。不过在性能项目的执行过程中当资源不足时请你一定要让老板知道同时降低老板的预期要不然在后续的沟通中会非常费劲。
## 成果输出
### 过程性输出
1. 脚本
2. 场景执行结果
3. 监控结果
4. 问题记录
在性能项目中,过程性输出有这些内容就够了,不用更多,当然,也不能更少了。我经常看到很多性能项目在执行完之后,除了有一份性能测试报告之外,什么过程性输出都没有。我实在不理解这样的企业是怎么积累性能经验的。所以,我还是要规劝你一句,**在性能项目中,尽量多做一些归档整理的工作,以备在后面的项目中查阅,并实现自己的技术积累。**
### 结果输出
通常情况下,在我做的性能项目中,都会输出两个最终交付的文档:一个是性能场景执行结果记录的报告(就是现在我们常写的性能测试报告),另一个是性能调优报告。
#### 性能项目测试报告
性能项目测试报告想必大家见得多了,这里我只强调几点:
1. 性能结果报告一定要有结论而不是给出一堆“资源使用率是多少”、“TPS是多少”、“响应时间是多少”这种描述类的总结语。你想想性能结果都在这个报告中了谁还看不见怎么滴还要你复述一遍吗我们要给出“当前系统可支持XXX并发用户数XXX在线用户数”这样的结论。
2. 一定不要用“可能”、“或许”、“理应”这种模棱两可的词,否则就是在赤裸裸地耍流氓。
3. 性能结果报告中要有对运维工作的建议,也就是要给出关键性能参数的配置建议,比如线程池、队列、超时等。
4. 性能结果报告中要有对后续性能工作的建议。
#### 性能调优报告
为什么我要强调单独写调优报告呢?因为**调优报告才是整个性能项目的精华,调优报告中一定要记录下每一个性能问题的问题现象、分析过程、解决方案和解决效果**。可以说,调优报告完全是一个团队技术能力的体现。
## 项目风险分析
对于性能项目的风险,我把比较常见的风险列在这里:
1. 业务层的性能需求不明确
2. 环境问题
3. 数据问题
4. 业务模型不准确
5. 团队间协调沟通困难
6. 瓶颈分析不到位,影响进度
7. ......
在我们这个课程所用的项目中,比较大的风险就是:
1. 硬件资源有限。
2. 项目时间不可控,因为出了问题,并没有人支持,只能自己搞。
不过请你放心,我会努力克服困难,把这个项目的执行过程都记录下来。
到这里,整个性能项目实施方案就结束了。如果你认真看到了这里,那么恭喜你,你已经超越了很多人。我为你点赞!
# 总结
在这节课里,我把一个性能方案该有的内容以及要写到什么程度,都给你梳理了一遍。希望能给你一些借鉴。
性能方案是一个性能项目的重要输出。如果你是在项目中做快速迭代,可能并不需要写如此复杂并且重量级的文档。因为文档里描述的很多工作都已经做过了,你可能只需要跟着版本去做迭代比对就好了。
但对于一个完整的项目来说,性能方案就显得极为重要。因为它指导了这个项目的整个过程。在性能方案中,我们强调了几个重点:业务模型、性能指标、系统架构图、场景设计、监控设计等,它们都会对整个项目的质量起到关键作用。
最后,我希望你可以在后续的项目中,尝试去写一个完整的性能方案。
# 课后作业
学完这节课,请你思考两个问题:
1. 如何精确模拟业务模型?
2. 为什么我们要强调系统架构图的重要性?
欢迎你在留言区与我交流讨论。当然了,你也可以把这节课分享给你身边的朋友,他们的一些想法或许会让你有更大的收获。我们下节课见!
**关于课程读者群**
点击课程详情页的链接,扫描二维码,就可以加入我们这个课程的读者群哦,希望这里的交流与思维碰撞能帮助你取得更大的进步,期待你的到来~