.Net最佳實踐3:使用效能計數器收集效能資料
本文討論我們如何使用效能計數器從應用程式收集資料。我們將先了解的基本知識,然後我們將看到一個簡單的示例,我們將從中收集一些效能資料。
介紹: - 我的應用程式的效能是最好的,像火箭
讓我們這篇文章從一個客戶和開發人員之間的簡短交談開始。
場景1
客戶:- 你們的應用程式的效能怎麼樣?
主觀的開發者:- Well,它真的很快,它是最好的... huuh aaa ooh,它就像火箭一樣。
場景2
客戶:- 你們的應用程式的效能怎麼樣?
量化的開發者:- 使用2 GB RAM,xyz處理器和20000客戶記錄的情況下,客戶螢幕在20秒內載入完成。
我肯定比第一個開發的第二個開發者看起來更有前途的。在這篇文章中,我們將探討我們如何使用效能計數器來測量應用程式的效能。讓我們開始計數1,2,3,4 ......
歡迎下載我的免費的500 Q&A電子書,內容涉及NET,ASP.NET,SQL Server,WCF,WPF,[email protected] http://www.questpond.com . (譯者:作者在原文中做了一些廣告,作為對他勞動成果的尊重,我將照原文翻譯)
感謝Javier和Michael
我真的沒有才智來寫一些關於效能計數器的東西。但閱讀下面的文章中,我能對付著寫一些東西了。因此,首先請允許我感謝這些人,然後我們再繼續本文。
我也從以下文章中摘取了不少內容:
歸根結底,它們是:計數,計算(calculate)和顯示
任何效能評估的工作無外乎計數,計算和顯示。例如,如果你要計算在記憶體中每秒處理多少分頁,我們首先我們需要對處理的頁面的數量和其間流逝的時間(多少秒)進行計數。一旦我們完成計數,我們就需要進行計算,如用分頁數除以秒數。最後,我們需要顯示我們的效能資料。
現在,我們知道這是一個3步驟的過程,即計數,計算和顯示。計數的部分由應用程式來完成。因此,在計數階段應用程式需要提供資料。請注意,資料不會被效能計數器自動檢測到,而需要應用程式提供一些幫助。而計算和顯示由效能計數器和監視器完成。
效能計數器不是魔術師
如果應用程式不提供計數器資料,效能計數器無法僅憑自身去衡量應用程式效能。效能計數器需要應用程式來提供效能資料用於衡量應用程式。換句話說,應用程式需要通過建立效能計數器物件來提供資料。
應用程式效能測量的型別
幾乎所有的應用程式的效能測量屬於以下六大類。
瞬時值:- 很多時候,我們只是要測量當前值。例如,我們希望衡量有多少客戶記錄已被處理,有多少RAM記憶體已被使用等,這些指標被稱為瞬時值或者絕對值。效能計數器通過瞬時計數器支援這些型別的測量。
平均值:- 有時瞬間/當前值並不展現真實的情況。例如,只是說應用程式消耗1GB的空間是不夠的。但是,如果我們能夠得到某種記憶體消耗的平均資料,如1000個記錄消耗的空間是10MB,也許你可以更深入瞭解應用程式裡面發生了什麼。效能計數器通過使用像AverageBase,AverageTimer32,AverageCount64等型別支援這些種類型的測量。
速率值:- 有些情況下,當你想知道事件相對於時間的比率。例如,你想知道每秒有多少條記錄被處理。速率計數器幫助我們計算這些效能指標。
百分比值:- 很多時候,我們想看到以百分比值來作比較。比如你要比較兩臺計算機之間的效能資料。比較直接的值將不會是一個公平的比較。因此,如果我們能有兩臺計算機的%值,比較會更有意義。如果我們要比較不同效能計數器的值,百分比是更好的選擇,而不是絕對值。
例如,如果你想把RAM使用情況和硬碟空間使用情況做比較。把50GB硬碟使用情況和1GB RAM的使用情況做比較,就如同比較蘋果與橘子。如果你使用百分比來表達,這樣的比較更公平和合理。百分比效能計數器可以幫助我們以百分比來表達絕對值。
差異值:- 很多時候,我們希望得到差值的效能資料,比如從應用程式開始有多少時間流逝,從應用程式開始有多少硬碟消耗。為了收集這些型別的效能資料,我們需要記錄原始值和最新值。為了得到最終的效能資料,我們需要從當前值減去原始值。效能計數器提供差值計數器計算這樣的效能資料。
總之,有5種類型的效能計數器,可滿足上述所有計數需求。正如下圖所表現的:
將用於被效能計數器測試的示例程式
在整篇文章中,我們將用接下來要說明的一個簡單的程式作為計數器的例子。在這個例子中,我們將有一個定時器,每隔100毫秒產生一個隨機數。這些隨機數將被檢檢視它是否小於2。如果是,那麼函式‘MyFunction’將被呼叫。
下面的程式碼中,計時器將每100毫秒執行一次併產生隨機數,如果隨機數小於2則呼叫‘MyFunction’函式。
private void timer1_Tick(object sender, EventArgs e)
{
// Generate random number between 1 to 5.
Random objRnd = new Random();
int y = objRnd.Next(1, 5);
// If random number is less than 2 call my Function
if (y > 2)
{
MyFunction();
}
}
下面是'MyFunction'函式的程式碼,它是當隨機數的值小於2時被呼叫的。該方法不會做任何事情。
private void MyFunction()
{
}
本文中我們所有的效能計數器的例子,將使用上述定義的程式碼示例。
加入我們的第一個瞬時效能計數器的4個步驟
在我們深入‘如何增加一個性能計數器’這個問題之前,讓我們先來了解一下效能計數器的結構。當我們建立效能計數器,它需要被加入某些類別。因此,我們需要建立一個類別,並且把所有效能計數器放在該類別下。
我們來計數‘MyFunction’ 被呼叫了多少次。首先讓我們來建立一個名為“NumberOfTimeFunctionCalled”的即時計數器。在此之前,讓我們來看看有多少不同型別的瞬時計數器被效能計數器所支援: -
NumberOfItems32:- 即時計數器,它顯示最近觀測到的值。
NumberOfItems64:- 即時計數器,它顯示最近觀測到的值。 例如,用於維護大量的項或操作的簡單計數。 它與 NumberOfItems32 相同,但它使用更大的欄位來容納較大的值。
NumberOfItemsHEX32:- 即時計數器,它以十六進位制形式顯示最近觀測到的值。 例如,用於維護項或操作的簡單計數。
NumberOfItemsHEX64:- 即時計數器,它顯示最近觀測到的值。 例如,用於維護大量的項或操作的簡單計數。 它與 NumberOfItemsHEX32相同,但它使用更大的欄位來容納較大的值。
第1步 建立計數器:- 對於我們的當前的場景,‘NumberOfItems32’足夠了。所以,我們首先建立'NumberOfItems32‘即時計數器。有兩種方式,一種是通過程式碼,另一種是使用VS 2008的server explorer來建立計數器。程式碼的方法,我們將在後面看到。現在我們先使用server explorer來建立我們的計數器。因此,開啟您的Visual Studio,點選View,開啟Server explorer,你會看到下面的圖中所示的“Performance Counters”節點。右鍵單擊“Performance Counters”節點,選擇“create new category”。
當我們建立了一個新的類別,您可以指定的類別名稱,並在類別中新增計數器。對於當前的例子,我們給定類別的名稱為“MyApplication”,並且新增型別為'NumberOfItem32',名稱為'NumberOfTimeFunctionCalled”的計數器。
第2步 在你的Visual Studio應用程式中新增計數器:- 一旦你已經把計數器新增到server explorer上,你可以把計數器控制元件拖放到ASPX頁面上,如下圖所示。
你需要把“只讀”屬性標記為false,這樣你可以從程式碼中修改計數器的值。
第3步 新增為計數器計數的程式碼:- 最後,我們需要遞增計數器的值。窗體載入過程中,我們首先清除所有計數器的舊值。請注意,計數器的值是作為全域性值儲存的,所以他們不會自己重置,需要我們顯式地重置。因此,在窗體載入時把原始值設定為零。
private void Form1_Load(object sender, EventArgs e)
{
perfNumberOfTimeFunctionCalled.RawValue = 0;
}
當函式被呼叫時,我們通過使用‘Increment’方法來遞增計數器的值。每次increment函式的呼叫,值增加1。
private void MyFunction()
{
perfNumberOfTimeFunctionCalled.Increment();
}
第4步 檢視計數器資料:- 現在,我們已經指定了計數器在每次‘MyFunction’函式被呼叫時,遞增其值。現在我們使用效能監視器(performance monitor)來顯示效能計數器。開啟‘Run’並輸入‘perfmon’。你會看到有很多預設的效能計數器,清晰起見,我們現在刪除所有的計數器,加入我們的效能計數器即‘NumberofTimeFunctionCalled‘。
現在,您可以看到如下圖所示的圖表。請確保您的應用程式正在執行,因為需要由應用程式發出資料,然後展現在performance monitor上。
上述檢視是圖表檢視,要檢視相同資料的文字格式,你可以使用效能監視器提供的‘view report’選項卡。你可以看到該報告顯示,從程式開始執行,‘MyFunction的’被呼叫了9696次。
建立更合理的計數器
在前面的章節中,我們測量了‘MyFunction’被呼叫的次數。但這樣的效能計數並沒有真正顯示任何的測量價值。最好是,我們也能看到計時器被呼叫次數,然後我們就能夠把計時器被呼叫的次數和‘MyFunction’被呼叫的次數做比較。
因此,我們建立一個即時計數器,當定時器觸發時遞增該計數器。如下面的程式碼所示。
private void timer1_Tick(object sender, EventArgs e)
{
perfNumberOfTimeTimerCalled.Increment();
Random objRnd = new Random();
int y = objRnd.Next(1, 5);
if (y > 2)
{
MyFunction();
}
}
你可以在下面的圖表中可以看到這兩個計數器,藍色的線表示‘MyFunction’被呼叫的次數,黑色的線表示timer被呼叫的次數。
如果我們看一下‘report view’,我們也可以看到timer被觸發多少次,‘MyFunction’被呼叫多少次。
平均效能計數器
在前面的章節中,我們用到了2個性能計數器,一個告訴我們timer被觸發了多少次,另一個告訴我們‘MyFunction’被呼叫了多少次。如果我們能有某種平均資料,告訴我們timer每呼叫一次‘MyFunctionCalled’計數多少次,它將更有意義。
為了得到這些型別的指標,需要用到平均效能計數器。因此,對於我們的場景,我們需要計數函式的呼叫次數和timer的觸發次數。然後,我們需要將他們相除,得到timer每觸發一次函式呼叫多少次。
我們需要新增兩個計數器,一個作為分子另一個作為分母。對於作為分子的計數器,我們需要新增‘AverageCount64’型別的計數器,同時為分母,我們需要新增‘AverageBase’型別的計數器。
在‘AverageCount64’型別計數器之後,你需要新增‘AverageBase‘計數器,否則,你會得到一個錯誤,如下圖所示。
我們對於每一個timer觸發,我們都對用於記錄timer呼叫的計數器進行遞增。
private void timer1_Tick(object sender, EventArgs e)
{
perfAvgNumberofTimeTimerCalled.Increment();
Random objRnd = new Random();
int y = objRnd.Next(1, 5);
if (y > 2)
{
MyFunction();
}
}
為每一次函式呼叫我們都對用於記錄函式呼叫次數的計數器進行遞增
private void MyFunction()
{
perfNumberOfTimeFunctionCalled.Increment();
}
如果你執行該程式,在view report模式下你應該會看到如下圖所示。你可以看到平均‘MyFunction’被呼叫約0.5次(每timer觸發一次)。
如果你自己做計算,你將得到和效能監視器相同的計算值。
速率效能計數器
在我們的示例中,我們現在想找出‘MyFunction’相對於時間的比率。我們想知道每秒鐘被呼叫了多少次。因此,瀏覽server explorer,並新增‘rateofCountsPerSecond32’計數器如下面的圖所示。當‘MyFunction’每次被呼叫,遞增此計數器。
如果您執行的應用程式,你將能夠看到“RateofMyFunctionCalledPerSecond”的值。下面是一個簡單的報告,該報告顯示執行15秒後計數器的速率資料。在這15秒中總呼叫次數為72次。因此,平均每秒呼叫5次‘MyFunction’。
剩下的效能計數器
我們還剩下百分比計數器和差異計數器,因為他們是非常簡單和直接的,為了保持本文的焦點和特性,我在文中不再介紹這兩種計數器
通過C#程式碼新增計數器
到現在我們已經通過server explorer來增加效能計數器。你還可以通過程式碼來新增計數器。第一件事就是,我們需要匯入System.Diagnostics名稱空間。
然後,我們需要建立‘CounterCreationDataCollection’ 物件。
CounterCreationDataCollection Mycounters = new CounterCreationDataCollection();
建立實際的計數器並指定計數器的型別。
CounterCreationData totalOps = new CounterCreationData();
totalOps.CounterName = "Numberofoperations";
totalOps.CounterHelp = "Total number of operations executed";
totalOps.CounterType = PerformanceCounterType.NumberOfItems32;
Mycounters.Add(totalOps);
最後,在類別中建立計數器。下面的程式碼片斷用於在‘MyCategory’類別中建立計數器。
PerformanceCounterCategory.Create("MyCategory","Sample category for Codeproject", Mycounters);
讓我們用Performance counter helper來緩解我們的痛苦
寫效能計數器建立程式碼是很痛苦的。使用performance counter helper可以幫助你緩解這種痛苦並使你的程式碼更小巧。你可以一下網站找到performance counter helper:http://perfmoncounterhelper.codeplex.com/
不要在產品中使用
是的,只在開發時使用效能計數器。如果您在產品中使用,確保有一個啟用和禁用機制,否則會影響應用程式的效能。
總結
使用效能計數器測量應用程式的資料。
效能計數器包含多種型別,如瞬時,平均,速率等。
效能計數器不應該在產品中用到。如果用到了,確保有一個禁用機制。
效能計數器自身並不能進行測量,它需要應用程式提供資料,這樣效能監視器才可以計算並顯示的資料。
原始碼
從這裡你可以找到並下載上述效能計數器討論的示例原始碼。
其他最佳實踐
最佳實踐第1部分,請單擊此處
最佳實踐第2部分,請單擊此處
最佳實踐第4部分,請單擊此處
最佳實踐第5部分,請單擊此處
我的FAQ文章
(譯者:廣告時間)
我明白這不是談論我FAQ文章正確的地方。只是想稱讚一下自己花費一年時間來完成的FAQ系列。下面是全部的連結:
關於作者
本人暫時沒有翻譯最佳實踐4和5的計劃。
相關推薦
.Net最佳實踐3:使用效能計數器收集效能資料
本文值得閱讀嗎? 本文討論我們如何使用效能計數器從應用程式收集資料。我們將先了解的基本知識,然後我們將看到一個簡單的示例,我們將從中收集一些效能資料。 介紹: - 我的應用程式的效能是最好的,像火箭 讓我們這篇文章從一個客戶和開發人員之間的簡短交談開始。 場景1
【Kubernetes】最佳實踐3:服務部署與彈性伸縮
作者:彭靖田 在Kubernetes的世界中,一切服務都是跑在容器中的,最簡單的容器組是Pod。基於現實世界中的具體任務,Kubernetes抽象了更高階的容器組,如:ReplicaSet、Deployment、Job等。對於Web型別的長週期服務來說,重點考察兩個需求:
菜鳥入門【ASP.NET Core】3:準備CentOS和Nginx環境
sysconf service www post 輸入密碼 mct cnblogs kdt 提示 基本軟件 VMware虛擬機 centos:http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_
.NET Core 實踐一:微服務架構的優點(轉)
微服務現在已經是各種網際網路應用首選的雲架構元件,無論是 BAT 還是 滴滴、美團 ,微服務都是重要的一環。 相對於微服務,傳統應用架構有以下缺點: 1. 業務程式碼混雜,團隊成員職責邊界不清,團隊協作體驗不佳,開發效率低下。 傳統應用架構中,各個業務模組程式碼都存在於同一個應用當中,各個業務模組之間互
.NET Core 實踐二:事件通知和非同步處理
首先讓我們來先看一個例子: 這是一個簡單的使用者下單購買商品的業務模型,輸入端是使用者,相關物料有訂單和貨物,相關的內部服務有業務(訂單)、財務(支付)、倉儲(備貨)和物流(運輸)。 從圖中我們可以看到,使用者首先向業務部門下了一個訂單,業務部門根據使用者提供的內容生成了一份訂單給客戶,並要求客戶根據
.NET Core 實踐二:事件通知和異步處理
要求 cor 丟失 金額 異常 運算 事務 ice 運維人員 首先讓我們來先看一個例子: 這是一個簡單的用戶下單購買商品的業務模型,輸入端是用戶,相關物料有訂單和貨物,相關的內部服務有業務(訂單)、財務(支付)、倉儲(備貨)和物流(運輸)。 從圖中我們可以看到,用戶首先向
Zabbix最佳實踐一:Zabbix Server 的安裝與配置
頻率 .gz tar tle 步驟 ger path dns 發生 一.概述 在開始之前,一些概念和定義需要我們提前了解一下(以下內容摘自官方網站)。 1.1 幾個概念 架構 Zabbix 由幾個主要的功能組件組成,其職責如下所示。 Server Zabbix server
Zabbix最佳實踐二:快速入門
一.登入與配置使用者 1.1 登陸 這是Zabbix的“歡迎”介面。輸入使用者名稱 Admin 以及密碼 zabbix 以作為 Zabbix超級使用者登陸。 登陸後,你將會在頁面右下角看到“以管理員連線(Connected as Admin)”。同時會獲得訪問配置(Configuration) 和 管理
HBase最佳實踐-HBase中的寫效能優化策略
2016年12月10日 14:37:03 ourpush 閱讀數:1452 上一篇文章主要介紹了HBase讀效能優化的基本套路,本篇文章來說道說道如何診斷HBase寫資料的異常問題以及優化寫效能。和讀相比,HBase寫資料流程倒是顯得很簡單
ADO.NET最佳實踐(下)
為了更好地理解ADO.NET模型和設計思想,回顧一下ADO的概念是有用的。ADO使用一個單一的物件Recordset與所有資料型別打交道。Recordset被用來處理從資料庫返回的只進流資料、翻卷伺服器上資料或者翻卷一批儲存結果集。資料上的改變會立即運用到資料庫上或運用到使用樂觀查詢和更新操作的一批資料上。當
HBase最佳實踐-HBase中的讀效能優化策略
任何系統都會有各種各樣的問題,有些是系統本身設計問題,有些卻是使用姿勢問題。HBase也一樣,在真實生產線上大家或多或少都會遇到很多問題,有些是HBase還需要完善的,有些是我們確實對它瞭解太少。總
[轉]Android最佳實踐之:StrictMode介紹
【IT168技術】最新的Android平臺中(Android 2.3起),新增加了一個新的類,叫StrictMode(android.os.StrictMode)。這個類可以用來幫助開發者改進他們編寫的應用,並且提供了各種的策略,這些策略能隨時檢查和報告開發者開發應用中存在的問題,比如可以監視那些本不應
Webgis實踐3:生成圖層列表,複選圖層是否可見
/*上面都是表頭檔案,引入庫啥的。*/ dojo.require("esri.map"); var layer, map, visible = []; /*宣告layer、map、visible*/ function init
numpy學習3:物件屬性和基本資料型別
一、ndarray物件屬性 ndim 陣列軸(維度)的個數,軸的個數被稱作秩 shape 陣列的維度, 例如一個2排3列的矩陣,它的shape屬性將是(2,3),這個元組的長度顯然是秩,即維度或者ndi
工業大資料漫談3:什麼是工業大資料?
前面兩部分我們大概瞭解了一下大資料的由來和特點,這一部分我們來看看什麼是工業大資料,它和傳統我們理解的大資料有什麼不同? 在瞭解什麼是工業大資料的時候,我覺得我們有必要先了解一下什麼是工業以及工業都包括哪些門類。 工業(Ind
Keras學習之3:迴歸問題(boston_housing資料為例)
本實驗使用boston_housing資料集對房價資料進行迴歸分析,資料來自1970年代,波斯頓周邊地區的房價,是用於機器學習的經典資料集。該資料集很小,共計506條資料,分為404個訓練樣本和102個測試樣本,因此需要採用K-Fold,這裡取K=4。每條資料包含1
Android效能最佳實踐:為您的APK進行瘦身
大家都知道開發中應用程式的效能是非常重要的,但是這也是優化提升的難點,本章針對 Android效能實踐——從減少APK的大小開始,提升使用者的體驗。 原文地址 https://developer.android.com/topic/performance/reduce-apk-
SSIS最佳實踐:SQL Server提升執行效能
SQL Server整合服務(SQL Server Integration Services,SSIS)在其前輩DTS(Data Transformation Services,資料轉換服務)的基礎上進步了不少,從可用性、效能和並行等方面來說,它已經成長為一個企業級ETL(Extractio
JavaScript最佳實踐:效能
JavaScript最佳實踐:效能 注意作用域 避免全域性查詢 一個例子: function updateUI(){ var imgs = document.getElementByTagName("img"); f
轉載 -- NodeJs【生產環境】最佳實踐:效能和可靠性
// expressjs.com // Production best practices: performance and reliability 看過了,基本理解 // 這篇文章是expressjs官網的文章,非常棒,回答了用nodejs的過程中的一些