性能指标体系构建

前言

在这唯快不破的互联网世界中,“快”(响应速度)成为良好体验的一个重要因素。那么如何量化响应速度哪?

性能指标的分类

为了更好的去监控整个系统的性能,做好全流程的优化,将指标分为了以下3类:

  • System performance:这类指标从物理资源即服务器的角度出发,监测目前服务器的cpu,内存,网络带宽,流量等。
  • Perceived system performance:这类指标主要从工程师的角度去衡量,如后端的响应时间,当前并发的用户数,请求数,请求的错误率等等。
  • Perceived user experience:这类指标从用户体验的角度出发,如首屏时间,白屏时间,完全加载时间之类,即用户能实际感觉到得网页加载延迟,用来衡量用户的真实体验。

对于上述的每一类,衡量标准可能都不一样,在数据展示方面,主要通过趋势图和汇总表格来展现,下面来对这3类指标分别细说:

##System performance

这类指标主要监测目前服务器的cpu,内存,硬盘io率,网络带宽,流量等等物理资源的使用情况,这类指标比较常见,就不细说了。

某内部服务的cpu使用率情况:

某内部服务的硬盘io情况:

某内部服务的网络io情况:

##Perceived system performance

这类指标主要为工程师设计,来衡量业务后端的处理速度,主要从以下几个方面去衡量:

1) 响应时间

首先对每个业务的整体(集群)响应时间有个衡量:

  • 95%的响应时间:将一段时间内所有请求的响应时间中取一个值,使95%的请求响应时间均小于或等于它,此值即为95%请求覆盖的响应时间。
  • 90%的响应时间:将一段时间内所有请求的响应时间中取一个值,使90%的请求响应时间均小于或等于它,此值即为90%请求覆盖的响应时间。
  • 50%的响应时间:将一段时间内所有请求的响应时间中取一个值,使50%的请求响应时间均小于或等于它,此值即为50%请求覆盖的响应时间。

以某内部服务为例,3条不同的曲线分别代表了3种不同的响应时间维度:

另外为了方便工程师的优化,对具体到每个请求url都做了更精细化的统计,不光统计了上述的指标,还增加了:

  • 最大响应时间:某请求的某段时间范围内响应时间的最大值。
  • 最小响应时间: 某请求的某段时间范围内响应时间的最小值。
  • 时间标准差:某请求某段时间范围内的波动情况,用来衡量某请求是否存在很大波动,标准差越大,波动越大。

以某内部服务为例,通过汇总表格展现出某小时的某url的更细响应时间的维度:

2)请求数(按天或小时统计)

根据不同的时间维度去统计系统每天或每小时的请求数(每小时的统计情况可以见上图),并以趋势图和表格形式展示。

某内部服务每天请求数的趋势图:

3)错误率

关于错误率的统计主要有以下几种:

  • connection timeout:http请求中出现504的次数和比例。
  • error response:http请求中出现500的次数和比例。
  • 错误网关数:http请求中出现502的次数和比例。
  • 异常日志统计:统计业务中出现得异常的数量和趋势。

以某内部服务的异常数量趋势为例:

##Perceived user experience

这类指标从用户的角度出发,通过模拟用户请求或对真实用户抽样,来监控用户对网站的实际体验效果,主要利用js来收集不同浏览器下访问网站的加载速度和性能;

对于一次完整用户请求来说,http请求可以划分为如下几个阶段:

  • DNS:域名解析阶段,通常在几毫秒左右
  • TCP:建立网络连接
  • Requesting:发送请求
  • WebServer处理
  • Transferring:传输数据
  • Parsing:浏览器解析。几个重要的时间点为:
    a. 首屏时间 客户端第一屏资源加载完毕
    b. domready时间 DOM解析完毕,可以进行动态修改
    c. load时间 所有资源加载完毕

对于上述的几个阶段,我们设立了多种时间参数(每个参数又有 90% 和 50%
两种指标)来衡量,具体如下:

  • 查找域名:开始查找域名到查找结束,计算公式为(domainLookupEnd
    - domainLookupStart)
  • 建立连接:开始发出连接请求到连接成功,计算公式为(connectEnd
    - connectStart)
  • 请求文档:开始请求文档到开始接收文档,计算公式为(responseStart
    - requestStart)
  • 接收文档:开始接收文档到文档接收完成,计算公式为(responseEnd
    - responseStart)
  • domready:开始解析文档到 DOMContentLoaded
    事件被触发,计算公式为(domContentLoadedEventStart - domLoading)
  • load事件持续:load 事件被触发到 load
    事件完成,计算公式为(loadEventEnd - loadEventStart)
  • 完全加载:开始解析文档到文档完全加载,计算公式为(domComplete
    - domLoading)
  • 首屏加载:开始解析文档到首屏加载完毕,计算公式为(firstscreenready
    - domLoading)
  • 完全加载【全过程】:此次浏览最开始时刻到完全加载完毕,计算公式为(domComplete
    - navigationStart)
  • 首屏加载【全过程】:此次浏览最开始时刻到首屏加载完毕,计算公式为(firstscreenready
    - navigationStart)

为了更清楚的说明每个参数的意义,用下图说明如下:

其中不同的指标对于用户体验的影响权重不同,对于用户来说白屏时间(浏览最开始时刻到首屏加载前)和首屏时间是最重要的。

某应用的上述时间参数趋势图:

#总结

