上一期:NanoProfiler - 适合生产环境的性能监控类库 之 基本功能篇
上次介绍了NanoProfiler的基本功能,提到,NanoProfiler实现了MiniProfiler欠缺的多线程和异步代码的支持,并且,由于采用不同的内部数据结构,NanoProfiler拥有更高的执行效率,而且占用极少的系统资源,因此,是适合在生产环境下使用的性能监控类库。并且,我们也提到了,NanoProfiler设计理念的另一大不同,即面向大数据分析。
这一期,我重点介绍一下NanoProfiler之大数据分析理念。
上一期,我们曾经简单介绍了,NanoProfiler和MiniProfiler相比的,由于采用了不同的数据存储结构,因而具有更高的执行效率。这一节,首先,详细介绍一下NanoProfiler的数据存储结构。
首先,我们先来举一个简单的例子。假设我们有个对APP1的Web页面请求R,请求R的执行过程中,我们有以下几个Step:R-step-1, R-step-2,R-step-2的执行过程中,调用了APP2的一个WCF服务方法W.而W的执行过程中,又有以下几个Step:W-step-1, W-step-2。
如果使用MiniProfiler进行性能监控,R这个请求,可以得到类似下面的一整个树形结构的数据:
R (start, duration)
|
- R-step-1 (start, duration)
|
- R-step-2 (start, duration)
|
- W (start, duration)
|
- W-step-1 (start, duration)
|
- W-step-2 (start, duration)
start和duration表示,每个步骤相对整个请求开始的开始时间和执行时间。
MiniProfiler运行时,在内存中对一个逻辑请求,维护这样一个树形结构的数据,即使执行过程中有WCF调用,它也会通过WCF的EndpointBehavior和MessageInspector,将在APP2中执行的WCF调用内部的性能监控数据,返回并且合并到APP1的R请求这棵树结构数据。如果,当前请求包含一些前端的性能监控步骤,所有前端性能监控数据,也会实时保存到同一个内存中的数据结构中。如果要持久化,也会将整棵树,保存为一个JSON。这样做,虽然方便查看整个请求整体的性能数据,但是,不可避免的有以下一些问题:
那么,NanoProfiler是怎么存储性能监控数据的呢?
假设还是上面的例子,如果使用NanoProfiler代替MiniProfiler,在在APP1的内存中,请求R的性能监控数据结构大概是下面这样的:
R (type=web, start, duration, tags=request_token_of_R) :{
Steps: [
R-step-1 (type=step, parent=R, start, duration),
R-step-2 (type=step, parent=R, start, duration)
],
Customs: [
W-client (type=wcf_call, parent=R-step-2, start, duration)
]
}
同时,在APP2的内存中,有另一个WCF服务调用W的性能监控的数据结构:
W-server (type=wcf_server, start, duration, tags=request_token_of_R) : {
Steps: [
W-step-1 (type=step, parent=W-server, start, duration),
W-step-2 (type=step, parent=W-server, start, duration)
],
Customs: [
]
}
看出区别了吗?
NanoProfiler,并不将每个请求的监控数据整体保存为一个对象,而是会将每一个步骤,保存为一个对象,例如,对上面的例子,我们一共会得到下面这些事件数据:
W-step-2 (type=step, parent=W-server, start, duration)
上面这样的存储结构有什么好处呢?
数据结构Ready了,下面是怎么存储的问题。NanoProfiler的性能监控数据,由上面举例的相同结构,但类型可能不同的平面事件数据组成。我们假设,平均每一个逻辑页面请求会产生20个event,如果,某个APP一天有500万页面请求(包含各种服务调用,AJAX请求等等),就会有1亿个event。这个数据夸张吗?对一个稍大一点互联网应用来说,一点也不夸张。所以,这里的数据,必然有那么点“大”的。这还是只一个APP,如果,有10个100个APP呢?
对于超大量的类日志数据,传统的文件系统,或者关系型数据库,很可能已经不能很好的胜任了。不仅仅读写性能未必能达到要求,数据的维护也会成为大问题。
所以,我们需要特别适合类日志数据存储的数据存储方案。很幸运的,很多走在前面的大数据公司,已经铺了不少路,我们现在有Cassandra,有HBase这些本身就是类日志存储的NOSQL数据库,非常适合类日志的超大量密集写操作的数据存储。
以Cassandra为例,早在3年前,就已经可以达到每秒超过百万次的写操作,这里也有一个中文的翻译。Netflix当时使用了288个节点达到的每秒百万写,而最近Datastax公司的测试,已经能达到1000个Cassandra节点的线型性能扩展了,可以简单计算,即使三年后,Cassandra单个节点的写并发能力没有增加,支持每秒几百万的写操作也是很轻松的事情。
说起大数据分析,大家一定首先想到Hadoop。但是,如果各位做大数据分析,却还没尝试过elasticsearch和kibana,那真的有点out了。
园子里关于kibana的介绍文章也早就有不少了,我就不说太多安装使用细节了。
//本文完