一、TP 与百分位数

1.1 TP 指标

在对系统进行性能测试或性能监控时候,TP 指标是一种比较常见的性能参数,包括 TP50、TP99、TP999 等等。

总次数 * 指标数 = 对应指标在总次数中的序号

通俗点说,假设为了测试某接口性能,对其调用 100 次,将每次的响应时间升序排序,假设响应时间排序结果为:1、2、3…99、100 毫秒。

那么:

TP50 = 100 * 50% = 第50次 = 50毫秒

也就是说,该接口 TP50 达到了 50 毫秒的水平,也就是说请求该接口有 50% 的情况耗时在 50 毫秒以下

同理:

TP999 = 100 * 99.9% = 第99.9次 ≈ 100毫秒

也就是说,该接口 TP999 达到了 100 毫秒的水平,也就是说请求该接口有 99.9% 的情况耗时在 100 毫秒以下

需要注意的是,一般在 TP 指标中,如果对应的序号不是整数,一般向上取整。例如在上例的 TP999 中,序号 99.9 不存在,取了序号 100 来计算。

1.2 百分位数

TP 指标脱离了在计算机中的应用,实际上在统计学学中就是百分位数的概念。

百分位数:如果将一组数据从小到大排序,并计算相应的累计百分位,则某一百分位所对应数据的值就称为这一百分位的百分位数。可表示为:一组n个观测值数值大小排列。如,处于p%位置的值称第p百分位数。

也就是说,TP50 其实就是 50百分位数,TP999 就是 99.9百分位数。百分位数计算的结果是一个具体值,计算公式如下:

假设存在数组(下标从 0 开始) a,百分位数为:p,将数组其升序排序后,那么:

(a.length1)p=i+j(a.length - 1) \ast p = i + j

其中 ii 为结果整数部分,jj 为结果小数部分。

计算最终结果为:

res=(1j)a[i]+ja[i+1]res = (1 - j) \ast a[i] + j \ast a[i+1]

举个例子:存在数组:[1, 2, 3, 4, 5, 6, 6, 6, 6, 7, 8, 9],已经保证升序排序了,求90百分位数,那么:

\begin{split} (a.length - 1) \ast p &= i + j\\ (12-1) \ast 90\% &= 9.9 \\ (12-1) \ast 90\% &= 9 + 0.9 \\ \end{split}

计算最终结果为:

\begin{split} res &= (1 - 0.9) \ast a[9] + 0.9 \ast a[10]\\ res &= 0.1 \ast 7 + 0.9 \ast 8\\ res &= 7.9 \end{split}

也就是说,这组数据的90百分位数为 7.9,即 TP90 = 7.9。

PS:以上公式实际上就是 Excel 的 PERCENTILE 函数的实现。

最后给出 Java 版的 TP 计算方法,供大家参考。

1
2
3
4
5
6
7
8
9
10
11
/**
* eg: tp(list, 0.95)
*/
public static double tp(List<Double> nums, double percent) {
if(CollectionUtils.isEmpty(nums) || percent <= 0 || percent > 1) {
return -1;
}
nums.sort(Double::compareTo);
int index = (int)(percent * nums.size() - 1);
return nums.get(index);
}

二、吞吐量

2.1 QPS

QPS(Queries Per Second),字面意思是每秒查询率,是一台服务器每秒能够相应的查询次数,体现了机器的最大吞吐能力。

2.2 TPS

TPS(Transactions Per Second),字面意思是每秒处理事务数。

此处的事务广义上来说指客户机向服务器发送请求然后服务器做出反应的过程,客户机在发送请求时开始计时收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数。

实际使用中,可以根据业务去自行定义事务表示的含义。