使用Metrics监控应用程序的性能

标签: metrics 应用程序 性能 | 发表时间:2017-08-17 02:02 | 作者:
分享到:
出处:http://m635674608.iteye.com

在编写应用程序的时候,通常会记录日志以便事后分析,在很多情况下是产生了问题之后,再去查看日志,是一种事后的静态分析。在很多时候,我们可能需要了解整个系统在当前,或者某一时刻运行的情况,比如当前系统中对外提供了多少次服务,这些服务的响应时间是多少,随时间变化的情况是什么样的,系统出错的频率是多少。这些动态的准实时信息对于监控整个系统的运行健康状况来说很重要。

一些应用程序,比如对外提供接口或者服务的WebService,对整个系统的实时运行情况进行监控显得尤为重要,着就像我们操作系统里面的资源管理器一样,如果能够实时或者准实时的看到整个系统耗费的CPU,内存等资源,对我们快速对系统做出响应,以及优化很重要。并且,这些实时的性能参数信息,对于一些高级应用场景,比如 服务的熔断机制(需要实时统计系统出错比例和响应时间),只有做到了实时监控才能提供这些数据,才能实现这种提高系统稳健性的功能。

前几天在InfoQ的 一篇采访文章中看到一句话 “Profiling特别重要。如果能有一个特别强大的Profiling系统,就知道整个系统在哪个地方,哪台机器上,花了多少CPU、内存、磁盘IO或者网络带宽等资源,才能知道优化什么地方效益最大。”

同样,对于WebService的监控,比如在那个地方,那台机器上,花了多少CPU,多少内存,每一个服务的响应时间,出错的次数频率等,这些信息记录下来之后,我们就可以看到服务在运行时的动态的表现,更加容易找出错误或者定位问题点来进行优化。

最简单的做法是,在应用系统的关键地方,或者所有程序的入口,出口进行埋点,然后将这些采样信息不断的发送到某一个消息队列或者内存DB中,然后其他系统进行读取分析和展示。

在Java中有一个开源的名为 Metrics的项目,它能够捕获JVM以及应用层面的性能参数,他的作者Coda Hale介绍了什么是Mertics并且为什么Metrics在应用程序系统中很有必要,视频和演讲可以分别到 YouTubeSlideShare上可以下载。在.NET中有对其进行移植的项目叫 Metrics.NET

在开始介绍Metric之前,需要先看看一些基本的度量器类型,以及常见的使用场景,才能知道如何使用。

一 度量类型

Metrics提供5种基本的度量类型:Gauges, Counters, Histograms, Meters和 Timers

Gauge

Gauge是最简单的度量类型,只有一个简单的返回值,他用来记录一些对象或者事物的瞬时值。

比如,我们类型为Gauge的计数器来记录某个服务目前开通的城市个数

Metric.Gauge("Service Cities Count", () => Cities.Count, new Unit("个"));

Counters

Counter是一个简单64位的计数器,他可以增加和减少。

比如我们可以定义两个Counter类型的计数器,用来统计所有服务请求数目,和目前正在处理的请求总数。

/// <summary>
/// keep the total count of the requests
/// </summary>
private readonly Counter totalRequestsCounter = Metric.Counter("Requests", Unit.Requests);

/// <summary>
/// count the current concurrent requests
/// </summary>
private readonly Counter concurrentRequestsCounter = Metric.Counter("SampleMetrics.ConcurrentRequests", Unit.Requests);

这样,在我们请求处理开始的时候,同时将这两个计数器自增。

this.concurrentRequestsCounter.Increment(); // increment concurrent requests counter
this.totalRequestsCounter.Increment(); // increment total requests counter 

当某一个请求处理完成之后,将目前正在处理的请求减一

this.concurrentRequestsCounter.Decrement(); // decrement number of concurrent requests

这种计数器也可以用来统计诸如当前有多少人在线,或者服务器中有多少处于有效期内的session

Meters

Meter是一种只能自增的计数器,通常用来度量一系列事件发生的比率。他提供了平均速率,以及指数平滑平均速率,以及采样后的1分钟,5分钟,15分钟速率。

比如需要统计请求的速率,比如统计平均每分钟内有多少次请求进来。只需要定义一个metric

/// <summary>
/// measure the rate at which requests come in
/// </summary>
private readonly Meter meter = Metric.Meter("Requests", Unit.Requests,TimeUnit.Seconds);

在处理请求的地方,调用Mark方法即可。

this.meter.Mark(); // signal a new request to the meter

