1. 程式人生 > >[C#] 網站程式ASP.NET的效能診斷

[C#] 網站程式ASP.NET的效能診斷

微軟提供了標準的CLR效能分析類庫

https://github.com/Microsoft/clrmd

這個類庫是開源的程式碼。能夠獲取CLR runtime裡面幾乎所有的資訊。

如何獲取clrmd編譯後的dll

方法一

在nuget裡面搜尋clrmd可以很方便的下載

方法二

估計有些同學和我一樣喜歡手動擋,那麼我這裡提供一個下載dll的地址。專案裡面只要引用這個dll就能對CLR進行分析診斷了。

https://raw.githubusercontent.com/wsq003/clrmd/master/bin/Microsoft.Diagnostics.Runtime.dll

如何分析CPU消耗

原理

1、作業系統能夠記錄每個os thread的cpu消耗

2、CLR的managed thread和作業系統的os thread會動態的進行對映

3、通過clrmd可以獲取每個managed thread的call stack

4、結合123我們可以分析出asp.net裡面那個執行緒的程式碼消耗了最多CPU

思路

在asp.net專案裡面新增一個‘一般處理程式ashx’頁面,比如diagnose.ashx,在這個頁面程式碼裡面記錄每個os thread的cpu消耗,每個managed thread的call stack,以及os thread和managed thread的對應關係。

反覆呼叫diagnose.ashx,看看最忙的那個os thread是被哪個managed thread佔用的。

參考程式碼

public void ProcessRequest(HttpContext context)
{
    context.Response.ContentType = "text/plain";

    {
        int pid = System.Diagnostics.Process.GetCurrentProcess().Id;
        var msg = GetCallstack(pid);
        context.Response.Write(msg);
    }

    var ths = Process.GetCurrentProcess().Threads;
    foreach (ProcessThread th in ths)
    {
        var msg = string.Format("{0}-{1:0.0}, {2:0.0}, {3:0.0}\r\n",
            th.Id, th.TotalProcessorTime.TotalSeconds, th.PrivilegedProcessorTime.TotalSeconds, th.UserProcessorTime.TotalSeconds);

        context.Response.Write(msg);
    }
}

string GetCallstack(int pid)
{
    try
    {
        using (var dataTarget = DataTarget.AttachToProcess(pid, 5000, AttachFlag.Passive))
        {
            var runtime = dataTarget.ClrVersions[0].CreateRuntime();

            string info = "";
            foreach (var t in runtime.Threads)
            {
                var cs = t.StackTrace.Select(f =>
                {
                    if (f.Method != null)
                    {
                        return f.Method.Type.Name + "." + f.Method.Name;
                    }

                    return null;
                }).ToArray();

                if (cs.Length > 0)
                {
                    info += string.Format("系統執行緒ID:{0} - CLR執行緒ID{1}:\r\n", t.OSThreadId, t.ManagedThreadId);

                    foreach (var line in cs)
                    {
                        info += string.Format("{0}\r\n", line);
                    }
                    info += "\r\n";
                }
            }

            return info;
        }

    }
    catch (Exception ex)
    {
        return "獲取callstack失敗:" + ex.Message;
    }
}



補充說明

因為.net framework rumtime的版本問題,要用一個單獨的工具去attach其他程序做分析,是很困難的。

如果想為C#做一個獨立的易用的效能診斷工具,可以參考java世界的jvmti。讓被診斷的程序自己暴露一個介面,把clr的各種診斷資料都吐出來。

相關推薦

[C#] 網站程式ASP.NET效能診斷

微軟提供了標準的CLR效能分析類庫https://github.com/Microsoft/clrmd這個類庫是開源的程式碼。能夠獲取CLR runtime裡面幾乎所有的資訊。如何獲取clrmd編譯後的dll方法一在nuget裡面搜尋clrmd可以很方便的下載方法二估計有些同學和我一樣喜歡手動擋,那麼我這裡

ASP.NET MVC 做的網站專案 ASP.NET MVC 實現有論壇功能的網站(有iis釋出網站

 感謝部落格園團隊日夜為廣大需要獲取知識人們所做的奉獻   部落格園團隊您們辛苦了   ASP.NET MVC 實現有論壇功能的網站(有iis釋出網站   這是之前寫的...   www.lazyfitness.cn      經過一個月的修正 通過ASP.NET MVC 所

微信分享(網站ASP.NET

實現的功能: 1、網址生成二維碼 2、微信掃描二維碼,開啟網址 3、微信APP右上角點選彈出選單分享 4、分享內容可自定義:標題、描述、連結、圖片 普通分享顯示圖: 介面分享顯示圖 微信公眾平臺文件地址:

Win10 相容性 Visual studio web應用程式 ASP.NET 4.0 尚未在 Web 伺服器上註冊

系統升級到windows10 ,Visual studio 建立web應用程式時出現如下提示ASP.NET 4.0尚未在 Web 伺服器上註冊。為了使網站正確執行,可能需要手動將 Web 伺服器配置為使用 ASP.NET 4.0,按 F1 可瞭解更多詳細資訊 嘗

iis部署網站asp.net或者wcf)出現HTTP 錯誤 404.17

首先參考這個: http://blog.csdn.net/xuwei_xuwei/article/details/36895193 https://q.cnblogs.com/q/32443/ 其次: http://www.zhixing123.cn/net/41765.h

C# ASP.NET 優化程式效能、降低記憶體使用、提高程式執行速度

首先紀念一下今天的股票大跌抓個圖,雖然我自己損失不是很大,但是應該大多人都損失不小、也可能有人會繼續跳樓,也可能是股市一個新的轉折點來了。 接著還是重點關注自己寫程式碼優化的主題吧、軟體系統當訪問量不大、資料量不大時、程式寫得好與壞的差別,但是每天有上萬人使用時那程式碼寫得好與壞就差別很大了。 優

VS2010 Chart控件(一)Chart控件在ASP.NET網站中的應用示例詳解(C#語言)

[1] 設置 cti write conf int 應用程序 itl config 步驟如下: 1、 Chart控件(一)Chart控件在ASP.NET網站中的應用示例詳解(C#語言)" title="VS2010 Chart控件(一)Chart控件在ASP.NET網站中的

不修改程式碼就能優化ASP.NET網站效能的一些方法

目錄 配置OutputCache 啟用內容過期 解決資原始檔升級問題 啟用壓縮 刪除無用的HttpModule 其它優化選項 本文將介紹一些方法用於優化ASP.NET網站效能,這些方法都是不需要修改程式程式碼的。 它們主要分為二個方面: 1. 利用ASP.NET自身的

使用IIS除錯ASP.NET網站程式

在實際的開發當中,相信很多的開發者在開發除錯ASP.NET網站時候都是直接通過Visual Studio工具的編譯執行來除錯的。 一般情況下,這種除錯方式也不會有多少問題,但有時候我們會發現這樣的一個情況,就是明明在本地除錯執行都沒有問題的網站,部署到伺服器IIS上,就出現無法描述的線上問題。這時候,就要排

【菜鳥學習asp.net】 web應用程式與web網站的區別

前言: 最近學習了與web程式設計相關的很多的基礎知識,接下將是一系列的基礎知識的對比學習,今天先簡單的瞭解一下web應用程式與web網站的區別! 1、編譯方式不一樣 這個是我認為二者之間最大的區別了,首先,web應用程式中的所有的檔案都是 相互獨立 的,就是說我的一個

使用Metrics.NET 構建 ASP.NET MVC 應用程式效能指標

通常我們需要監測ASP.NET MVC 或 Web API 的應用程式的效能時,通常採用的是自定義效能計數器,效能計數器會引發無休止的運維問題(損壞的計數器、許可權問題等)。這篇文章向你介紹一個新的替代效能計數器的工具Metrics.NET,因為是它是內部的,所以我們能夠向系統中新增更多更有意義的度量標準。

一個簡單的用ASP.NET/C#開發的元件化Web應用程式(附原始碼)

==============================================================================1)建立一個類來處理使用者登入,將該類編譯成一個裝配件(assembly),併發布到站點的bin目錄下。========

ASP.NET Core之跨平臺的實時效能監控 應用程式的8個關鍵效能指標以及測量方法

原文: ASP.NET Core之跨平臺的實時效能監控 前言 前面我們聊了一下一個應用程式 應該監控的8個關鍵位置. . 嗯..地址如下: 應用程式的8個關鍵效能指標以及測量方法 最後賣了個小關子,是關於如何監控ASP.NET Core的. 今天我們就來講講如何監控它,下面上效果圖:

centos7下linux執行asp.net,c#網站搭建配置-mono+nginx

centos7下linux執行asp.net,c#網站搭建配置-mono+nginx 一、首先安裝一些需要的軟體包 首先更新CentOS上的軟體包: yum –y update 安裝一些需要的庫: yum -y install gcc gcc-c++ bison pkgconfig glib2-de

centos7下linux運行asp.net,c#網站搭建配置-mono+nginx

server 3.0 正常 document local fire tle pan path centos7下linux運行asp.net,c#網站搭建配置-mono+nginx 一、首先安裝一些需要的軟件包 首先更新CentOS上的軟件包: yum –y update 安

在Win2003、Win7、XP中配置IIS搭建ASP.NET Web網站或應用程式

1、Xp系統中iis5.1的配置 Xp系統中自帶的是IIS5.1,而IIS5.1中只能建立一個網站——即預設網站,如果要在上面部署多個web應用程式,我們可以使用新建虛擬目錄的形式。具體操作如下: a、 開始——控制面板——管理工具——Internet資訊伺服器,會看到

微信小程式 帶引數二維碼 C# asp.net 服務端程式

第一步 獲取access_token: 文件如下: http請求方式: GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=

微信小程式 模板訊息 C#(asp.net

傳送模板訊息,首先要獲得access_token。這個是連結 然後。。。。                     //傳送通知                                     JavaScriptSerializer Jss = new Java

ASP.NET根據URL生成網頁縮圖示例程式(C#語言)

工作中可能馬上要用到根據URL生成網頁縮圖功能,提前做好準備。 在網上找了份原始碼,但是有錯誤:當前執行緒不在單執行緒單元中,因此無法例項化 ActiveX 控制元件“8856f961-340a-11d0-a9”,解決後執行良好,記錄在此備用! 起始頁:Default

c# asp.net 測試程式執行時間

using System.Diagnostics; System.Diagnostics.Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); // 開始監視程式碼執行時間 //要測試的程式碼寫這裡