微软提供了标准的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的性能诊断 - CPU分析的更多相关文章

  1. 使用vs自带的性能诊断工具

    visual studio是个强大的集成开发环境,内置了程序性能诊断工具.下面通过两段代码进行介绍. static void Main( string[] args) { Test1(); Test2 ...

  2. 【渗透课程】特别篇-主流网站程序Oday大全以及拿shell思路

    版权和内容说明: 这篇文章不是本站编写,是从网络上摘抄的,但是经过了本站的改写优化,并将内容,格式规范化. 本篇说明:这篇文章结合了前辈们前几年一路挖掘出来的主流程序漏洞以及思路, 小编写在前面是想让 ...

  3. ASP.NET网站与ASP.NET应用程序的区别

    我们使用VS做ASP.NET的时候,可以选择新建ASP.NET应用程序,同时也可以新建ASP.NET网站,两者有什么具体区别呢?今天真是很幸运,比别人多上了老师一节课,讲的是这两者之间的一些区别.我学 ...

  4. ASP.Net网站程序在编译发布部署后的后期修改

    ASP.Net网站程序在发布部署后的后期修改 作者:东篱南山 这里说的后期修改是指网站编译发布并部署好之后,对程序进行的修改,即在不能更改现有代码的情况下,更改页面的显示或是更改业务逻辑.一般是在程序 ...

  5. C# -- HttpWebRequest 和 HttpWebResponse 的使用 C#编写扫雷游戏 使用IIS调试ASP.NET网站程序 WCF入门教程 ASP.Net Core开发(踩坑)指南 ASP.Net Core Razor+AdminLTE 小试牛刀 webservice创建、部署和调用 .net接收post请求并把数据转为字典格式

    C# -- HttpWebRequest 和 HttpWebResponse 的使用 C# -- HttpWebRequest 和 HttpWebResponse 的使用 结合使用HttpWebReq ...

  6. 如何利用IIS调试ASP.NET网站程序详解

    如何利用IIS调试ASP.NET网站程序详解 更新时间:2019年01月13日 08:44:13   作者:江湖逍遥    我要评论   这篇文章主要给大家介绍了关于如何利用IIS调试ASP.NET网 ...

  7. 60,000毫秒内对Linux的性能诊断效的方法

    转载于:http://www.itxuexiwang.com/a/liunxjishu/2016/0225/168.html?1456484140 60,000 毫秒内对 Linux 的性能诊断 当你 ...

  8. ASP.NET26个性能优化方法

    1.数据库访问性能优化 (1)数据库的连接和关闭 访问数据库资源需要创建连接.打开连接和关闭连接几个操作.这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器资源. ASP.NET中提供了连 ...

  9. (摘录)26个ASP.NET常用性能优化方法

    数据库访问性能优化 数据库的连接和关闭 访问数据库资源需要创建连接.打开连接和关闭连接几个操作.这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器资源. ASP.NET中提供了连接池(Co ...

随机推荐

  1. 为什么我的电脑win系统没有便笺功能?为什么我在开始菜单里找不到便笺功能?

    有些网友表示,为什么我的电脑没有便笺功能?为什么我在开始菜单里找不到便笺功能? 从问题可以基本判断出来,这些网友使用的Win7版本有可能是买笔记本或者台式电脑时预装的Win7家庭普通版或者Win7精简 ...

  2. iBatis的基本配置+CRUD操作

    首先解释一下CRUD的含义:CRUD是指在做计算处理时的增加(Create).查询(Retrieve)(重新得到数据).更新(Update)和删除(Delete) 基本的数据库操作 创建工程iBati ...

  3. JavaScript运算符与类型

    1.运算符优先级 首先讲一下运算符的优先级,它决定了表达式中运算执行的先后顺序,优先级高的运算符最先被执行. 下面的表将所有运算符按照优先级的不同从高到低排列: 优先级 运算类型 关联性 运算符 19 ...

  4. Python使用base64编码的问题

    有的时候,在base64解码的时候,由于字节问题出现解码错误.解决的办法就是不足原base64子串的长度: def decode_base64(data): """ De ...

  5. 问题✅:render json的格式支持。to_json被改成as_json,功能一样

    class StudentsController < ApplicationController def show @student = Student.find(params[:id]) re ...

  6. 3-9《元编程》第3章Tuesday:methods

    第3章methods Ruby是动态语言,有静态语言实现不了的技巧.本章讲解代码的重构,把代码变得更简洁. 3.2Dynamic Methods 3.21Calling Methods Dynamic ...

  7. android------2018 年初值得关注的 16 个新 Android 库和项目

    1. transitioner Transitioner 是一个为两个拥有嵌入子视图的视图之间提供简便.动态且可调整的动画效果的库.它纯 100% 使用 Kotlin 编写而成,使用 MIT 许可,且 ...

  8. PHP函数总结 (一)

    <?php /** * 原理: * 函数不调用不执行,定义函数时,会将 * 函数放到内存中代码段,当调用函数时去内存 * 中函数名称所在位置中执行函数体,执行完后 * 将控制权移交回给调用函数的 ...

  9. Android 7.0正式版工厂镜像下载

    Android 7.0正式版工厂镜像下载 从3月份上线首个开发者预览版(Developer Preview)之后,经过近6个月时间的打磨,谷歌今天开始向Nexus设备推送Android 7.0 Nou ...

  10. ASP.NET的路由系统

    一.URL与物理文件的分离 1.URL与物理文件的分离 对于一个 ASP.NET Web Form应用来说,任何一个请求都对应着某个具体的物理文件.部署在Web服务器上的物理文件可以是静态的(比如图片 ...