再比如,要测量服务出错的概率,比如每小时出错多少次。可以定义一个metric。

/// <summary>
/// measure the rate of service exception
/// </summary>
private readonly Meter errorMeter = Metric.Meter("Error", Unit.Errors, TimeUnit.Hours);

这样,在处理请求的时候,如果出现异常了,调用一下errorMeter的Mark方法即可。

this.errorMeter.Mark();// signal a new error to the meter

Histograms

Histrogram是用来度量流数据中Value的分布情况,Histrogram可以计算最大/小值、平均值,方差,分位数(如中位数,或者95th分位数),如75%,90%,98%,99%的数据在哪个范围内。

比如,我们想度量,所有传进来服务的请求参数的长度分布。那么,可以定义一个histogram。

/// <summary>
/// keep a histogram of the input data of our request method 
/// </summary>
private readonly Histogram histogramOfData = Metric.Histogram("ResultsExample", Unit.Items);

然后在请求的地方,调用其Update方法来更新值。

this.histogramOfData.Update(request.length, methodName); // update the histogram with the input data

Timer

Timer是Histogram跟Meter的一个组合,比如要统计当前请求的速率和处理时间。

就可以定义一个Timer:

/// <summary>
/// measure the time rate and duration of requests
/// </summary>
private readonly Timer timer = Metric.Timer("Requests", Unit.Requests);

在使用的时候,调用timer的NewContext即可。

using (this.timer.NewContext(i.ToString())) // measure until disposed
{
    ...
}

二 度量数据的输出

收集了这么多数据之后,我们需要把数据时实的动态展示或者保存起来。Metric提供了多种的数据报告接口。包括自带的 Metrics.NET.FlotVisualization, 以及输出到专业的系统监控Graphite,输出到开源,分布式,时间序列的中 InfluxDB,或者输出到ElasticSearch中。 配置起来也非常简单。比如如果要直接在http页面上展现,只需要在初始化的时候,设置合适的EndPoint即可:

