工作中还是蛮少直接接触到评估系统性能的,但是不妨碍有兴趣了解。认为这是常识,只是个人才疏学浅不了解其定义。

  TP=Top Percentile,Top百分数,是一个统计学里的术语,与平均数、中位数都是一类,为等水位线(waterline)。

  TP50、TP90和TP99等指标常用于系统性能监控场景,指高于50%、90%、99%等百分线的情况。

  上面都是学术上的定义,具体到软件系统评估的实践中怎么理解呢?以TP90为例(借用网络上搜到的资源):

    The tp90 is a minimum time under which 90% of requests have been served.

    tp90 = top percentile 90

    Imagine you have response times:10s,1000s,100s,2s

    Calculating TP is very simple:

      1. Sort all times in ascending order: [2s, 10s, 100s, 1000s]

      2. find latest item in portion you need to calculate.
        2.1 For TP50 it will be ceil(4*0.5) = 2 requests. You need 2nd request.
        2.2 For TP90 it will be ceil(4*0.9) = 4. You need 4th request.

      3. We get time for the item found above. TP50=10s. TP90=1000s

    可以认为 TP90的意思是保证90%请求都能被响应的最小耗时。例如上例中TP90=4s,就是如果要保证90%的用户得到有效的时间是4s;同理保证50%的用户得到有效相应的时间是2s。

  如果现有需求:每隔5s打印一次最近1分钟内A、B、C三个方法的TP90、TP99的耗时情况。如何实现呢?

  分析:

    1、如果要计算 TP90、TP95 或者 TP99 等水位线的值,其前提就是需要我们将所有的待计算值保存起来。此需求中打印时刻最近1分钟内调用个方法的耗时时间。

    2、用什么数据结构来存储这一系列的值呢?数组?或者列表?实际上,无论选择哪一种数据结构都不能假设其长度无限大,因为内存空间是有限的,而且数据结构也有理论上的最大值,但是要存储的值的个数却可能是无限的。因此,就需要利用有限长度的数据结构存储更多的数值。此例中,选择的数据结构是TreeSet。

    3、最后一步就是由低到高顺序排序后计算等水位线的值了。

  实现:

    1、利用dubbo filter统计各方法调用耗时时间,使用数据结构TreeSet(Java)。

      首先看下为什么选用TreeSet,看下TreeSet的结构:

        

      SortedSet通过implements Comparable进行自定义排序:

      

    此案例中耗时时间由小到大排序:

      

      

    2、计算等WaterLine的值:这个算法就比较简单了,不介绍了直接上图

      

  此文中仅介绍与WaterLine相关的内容,其具体实现再何处体现,后续Dubbo扩展点之一Filter中详述。

  

