下面介绍各个元问题的定义和指标。指标非常重要,而且最好是可量化的,它既能辅助我们更好理解元问题含义,又能帮助我们判断系统是否存在某些元问题以及这些元问题是否得到了解决。但注意一点,指标中所标识的越大越好或越小越好,仅指同一个指标下的相对较好,不考虑其他关联因素,比如CPU利用率并非越小越好,过小反倒导致资源浪费。因此,每个元问题不能只通过单一指标来评估,而应该结合尽可能多的指标来评估。
开发效率指开发完成需求的速度。我们常见的软件复用性、可移植性、可理解性等问题,归根结底都是要解决开发效率问题。
- 交付频率:单位时间内可完成开发交付的需求数量。可对老系统和新系统分开统计。该指标越大越好。
- 交付周期:单个需求完成开发交付的平均时长。可对老系统和新系统分开统计。该指标越小越好。
注:一个需求可以是一个接口、一个页面、一个脚本等
资源管理能力指对资源(软件及其使用的硬件)进行部署、监控、调配、备份、采集、存取、展示、故障处理等管理的能力。解决此问题要靠提升管理能力,具体就是减少管理成本和提升管理全面性,详见指标。云计算、运维人员、DevOps尤其关注此问题。
- 管理成本:实施管理的平均成本/资源规模。该指标越小越好。
- 管理全面性:可管理的资源种类数、可支持的管理类型数。该指标越大越好。
注:成本包括人力、软硬件、电力、带宽、培训等
可用性也称稳定性,是指系统开始运行之后,不发生故障(能正常提供服务)的概率和能力。故障包括但不限于:
- 在指定时间内客户端未收到服务端的返回,可能是由网络抖动、服务器宕掉等原因导致
- HTTP状态码为非200
- 服务端返回值里自定义的错误码为异常状态
- 可用性:
MTBF/(MTBF+MTTR)
。该指标一般表现为百分之N个9,一般系统达到5个9(99.999%)可算是HA(High Availability),达到6个9相当难,意味着一年内系统仅30秒不可用。该指标越大越好。- 故障平均间隔时间(MTBF-Mean Time Between Failure):相邻两次故障之间的平均时长,可看成系统可用的平均时长。
- 故障平均修复时间(MTBF-Mean Time To Repair):故障出现到修复的平均时长,可看成系统不可用的平均时长。
伸缩性指系统(尤其分布式系统)在增加或减少硬件资源时能够继续服务的能力。
- 生产变化率:
φ(k1,k2)=F(k1)/F(k2)
,表示系统规模从k1变为k2后生产率的变化。如果φ(k1,k2)<1(或>1),则φ(k2,k1)>1(或<1),这意味着系统在规模扩容变大(或缩容变小)后可以使生产率变高,但规模变小(或变大)后生产率将变低。现实中规模忽大忽小是常态,一个高伸缩性系统应该在任意规模下保持稳定的生产率,因此,该指标越接近1越好。- 生产率
F(k)=吞吐量*单任务平均处理的业务量/成本
,表示系统规模为k时单位时间内系统处理请求的投产比。 - 系统规模k指节点数、代码量、流量、数据量、系统数量等。
- 生产率
注:成本包括人力、软硬件、电力、带宽、培训等
性能指系统的运行速度和消耗资源量。
- 响应时间(RT-Response Time):也可以称为延迟,指执行一次任务平均花费的时长。该指标越小越好。
- 吞吐量:单位时间可以完成的任务数,包括了每秒事务数(TPS)、每秒HTTP请求数(HPS)、每秒查询数(QPS)。该指标越大越好。
- 并发数:系统在同一时间内能够处理的任务数。有时并发数指单位时间内总请求数,所以并发数并非公认的性能指标。该指标越大越好。
- 性能计数器:以下子指标大多标识了越小越好,但过小有时意味着资源浪费,需要根据经验估算一个平衡值。
- 系统负载(System Load):当前正在或等待被CPU执行的进程总数,反映系统忙闲程度。该指标越接近CPU核数越好。
- 线程数:该指标越小越好。
- 进程数:该指标越小越好。
- 句柄数:该指标越小越好。
- CPU使用率:按经验来算,最好在请求高峰期时小于75%,系统算是比较健康。该指标越小越好。
- 内存使用率:该指标越小越好。
- 网络IO:该指标越小越好。
- 磁盘IO:该指标越小越好。
注:一个任务可以是一次网络请求、一次接口调用、一个事务、一次定时跑批等
注:响应时间和吞吐量经常被误解是直接关系,这是因为我们经常观察到,响应时间越小,吞吐量越大。然而,两者并非直接的正反关系。实际上,随着并发请求数不断增加,吞吐量刚开始呈现线性增加,到达某个峰值后随之下降直到系统完全不可用,而响应时间一开始会保持不变,然后慢慢升高直到系统完全不可用。在并发请求数不高时,我们可以通过增加线程数提高吞吐量,而响应时间可能不变,也可以通过优化系统降低响应时间,同时吞吐量不变。有个形象的高速公路例子可以帮助我们更好地理解
安全指系统的漏洞问题,由漏洞密度、合规密度等若干指标组成。漏洞指的是软件中存在能被攻击者利用来实施窃取信息、瘫痪系统等攻击的地方。合规指的是软件在国家法律或业内规范允许范围内运行和处理数据,比如未经用户允许不得采集用户敏感数据、对敏感数据加密存储等。
- 漏洞密度:漏洞数量/系统规模。该指标越小越好。
- 合规密度:合规系统/系统规模,或者合规数据/数据规模。该指标越大越好。
- 漏洞频率
- 单位时间内新增、现存的漏洞数。该指标越小越好。
- 单位时间内修复的漏洞数。该指标越大越好。
- 漏洞周期/暴露窗口期:漏洞从发现、诊断到修复的平均时长。该指标越小越好。
- 各等级漏洞分布:高危等级漏洞占比越小越好。
- 监测成本:完成单个系统安全监测的平均时长。该指标越小越好。
- 覆盖率:经过安全监测的系统数/总系统数。该指标越大越好。
- 攻击持续时间:攻击者驻留在系统所在网络中的平均时长。该指标越小越好。
注:系统规模指节点数、代码量、流量、数据量、系统数量等
质量指系统的缺陷问题,由缺陷密度、缺陷频率等若干指标组成。缺陷和漏洞很容易混淆,缺陷是软件功能未实现、实现不完整、实现不正确的地方。测试人员尤其关注此问题。
- 缺陷密度:缺陷数量/需求规模。该指标越小越好。
- 缺陷频率
- 单位时间内新增、现存的缺陷数。该指标越小越好。
- 单位时间内修复的缺陷数。该指标越大越好。
- 缺陷周期:缺陷从创建、诊断到修复的平均时长,反映了系统的可维护性。该指标越小越好。
- 各等级缺陷分布:严重等级缺陷占比越小越好。
- 测试成本:完成单个需求测试的平均时长。该指标越小越好。
- 覆盖率:经过测试的需求数/总需求数。该指标越大越好。
注:一个需求可以是一个接口、一个页面、一个脚本等
数据指数据在存取和分析过程中的效率、管理能力、可用性&一致性、伸缩性、性能、安全、质量问题。
- 效率
- 接入效率:程序接入数据引擎的时长。该指标越小越好。
- 扩展性:在一条数据或一个数据集上增加或删除某个字段数据的平均时长。该指标越小越好。
- 管理能力
- 管理成本:对数据进行管理的成本/数据规模。管理包括部署、监控、调配、备份、采集、存取、展示、故障处理等。该指标越小越好。
- 数据全面性:可管理的数据种类数。该指标越大越好。
- 可用性&一致性
- 可用性:数据可在规定时间内进行读写的总时长/系统运行总时长。该指标越大越好。
- 一致性:读操作可以读到更新操作提交的数据的平均时长。该指标越小越好。
- 伸缩性
- 生产变化率:
φ(k1,k2)=F(k1)/F(k2)
,表示数据规模由k1变为k2后生产率的变化。该指标越接近1越好。- 生产率
F(k)=单位时间内数据最大处理量/成本
,表示系统规模为k时单位时间内系统处理请求的投产比。
- 生产率
- 生产变化率:
- 性能
- QPS:每秒能够完成的查询数据量。该指标越大越好。
- TPS:每秒能够完成的增删改数据量。该指标越大越好。
- 连接数:单位时间内所有线程数,包括活跃线程数和非活跃线程数。该指标越小越好。
- 慢查询:单位时间内执行时间超过阈值(比如10s)的所有语句的平均执行时长或数目。该指标越小越好。
- 资源负载:CPU、内存、网络IO、磁盘IO等硬件资源使用率。该指标越小越好。
- 安全
- 数据泄露率:单位时间内被泄露的数据量/全量数据。该指标越小越好。
- 监测成本:完成单条数据安全监测的平均时长。该指标越小越好。
- 覆盖率:经过安全监测的数据量/全量数据。该指标越大越好。
- 质量
- 数据损失率:单位时间内产生的问题数据与全量数据的比例。该指标越小越好。
- 测试成本:完成单条数据正确性测试的平均时长。该指标越小越好。
- 覆盖率:经过正确性测试的数据量/全量数据。该指标越大越好。
注:成本包括人力、软硬件、电力、带宽、培训等
智能特指当前软件人工智能问题,其指标主要对标机器学习的模型评估标准。当前机器学习主要关注在分类、回归、聚类三个子问题上,所以指标也以这三个问题来划分。
-
分类
- 混淆矩阵:T(True)代表预测正确,F(False)代表预测失败,P(Positive)代表预测为正样本,N(Negative)代表预测为负样本
- TP:实际为正样本预测也为正样本的概率。该指标越大越好。
- FP:实际为负样本但预测为正样本的概率,属于误报。该指标越小越好。
- FN:实际为正样本但预测为负样本的概率,属于漏报。该指标越小越好。
- TN:实际为负样本预测也为负样本的概率。该指标越大越好。
- 准确率/正确率(Accuracy):所有预测正确的样本/所有样本=
(TP+TN)/(TP+FP+FN+TN)
。该指标越大越好。 - 精确率/查准率(Precision):将正样本预测正确的样本/所有预测为正样本的样本 =
TP/(TP+FP)
。该指标越大越好。 - 召回率/查全率(Recall):所有将正预测正确的样本/所有为正的样本 =
TP/(TP+FN)
。该指标越大越好。 - F1值(F1-measure):
2*精确率*召回率/(正确率+召回率)
,等于精确率和召回率的调和平均值。该指标越大越好。 - ROC(Receiver Operating Characteristic) + AUC(Area Under Curve)
- TPR=所有将正预测正确的样本/所有为正的样本=
TP/(TP+FN)
,与召回率一样。该指标越大越好。 - FPR=所有将负预测为正的样本/所有为负的样本=
FP/(FP+TN)
。该指标越小越好。 - ROC曲线:二值分类器中根据一个阈值来划分样本是正还是负,选不同阈值可得到不同(TPR,FPR)点对,以TPR作为y轴,以FPR作为x轴,两者都取值在
[0,1]
,(TPR,FPR)点对组成的曲线即为ROC曲线。TPR越大越好,FPR越小越好,所以该指标越陡峭越好。 - AUC:ROC曲线下的面积。由于TPR和FPR均取值在
[0,1]
,所以AUC取值在[0.5,1]
,因为如果小于0.5,则全部取反就会大于0.5。该指标越大越好。
- TPR=所有将正预测正确的样本/所有为正的样本=
- 其他
- 对数损失/逻辑回归损失(Logistic regression loss)/交叉熵损失(Cross-entropy loss)
- 铰链损失
- kappa系数
- 海明距离
- 杰卡德相似系数
- 混淆矩阵:T(True)代表预测正确,F(False)代表预测失败,P(Positive)代表预测为正样本,N(Negative)代表预测为负样本
-
回归(拟合)
- 平均误差:如果异常点仅当成受损数据,则选择MAE;如果异常点很重要,必须被检测出来,则选择MSE;RMSE是在MSE基础上,让误差结果和真实值/预测值处于同一个数量级,使模型效果的描述性更好。
- MAE(Mean Absolute Error,平均绝对误差)/L1损失:∑(|真实值-预测值|)/样本量。该指标越小越好。
- MSE(Mean Squared Error,均方误差)/L2损失:∑((真实值-预测值)^2)/样本量。该指标越小越好。
- RMSE(Root Mean Squared Error,均方根误差):MSE的二次平方根=√MSE。该指标越小越好。
- 拟合优度(Goodness of Fit)/决定系数/R-square(R^2):
1-SSE/SST
。取值在[0,1]
,越接近1说明回归直线对真实值的拟合程度越好,当预测值等于真实值,则完全拟合,SSE等于0,R^2=1。该指标越大越好- SSE(Error Sum of Squares,残差平方和):
∑((真实值-预测值)^2)
。 - SSR(Regression Sum of Squares,回归平方和):
∑((预测值-真实值平均值)^2)
。 - SST(Total Sum of Squares,总平方和):SSE+SSR=
∑((真实值-真实值平均值)^2)
。
- SSE(Error Sum of Squares,残差平方和):
- 其他
- 解释变异(Explained variance)
- 平均误差:如果异常点仅当成受损数据,则选择MAE;如果异常点很重要,必须被检测出来,则选择MSE;RMSE是在MSE基础上,让误差结果和真实值/预测值处于同一个数量级,使模型效果的描述性更好。
-
聚类
- 兰德指数(RI-Rand Index):
a+d/a+b+c+d
,其中,假设U和V分别是预测和真实的聚类分布空间,a表示在U和V中都属于同一分类的样本对数,b表示在U和V中都不属于同一分类的样本对数,c表示在U中属于同一分类但在V中不属于同一分类的样本对数,d表示在U中不属于同一分类但在V中属于同一分类的样本对数。取值在[0,1]
。该指标越大越好。- 调整兰德系数(ARI-Adjusted Rand index):对于任意随机算法,RI无法保证趋近于0,即任意一种算法都可能比聚类模型得到更好的评估结果,ARI可解决此问题。
- 轮廓系数(Silhouette coefficient):
∑(S(i)^2)/样本量
。该指标越大越好。S(i)=(b−a)/max(a,b)
,表示样本i的轮廓系数,其中a是该样本与其同分类中其他样本的平均距离,b是该样本与其距离最近的其他分类中样本的平均距离。S(i)取值在[−1,1]
,同分类样本越距离相近且不同分类样本距离越远(即a越小b越大),分数越高。
- 其他
- 互信息(Mutual Information)
- 兰德指数(RI-Rand Index):