Metric.Config
    .WithHttpEndpoint("http://localhost:1234/metrics/")
    .WithAllCounters()
    .WithInternalMetrics()
    .WithReporting(config => config
        .WithConsoleReport(TimeSpan.FromSeconds(30))

然后在浏览器中输入 http://localhost:1234/metrics/,就可以看到各种采集的准实时各种度量信息:

metric

上面自带的性能DashBoard略显简陋。 通常,我们一般会将这些实时采集的数据存储到分布式时序数据库 InfluxDB中,然后利用开源的图表控件 Grafana来实时展现这些数据,比如,可以制作想下面这样的,动态的性能准实时监控系统:

metric_dashboard

templated_dashboard_graphite

nice_dashboard

三 总结

本文介绍了如何使用埋点和各种度量工具来实时监测应用程序的性能,介绍了.NET中Metrics度量工具的使用。与传统的记录日志的方式不同,这种实时或者准实时的对当前系统各种关键指标的采样和监控,对于应用程序的运维,性能优化,提供了一种动态的视角,能帮助我们更好的了解当前应用程序或者服务在线上的各种性能参数和表现状态。Metrics的采样应该尽量减少对原有系统的侵入性,所以一般的最好是将采样的结果存储到消息队列或者内存DB中,然后进行动态展示,另外采样频率也是需要考虑的一个重要因素。因为对于一个较大的系统来说,实时采样产生的数据量会比较大。 InfluxDB 似乎只能在非Windows平台使用,所以本文没有完整演示整个 Metrics+ InfluxDB+ Grafana 构建应用程序实时监控系统的搭建。不过相信大家对照着相关文档,应该不难实现。

希望本文对您了解如何实时监控应用程序性能,以及如何构建应用程序性能参数dashboard有所帮助。

四 参考资料

http://www.cnblogs.com/yangecnu/p/Using-Metrics-to-Profiling-WebService-Performance.html



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [metrics 应用程序 性能] 推荐:

使用Metrics监控应用程序的性能

- - zzm
在编写应用程序的时候,通常会记录日志以便事后分析,在很多情况下是产生了问题之后,再去查看日志,是一种事后的静态分析. 在很多时候,我们可能需要了解整个系统在当前,或者某一时刻运行的情况,比如当前系统中对外提供了多少次服务,这些服务的响应时间是多少,随时间变化的情况是什么样的,系统出错的频率是多少. 这些动态的准实时信息对于监控整个系统的运行健康状况来说很重要.

提升 web 应用程序的性能

- pathfinder - IBM developerWorks 中国 : 文档库
作为 web 用户,我们知道页面加载或刷新的速度对其成功至关重要. 本文将帮助您更好地理解影响 web 应用程序性能的因素. 学习识别这些问题并且找到客户端内容的瓶颈. 探索 JavaScript、DOM、CSS 和 Dojo 小部件的性能问题. 将通过一个例子展示使用 YSlow 和 Firebug 适当调整 Dojo 小部件.

HBase Metrics机制、架构

- - 开源软件 - ITeye博客
HBase Metrics是一种监控信息实时收集机制. 功能性信息(Compaction Queue、Store Files个数等). JVM使用信息 (Heap Memory 的变化). 借助与Hadoop Metrics同样的方式,向Ganglia汇报. Ganglia的架构图:. Ganglia相关特性:.

ganglia收集hbase的metrics

- - CSDN博客云计算推荐文章
Ganglia 是 UC Berkeley 发起的一个开源监视项目,设计用于测量数以千计的节点. 每台计算机都运行一个收集和发送度量数据(如处理器速度、内存使用量等)的名为 gmond 的守护进程. 它将从操作系统和指定主机中收集. 接收所有度量数据的主机可以显示这些数据并且可以将这些数据的精简表单传递到层次结构中.

利用memcached构建高性能的Web应用程序

- - C++博客-牵着老婆满街逛
对于高并发高访问的Web应用程序来说,数据库存取瓶颈一直是个令人头疼的问题. 特别当你的程序架构还是建立在单数据库模式,而一个数据池连接数峰值已经达到500的时候,那你的程序运行离崩溃的边缘也不远了. 很多小网站的开发人员一开始都将注意力放在了产品需求设计上,缺忽视了程序整体性能,可扩展性等方面的考虑,结果眼看着访问量一天天网上爬,可突然发现有一天网站因为访问量过大而崩溃了,到时候哭都来不及.

Android应用程序运行的性能设计

- - CSDN博客推荐文章
Android应用程序运行的移动设备受限于其运算能力,存储空间,及电池续航. 电池续航可能是一个促使你优化程序的原因,即使他看起来已经运行的足够快了. 由于续航对用户的重要性,当电量耗损陡增时,意味这用户迟早会发现是由于你的程序.   虽然这份文档主要包含着细微的优化,但这些绝不能成为你软件成败的关键.

利用memcached构建高性能的Web应用程序

- - 企业架构 - ITeye博客
对于高并发高访问的Web应用程序来说,数据库存取瓶颈一直是个令人头疼的问题. 特别当你的程序架构还是建立在单数据库模式,而一个数据池连接数峰值已经达到500的时候,那你的程序运行离崩溃的边缘也不远了. 很多小网站的开发人员一开始都将注意力放在了产品需求设计上,缺忽视了程序整体性能,可扩展性等方面的考虑,结果眼看着访问量一天天网上爬,可突然发现有一天网站因为访问量过大而崩溃了,到时候哭都来不及.

浅谈 Spark 应用程序的性能调优

- - SegmentFault 最新的文章
Spark是基于内存的分布式计算引擎,以处理的高效和稳定著称. 然而在实际的应用开发过程中,开发者还是会遇到种种问题,其中一大类就是和性能相关. 在本文中,笔者将结合自身实践,谈谈如何尽可能地提高应用程序性能. 分布式计算引擎在调优方面有四个主要关注方向,分别是CPU、内存、网络开销和I/O,其具体调优目标如下:.

Hadoop Metrics体系分析之三:构建自己的Metrics

- - Taobao QA Team
大型分布式系统中需要metrics来了解系统状态已成为系统必需的功能之一. 其实测试系统甚至测试用例中也同样需要metrics. 通过这些指标我们可以了解测试的进度、状况、以及一些过程情况,比如性能指标和一些无法用是否判断数据. 下面我们就用一个简单的例子来看看如何使用hadoop metrics.

[转]企业级 GIS 性能和可伸缩性(二)——应用程序

- - ArcGIS技术研究
应用程序架构策略的选取应在满足业务和功能要求的基础上,充分发挥组织内各成员的技能水平. 本节对企业级 GIS 解决方案性能和可伸缩性的常见影响因素的关键领域进行了概述. 有关特定应用程序架构性能和可伸缩性的详细指导信息,请选择下面任一链接. 所有的 ArcGIS 应用程序架构普遍存在以下几个常见的性能影响因素.