1. 程式人生 > >適合生產環境的效能監控類庫 之 基本功能篇

適合生產環境的效能監控類庫 之 基本功能篇

背景

NanoProfiler是一個EF Learning Labs出品的免費效能監控類庫(即將開源)。它的思想和使用方式類似於MiniProfiler的。但是,設計理念有較大差異。

MiniProfiler更像是一個面向開發和測試環境的效能監控類庫,它的關注點(我說的不一定對,僅代表一家之言),更多的是提供了對微軟的ASP.NET MVC,EntityFramework,WCF等主流前後端類庫的封裝和整合,如果你的專案恰巧從前端到後端都用到這些類庫,它可以將從前端到後端的效能監控資料合併到一個視圖裡,還是挺方便的。它的主要問題是:

  • 執行時效能,尤其是併發環境下效能較差,佔用的資源較多
  • 不能很好的支援多執行緒和非同步程式碼的效能監控(事實上,MiniProfiler的核心類都不是執行緒安全的,只能通過粗暴的全域性加鎖來實現部分的多執行緒和非同步執行緒支援,效能也就可想而知了)

NanoProfiler專案的起源(大約半年前),最初,其實只是希望向MiniProfiler貢獻程式碼,彌補以上的缺點,主要是記憶體資料結構的變化能夠帶來的效能的優化,和對多執行緒和非同步程式設計模型的支援。不過,很可惜,在提交給他們我們關於如何改進的程式碼示例,甚至是直接的Pull Request之後,後續的溝通中(不想背地裡談他們團隊的技術水平),只能說,也許是他們的設計理念和關注點,並不在此吧。

所以,首先,上面提到的MiniProfiler的缺點,正是NanoProfiler的優點:

  • NanoProfiler實現了對多執行緒程式碼和非同步程式碼,包括基於PLINQ,Parallel庫在內的各種非同步程式碼的完美支援
  • 效能方面,由於內部實現不需要像MiniProfiler那樣,對每個請求,在記憶體中維護一個樹形結構的資料結構,而用一個無鎖的佇列儲存每一步效能監控的原始資料,因此,效能上幾乎對被監控應用沒有影響

另一方面,相對於MiniProfiler僅僅滿足於實現一個用於開發環境的類似Fiddler的程式碼效能檢視。NanoProfiler,首先,當然,也支援類似的功能,並且提供了更強大和直觀的檢視效能資料的UI;同時,我們的設計理念,更偏向大資料和生產環境。說到底,我們認為,只對於開發環境的話,前端也好後端也好,我們有太多可替代的效能監控工具;將效能監控整合到程式碼裡,真正的優勢,應該是生產環境的大資料。所以,我們希望,不僅僅能監控單個請求的效能瓶頸,也能基於大資料,分析整個應用,應用和應用之間,伺服器,甚至叢集和叢集之間的巨集觀效能瓶頸。

舉例來說,如果說MiniProifiler的監控檢視對於一個頁面請求,就像是Fiddler對於一個頁面上所有資源和AJAX請求序列的效能描述;那麼,NanoProfiler,除此之外,結合其他大資料分析工具,既能分析生產環境所有頁面產生的Fiddler請求資料,從而知道哪些資源的整體的訪問頻率和消耗最高,從而能夠找到應用,伺服器,甚至叢集上整體的效能瓶頸;還能,跨應用,跨伺服器和叢集,分析微觀(如單個請求,或單個使用者的相關請求)或者巨集觀的各種效能指標。

安裝

目前,已經上傳到nuget.orgd的至少有以下5個package:

  • NanoProfiler - 核心庫,可單獨用於非Web應用,沒有DB效能監控支援
  • NanoProfiler.Data - DB效能監控支援
  • NanoProfiler.Web - Web專案支援
  • NanoProfiler.Unity - 基於Unity IoC的AOP式監控擴充套件
  • NanoProfiler.Wcf - WCF監控支援

如何使用?

對一個典型的Web專案,首先,我們需要在Global.asax.cs的BeginRequest和EndRequest事件處理,新增下面的程式碼:

接下來,就可以在程式碼裡新增類似下面的程式碼(類似MiniProfiler,不過MiniProfiler可不支援async),監控制定程式碼塊的執行效能:

執行包含這段程式碼的請求,然後訪問當前應用下的 ~/nanoprofiler/view 頁面, 應該能看到類似Fiddler檢視的,剛才訪問的請求的每一步的執行效能。

如果你想設定一些全域性引數,比如,過濾某些請求,可以這樣:

DB效能監控

DB效能監控的使用方式和MiniProfiler也比較類似,簡單地說,只需要用NanoProfiler提供的ProfiledConnection或者ProfiledDbCommand這樣的類,包裝原有的DbConnection和DbCommand物件。例如,假設你有下面這樣一個DataService:

