微软提供了标准的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. lombok 中的@Data注解

    今天看到有代码中的Dao包中的类文件,写的极其简洁,甚至引起了开发工具InteliJ的报错,然后程序还能稳健地跑起来. import lombok.Data; @Data public class V ...

  2. 《剑指offer》第十八题(在O(1)时间删除链表结点)

    // 面试题18(一):在O(1)时间删除链表结点 // 题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该 // 结点. #include <iostream> ...

  3. mac 下安装mongodb

    转载自https://segmentfault.com/a/1190000002547229 概念 MongoDB 是一个跨平台的,面向文档的数据库,提供高性能,高可用性和可扩展性方便. MongoD ...

  4. centos7: vsftpd安装及启动: ftp配置(以虚拟用户为例)

    centos7: vsftpd安装及启动: ftp配置 1安装: yum -y install vsftpd /bin/systemctl start vsftpd.service #启动 /bin/ ...

  5. LeetCode--112--路径总和

    问题描述: 给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和. 说明: 叶子节点是指没有子节点的节点. 示例:  给定如下二叉树,以及目标和 s ...

  6. robot framework学习笔记2

    声明:本笔记都只是自己根据大牛虫师的robot系列文档学习记录的,学习的话还请移步虫师博客:https://www.cnblogs.com/fnng/ 非常感谢大牛的分享,带小白一步一步入门   F5 ...

  7. 『科学计算』L0、L1与L2范数_理解

     『教程』L0.L1与L2范数 一.L0范数.L1范数.参数稀疏 L0范数是指向量中非0的元素的个数.如果我们用L0范数来规则化一个参数矩阵W的话,就是希望W的大部分元素都是0,换句话说,让参数W是稀 ...

  8. git上传文件到github与gulp的简单使用

    git有两种方式提交源代码到github 第一种方式通过地址提交下面介绍的是通过ssh方式上传 git使用ssh方式上传代码到githubgit首先要生成公钥和私钥 将公钥添加到github中将私钥保 ...

  9. 操作系统错误 5:"5(拒绝访问。)

    ------------------------------ 无法打开物理文件 "G:/QGJX.mdf".操作系统错误 5:"5(拒绝访问.)". (Micr ...

  10. 第一个 MVC 应用程序(上半部分)(《精通 ASP.NET MVC5》 的第二章)

    本章将使用 ASP.NET MVC 框架创建一个简单的数据录入应用程序. 笔者会将过程分解成一个个的步骤,以便能够看出如何构造 ASP.NET MVC 应用程序.(对于一些未进行解释的内容,笔者提供了 ...