关于TP90 TP99 等常用于评估软件系统的处理性能的指标概念的更多相关文章

  1. scikit-learn 中常用的评估模型

    一,scikit-learn中常用的评估模型 1.评估分类模型: ​ 2.评估回归模型: ​ 二.常见模型评估解析: •对于二分类问题,可将样例根据其真实类别和分类器预测类别划分为:(T,F表示预测的 ...

  2. 利用pl/sql执行计划评估SQL语句的性能简析

    一段SQL代码写好以后,可以通过查看SQL的执行计划,初步预测该SQL在运行时的性能好坏,尤其是在发现某个SQL语句的效率较差时,我们可以通过查看执行计划,分析出该SQL代码的问题所在.  那么,作为 ...

  3. 通过数据库评估存储设备IO性能-Oracle11gIO校准功能介绍

    通过数据库评估存储设备IO性能 ---------Oracle11g IO校准功能介绍 前言 I/O子系统是ORACLE数据库的一个重要组成部分,因为I/O操作是贯穿数据库管理全过程,它操作的对象包括 ...

  4. 磁盘 IO 和网络 IO 该如何评估、监控、性能定位和优化?

    生产中经常遇到一些IO延时长导致的系统吞吐量下降.响应时间慢等问题,例如交换机故障.网线老化导致的丢包重传:存储阵列条带宽度不足.缓存不足.QoS限制.RAID级别设置不当等引起的IO延时. 一.评估 ...

  5. 常用SQL操作(MySQL或PostgreSQL)与相关数据库概念

    本文对常用数据库操作及相关基本概念进行总结:MySQL和PostgreSQL对SQL的支持有所不同,大部分SQL操作还是一样的. 选择要用的数据库(MySQL):use database_name; ...

  6. CentOS评估磁盘I/O性能读写极限测试

    用一个fio工具 安装 yum -y install fio 二,FIO用法: 随机读:fio  -direct=1 -iodepth 1 -thread -rw=randread -ioengine ...

  7. 使用mongoperf评估磁盘随机IO性能

    用法举例: # 16个io线程 # 随机读写10GB的测试文件 echo "{nThreads:16,fileSizeMB:10000,r:true,w:true}" | mong ...

  8. 【redis常用的键值操作及性能优化】

    服务端 启动redis服务 { // -a:指定密码 -h:指定主机 -p:指定端口 } //让redis 服务中断崩溃 //保存和关闭 //后台备份 //设置登录密码 //redis-benchma ...

  9. PCB常用低速、高速板材参数性能(2)

随机推荐

  1. 揭秘 BPF map 前生今世

    揭秘 BPF map 前生今世 本文地址:https://www.ebpf.top/post/map_internal 1. 前言 众所周知,map 可用于内核 BPF 程序和用户应用程序之间实现双向 ...

  2. 关于Vue中根组件与组件树的理解

    在观看了b站的关于Vue3的教学视频后,对Vue的根组件与组件树进行简单的总结下 一.实例化Vue应用 // 此时,app就是一个Vue应用的实例,或者说是一个对象 const app = Vue.c ...

  3. flutter之搭建环境

    一. 环境搭建1.安装Flutter SDK 使用Flutter开发,首先我们需要安装一个Flutter的SDK. 下载Flutter的SDK 来到Flutter的官网网站,选择最新稳定的Flutte ...

  4. Python多环境管理神器(pipenv)

    pipenv 参考官网:https://pipenv.pypa.io/ pipenv 是一款比较新的包管理工具,其借鉴了 javascript 的 npm 和 PHP 的 composer 等理念,通 ...

  5. Hello world.java

    Hello world 1.随便新建一个文件夹,存放源代码 2.新建一个Java文件 文件后缀名为.java Hello.java [注意点]系统可能显示没有后缀名,我们需要手动打开 3.编写代码 p ...

  6. MATLAB中回归模型

    (1).一元线性回归:数学模型定义      模型参数估计   检验.预测及控制 1.回归模型:   可线性化的一元非线性回归    (2).多元线性回归:数学模型定义 模型参数估计 多元线性回归中检 ...

  7. 【数据结构】K-D Tree

    K-D Tree 这东西是我入坑 ICPC 不久就听说过的数据结构,但是一直没去学 QAQ,终于在昨天去学了它.还是挺好理解的,而且也有用武之地. 目录 简介 建树过程 性质 操作 例题 简介 K-D ...

  8. 字节跳动Web Infra发起 Modern.js 开源项目,打造现代 Web 工程体系

    10 月 27 日举办的稀土开发者大会上,字节跳动 Web Infra 正式发起 Modern.js 开源项目,希望推动现代 Web 开发范式的普及,发展完整的现代 Web 工程体系,突破应用开发效率 ...

  9. 如何在 VS Code 中为 Java 类生成序列化版本号

    前言 IDEA 提供自动生成序列化版本号的功能,其实 VS Code 也可以,只是默认关闭了这个功能,下面就来看看如何开启这个功能吧. 配置过程 首先需要保证 VS Code 上安装了提供 Java ...

  10. mac每次打开终端都需要source ~/.bashrc以及~/.bash_profile问题

    问题描述 在学习git的时候在~/.bashrc下面配置了git log命令的别名 #用于输出git提交日志 alias git-log='git log --pretty=oneline --all ...