我們只需要,用ProfiledDbConnection包裝,這個SqlConnection例項:

檢視實時效能監控資料

前面說過,預設情況下,訪問~/nanoprofiler/view 就能檢視最近的請求的效能監控資料。下面是某個請求的效能檢視示例,紅色是DB請求,綠色是WCF請求,藍色是其他程式碼步驟:

如果顯示有問題,比如報treeview-timeline.css 404錯誤,請確保Web.config包含runAllManagedModulesForAllRequests="true":

  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
    </modules>
  </system.webServer>

如果,想做一些引數定製,可以在application_start事件處理裡,通過下面的程式碼設定:

ProfilingSession.ProfilingStorage = new CircularBufferedProfilingStorage(100, profiler => false, new JsonProfilingStorage());

預設的檢視監控資料的功能是基於CircularBufferedProfilingStorage實現的,它有三個可選引數:

  • 第一個引數代表,最多在記憶體保留多少個最近的請求的監控資料
  • 第二個引數是一個Func<IProfiler, bool> delegate,可以指定一個方法,過濾不想顯示的監控結果,比如,只保留請求處理時間大於100ms的資料
  • 第三個引數指定一個真正持久化監控資料的provider,比如,預設的JsonProfilingStorage將監控資料,通過任意支援slf4net的類庫(比如log4net),持久化到檔案系統或者DB

WCF監控

WCF效能監控主要通過WcfProfilingBehavior這個類,他是一個標準的WCF EndpointBehavior實現,只要通過程式碼或者XML配置,將它配到指定的service就行,比如,是一個XML配置的示例:

<system.serviceModel>
<bindings>
  <basicHttpBinding>
    <binding name="BasicHttpBinding_IWcfDemoService" />
  </basicHttpBinding>
</bindings>
<client>
  <endpoint address="http://localhost:64511/WcfDemoService.svc"
    binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IWcfDemoService"
    contract="DemoService.IWcfDemoService" name="BasicHttpBinding_IWcfDemoService" />
</client>
<behaviors>
  <serviceBehaviors>
    <behavior name="">
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="false" />
    </behavior>
  </serviceBehaviors>
  <endpointBehaviors>
    <behavior>
      <tinyprofiler />
    </behavior>
  </endpointBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"
  multipleSiteBindingsEnabled="true" />
<extensions>
  <behaviorExtensions>
    <add name="tinyprofiler" type="EF.Diagnostics.Profiling.ServiceModel.Configuration.WcfProfilingBehaviorElement, NanoProfiler.Wcf"/>
  </behaviorExtensions>
</extensions>
</system.serviceModel>

基於Unity AOP的效能監控

Unity擴充套件,主要提供兩種基於Unity AOP的支援。

第一種,通過ContainerExtension。例如:

上面的程式碼,將自動監控所有註冊到Unity容器的介面名稱帶DemoDBService的service的每個方法呼叫的效能。

第二種,通過Unity的policy injection。簡單地說,可以通過Attribute標註的方式,自動監控方法的執行效能:

要開啟,Unity的policy injection支援,需要在Global.asax.cs,新增下面這樣的初始化程式碼:

NanoProfiler的基本功能先講到這兒,下期預告:NanoProfiler - 適合生產環境的效能監控類庫 之 大資料篇

BTW, 發句牢騷,部落格園這個Markdown解析器太爛,對於插入程式碼翻譯成的HTML很糟糕,所以只能全都插圖片了。

相關推薦

適合生產環境效能監控 基本功能

背景 NanoProfiler是一個EF Learning Labs出品的免費效能監控類庫(即將開源)。它的思想和使用方式類似於MiniProfiler的。但是,設計理念有較大差異。 MiniProfiler更像是一個面向開發和測試環境的效能監控類庫,它的關注點(我說的不一定對,僅代表一家之言),更多的是提供

適合生產環境效能監控 實踐ELK

上期回顧 上次介紹了NanoProfiler的大資料分析理念,一晃已經時隔一年多了,真是罪過! 有朋友問到何時開源的問題,這裡先簡單說明一下。因為是單位的專案,雖然單位的目標肯定是要開源的,但是,畢竟不像個人專案那麼自由。一方面要保證程式碼本身的質量,另一方面也要剝離對單位其他框架類庫的依賴,一忙起來就拖延

適合生產環境效能監控 大資料篇

上期回顧 上次介紹了NanoProfiler的基本功能,提到,NanoProfiler實現了MiniProfiler欠缺的多執行緒和非同步程式碼的支援,並且,由於採用不同的內部資料結構,NanoProfiler擁有更高的執行效率,而且佔用極少的系統資源,因此,是適合在生產環境下使用的效能監控類庫。並且,我們