俗话说“军马未动,粮草先行!”,监控->分析->优化,号称是性能优化的三部曲,为了更容易地找到性能优化的关键点,建立一个统一的精细化的性能监控平台,做到数据驱动型的性能优化,是公司的长远目标,也是值得公司投入的一个方向,性能优化,从监控开始,只有监控的性能指标体系建立好了,才能更好地去做分析和优化!

转载 http://tech.meituan.com/performance-metric.html

时间: 2024-10-12 05:36:21

性能指标体系构建的相关文章

前端页面性能参数搜集

经常会看些性能分析的书,但是实际在做优化的时候又无从下手. 因为没有数据,也不能确定实际用户到底在哪一环影响了他们的性能. 现在H5提供了一些很方便的Performance接口,可以让我们更方便的搜集到用户的数据,不过有几个方法的兼容性实在太差. 插件已经上传到Github中,可以在这里获取到,index.html中写的是一些示例,插件源码在"js/primus.js"中. 写的比较仓促,自己能力也有限,如有问题,欢迎指正. 一.请求时间统计 上图是performance.timing

阿里P7架构师:通往架构师路上的经验总结

困扰架构师日常问题 架构师应不应该写代码为什么别人的系统总是那么烂成为架构师最困难的门槛是什么?如何更高效的学习?面对目前流行的技术不知如何下手?一家公司待久了,过得很安逸,但跳槽时面试碰壁?觉得现在的技术基础感觉到很扎实,但就是自己的技术提升不上?觉得自己很牛B,一般需求都能搞定,但是所学的知识点没有系统化,很难在技术领域继续突破?现在觉得自己技术还可以,但就是薪资涨不上去? 以上这几点,做为开发人员的你们,有遇到过么?有为自己想过么?有细心仔细的去解决过这些问题么?有深刻的想过么?虽然这几个

.NET开源高性能Socket通信中间件Helios介绍及演示

一:Helios是什么 Helios是一套高性能的Socket通信中间件,使用C#编写.Helios的开发受到Netty的启发,使用非阻塞的事件驱动模型架构来实现高并发高吞吐量.Helios为我们大大的简化了Socket编程,它已经为我们处理好了高并发情况下的解包,粘包,buffer管理等等. GitHub:https://github.com/helios-io/helios/ 二:Helios的特点 1.Powerful APIs Takes the complexity out of so

基于Solr的多表join查询加速方法

前言 DT时代对平台或商家来说最有价值的就是数据了,在大数据时代数据呈现出数据量大,数据的维度多的特点,用户会使用多维度随意组合条件快速召回数据.数据处理业务场景需要实时性,需要能够快速精准的获得到需要的数据.之前的通过数据库的方式来处理数据的方式,由于数据库的某些固有特性已经很难满足大数据时代对数据处理的需求. 所以,在大数据时代使用hadoop,hive,spark,作为处理离线大数据的补充手段已经大行其道. 以上提到的这些数据处理手段,只能离线数据处理方式,无法实现实时性.Solr作为补充

架构设计:系统间通信(43)——自己动手设计ESB(4)

============================== 接上文<架构设计:系统间通信(42)--自己动手设计ESB(3)> 5.Borker Server选择 在本文之前的三篇文章中,我们介绍了自行设计的ESB中间件的顶层设计.介绍了主控服务如何对多个ESB-Brokers动态节点进行日志采集和监控.还介绍了ESB-Broker节点如何进行动态路由定义的加载管理.这篇文章我们主要讨论关于ESB-Client的一些关键设计. 在我们自行设计的ESB中间件中为了保证ESB服务不会成为整个软件

【scikit-learn】如何进行模型参数的选择

内容概要 这一节我们介绍以下几个内容: 我们该怎样选择模型用于监督学习任务? 我们该如何选择调整得到最好的模型参数? 我们该如何对测试数据进行预测估计? 1. 使用整个数据集进行训练和测试 这里我们使用手中的整个数据集来训练模型 使用同样的数据集来测试模型,然后评估预测的结果和真实结果的差别 In [1]: from sklearn.datasets import load_iris iris = load_iris() # create X(features) and y(response)

互斥锁的实现

http://blog.csdn.net/hzhzh007/article/details/6532988 “ 信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作(大家都在sem_wait的时候,就阻塞在 那里).而互斥锁是用在多线程多任务互斥的,一个线程占用了某一个资源,那么别的线程就无法访问,直到这个线程unlock,其他的线程才开始可以利用这 个资源.比如对全局变量的访问,有时要加锁,操作完了,在解锁.有的时候锁和信号量会同时使用的” 也

算法笔记1-最大子序列和问题的求解

问题-- 给定N个整数(有可能是负数)A1,A2,A3,A4...An,求最大子序列和. (子序列必须是连续的):比如,对于输入,-2,11,-4,13,-5,-2:这个序列, 答案是20,即从A2到A4. 对于这个问题,你怎么想的呢?下面有四种解法,看看你的解法是不是其中之一. 解法一.穷举 解题思路-- 既然是求某一个连续的子序列的最大和,那么我们把所有的子序列的和都加一遍,然后用一个变量来存储最大的和值,当遍历一遍所有子序列,即可得到最大的和.由于这个子序列长度可以是1,也可以是N,因此需

asp.net 视图引擎归类

1. ASPX View Engine 第一个也是我们最熟悉的---aspx,相信做过WebForm开发对Aspx都比较了解: 小示例: <%@ Control Inherits="System.Web.Mvc.ViewPage<IEnumerable<Product>>" %> <% if(model.Any()) { %> <ul> <% foreach(var p in model){%> <li>