java 基礎 SQLFun

cnblogs import bsp 轉換 span pre param ack urn package com.exjor.webdemo; import java.sql.Timestamp; import java.util.Date; public

java 基礎 FormatFun

final mat web port efault div break orm log package com.exjor.webdemo; import java.text.SimpleDateFormat; import java.util.Date;

java核心學習(九) java基礎Scanner

system.in 網站 文檔 數據源 java程序 官方網站 基本功 簡單 方法 從第九節開始,對java的基礎類庫進行初步學習,這些基礎類其中的一些內容是java程序員的基本功 言歸正傳,開始學習。對於java類庫的具體使用方法,可以在IDE裏面查看源碼和註釋,也可以在

常用.NET(轉)

等等 pat arm lac enc nth 隨機文件 dal source 常用類庫之.NET中的字符串 字符串的特性 1.不可變性 由於字符串是不可變的的,每次修改字符串,都是創建了一個單獨字符串副本(拷貝了一個字符串副本)。之所

requestsget

requests getrequests是python的接口測試的類庫。一、安裝直接使用pip install requests即可安裝。二、發送一個get請求 response的返回包含了body、cookies、status、headers等信息,在拿到response之後,可以通過text,con

Java 常用 比較 Comparable

instance 多少 一個 public 類關系 name length compare 實例 http://www.verejava.com/?id=169930999133100 /** 知識點: 比較類 Comparable 題目: 將某班學生按數

Java 常用 Random 隨機數實例

com clas CA java arraylist wan 隨機 TP array http://www.verejava.com/?id=169931132381103 /** 知識點:Random 隨機數類 實際應用: 敵人飛機隨機從屏幕的上方出現

Java 常用 Date 日期

ID ret ati 轉換成 知識 HR text exceptio imp http://www.verejava.com/?id=16993074079095 /** 知識點: Date 日期類 */ import java.util.Date; import

Java 常用 SimpleDateFormat 日期格式化

pareto parse out oid turn sta AS 對象 ref http://www.verejava.com/?id=16993055673892 /** 知識點:Calandar 日期處理類 */ import java.util.*; impo

Java 常用 大精度數值

++ mat CI 數值 ger import str big sta http://www.verejava.com/?id=17159675312132 import java.math.BigDecimal; import java.math.BigInteger;

ORACLE生產效能監控中總結的經驗

               ORACLE資料庫在我們部署之後,往往會隨著系統的升級,資料量的增大以及設計的缺陷導致系統的效能會出現不穩定,資源爭用,阻塞等一系列的問題。會導致系統的可用性變得越來越低。所以為了保證系統的長期穩定可靠,高效能的工作,我們就需要對資料庫進行相應

生產環境下hadoop叢集配置DNS配置實驗

一、實驗環境: Mac os 下 VirtualBox中三臺安裝centos 6.3虛擬機器 主機名 別名 IP地址 系統版本 角色 lhmaster lhmaster.lihui.hadoop 192.168.1.4 Centos

JSON解析Fastjson(1) --- Fastjson學習, 生成與解析json資料,json字串與Java物件互轉

JSON解析類庫之Fastjson(1) --- Fastjson基礎知識、簡單JavaBean與複雜Bean物件與JSON互轉 -- Fastjson類庫學習, 生成與解析json資料,json

Java基礎StringBuffer

導語 很多新手都搞不懂String、StringBuffer、StringBuilder之間到底有什麼區別,那就一點一點來說一下吧。 主要內容 StringBuffer類的主要特點 StringBuffer、StringBuilder、Str

JAVA常用String

String兩種例項化方式比較: String類一旦申明則不可改變,兩種例項化方式為: 方式一:使用構造方法String str = new String("hello"); 方式二:採用直接賦值的方式:String str = "hello";

強大的拉姆表示式轉Sql - SqlSugar 隱藏功能Lambda

使用場景 1、Lambda to sql 一直是ORM中最難的功能之一,如果有現成的解析庫那麼自已寫一個ORM難度將大大降低 2、通過Lambda作為KEY進行快取操作,特別是倉儲模式想要拿到表示式進行通用查詢快取 則需要用到表示式解析 3、學習愛好者,如果能夠較深入的理Lambda如何去解成Sql,那麼你對

數據 基本概念

osql 方案 can mongod 對象 light 成本 關系型數據庫 存取   一. 概述(了解)   二. 數據庫特點(了解)   三. 數據庫分類   四. MySQL介紹   五. 下載及安裝   六. 啥是SQL? 一.概述   數據庫(Database,簡稱