用 perfcollect 洞察 Linux 上.NET程序CPU爆高

news2024/11/24 16:23:48

一:背景

1. 讲故事

如果要分析 Linux上的 .NET程序 CPU 爆高,按以往的个性我肯定是抓个 dump 下来做事后分析,这种分析模式虽然不重但也不轻,还需要一定的底层知识,那有没有傻瓜式的 CPU 爆高分析方式呢?

相信有很多朋友知道 B站713事件,最终就是用 perf 找到了那个让 cpu 100% 的 lua 函数,截图如下:

这里我们也借助 perf 这款工具实现 .NET程序的 cpu 爆高洞察, perf 就不过多介绍了,它是Linux系统中提供的一款性能分析工具,类似 Windows 的 ETW 跟踪,所以对他的了解是非常重要的。

这里要注意的是我们并不直接使用,而是用微软提供的基于 perf 的高层封装工具 perfCollect,它不仅能收集 perf 能收集的事件,还能收集 .NET 中的 EventSource 事件,简直是福音哈。

PerfCollect 跟踪

1. 测试代码

为了能够让 CPU 爆高,我们故意让其中一个方法死循环,一个方法运行一段时间正常结束,参考代码如下:


namespace ConsoleApp1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Task.Run(() =>
            {
                Test1();
            });

            Task.Run(() =>
            {
                Test2();
            });

            Console.ReadLine();
        }

        static void Test1()
        {
            int i = 1;
            bool b = false;

            while (i > 0)
            {
                b = !b;
            }
        }

        static void Test2()
        {
            for (int i = 0; i < short.MaxValue; i++)
            {

            }
        }
    }
}

代码有了就可以 publish 到 centos 上,接下来在 /etc/profile 中增加一个环境变量 export COMPlus_PerfMapEnabled=1 ,目的是让 RIP 能够成功解析到 C# 的方法名,截图如下:

有了这些前置基础,接下来就是把程序跑起来,用 htop 观察下 CPU 的利用率。


[root@localhost data2]# vim /etc/profile
[root@localhost data2]# source /etc/profile
[root@localhost data2]# ls
ConsoleApp1  ConsoleApp1.deps.json  ConsoleApp1.dll  ConsoleApp1.pdb  ConsoleApp1.runtimeconfig.json
[root@localhost data2]# dotnet ConsoleApp1.dll

2. 安装 PerfCollect

刚才也说了 PerfCollect 是微软提供的一款工具,集成了 perf + LTTng 两块,前者用于捕获Linux系统级事件,后者用于捕获 CoreCLR 以及 EventSource 事件,接下来就是下载,赋权限,安装。


[root@localhost data3]# curl -OL https://aka.ms/perfcollect
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:--  0:00:02 --:--:--     0
100 68590  100 68590    0     0  17540      0  0:00:03  0:00:03 --:--:-- 72658
[root@localhost data3]# chmod +x perfcollect
[root@localhost data3]# sudo ./perfcollect install
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
epel/x86_64/metalink                                                              |  28 kB  00:00:00     
 * base: ftp.sjtu.edu.cn
 * epel: d2lzkl7pfhq30w.cloudfront.net
 * extras: mirror.lzu.edu.cn
 * updates: mirror.lzu.edu.cn
base                                                                              | 3.6 kB  00:00:00     
docker-ce-stable                                                                  | 3.5 kB  00:00:00     
extras                                                                            | 2.9 kB  00:00:00     
packages-microsoft-com-prod                                                       | 1.5 kB  00:00:00     
updates                                                                           | 2.9 kB  00:00:00     
Package perf-3.10.0-1160.92.1.el7.x86_64 already installed and latest version
Package zip-3.0-11.el7.x86_64 already installed and latest version
Package unzip-6.0-24.el7_9.x86_64 already installed and latest version
Nothing to do
LTTng already installed.

安装好之后进行 10s 采集,采集完之后就会生成一个 ConsoleApp.trace.zip 文件,输出如下:


[root@localhost data3]# ./perfcollect collect ConsoleApp -collectsec 10
Collection started. Collection will automatically stop in 10 second(s). Press CTRL+C to stop early.

...STOPPED.

Starting post-processing. This may take some time.

Generating native image symbol files
...FINISHED
Saving native symbols
...FINISHED
Resolving JIT and R2R symbols
...FINISHED
Exporting perf.data file
...FINISHED
Compressing trace files
...FINISHED
Cleaning up artifacts
...FINISHED

Trace saved to ConsoleApp.trace.zip

最后把 ConsoleApp.trace.zip 复制到 Windows 平台上用 PerfView 分析。

3. Perfview 分析

说句良心话,Perfview 真的是太强大了,什么文件都能从中提取有用信息,比如 .dmp,.nettrace 还有这里的 .zip ,用 Perfview 打开 zip 之后,双击 CPU Stacks 选项,找到我们的 PID 进程即(.NET ThreadPool),截图如下:


[root@localhost data3]# ps -ef | grep dotnet
root       6027   3171 99 23:33 pts/1    00:02:01 dotnet ConsoleApp1.dll
root       6529   5240  0 23:35 pts/2    00:00:00 grep --color=auto dotnet

双击打开之后,去掉 GroupPats 信息,可以看到占比最高的是 Program::Test1() 方法。

有朋友可能要问这个信息怎么解读呢?其实非常简单,perf 也是按照 1ms 采样一次的方式,所以 10s 的样本数: 1w =10 * 1000

从上图中可以看到,总的采样到了 9999 个样本,其中 Program::Test1() 占据了 9993,占比高达 99.9%,到这里我们就定位出了原来这个函数就是 hot 函数。

三:总结

不知道大家发现没有,在 Windows 上很容易监控的东西,在 Linux 上就要麻烦的多,其实很容易理解,Windows 是微软的, .NET 也是微软的,自然是一等公民的存在。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/765348.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用testify包辅助Go测试指南

我虽然算不上Go标准库的“清教徒”&#xff0c;但在测试方面还多是基于标准库testing包以及go test框架的&#xff0c;除了需要mock的时候&#xff0c;基本上没有用过第三方的Go测试框架。我在《Go语言精进之路》[2]一书中对Go测试组织的讲解也是基于Go testing包和go test框架…

【Java|golang】415. 字符串相加

给定两个字符串形式的非负整数 num1 和num2 &#xff0c;计算它们的和并同样以字符串形式返回。 你不能使用任何內建的用于处理大整数的库&#xff08;比如 BigInteger&#xff09;&#xff0c; 也不能直接将输入的字符串转换为整数形式。 示例 1&#xff1a; 输入&#xff…

五笔衰落,PC和OCR惹得祸?

许多人认为五笔输入法的衰落主要因素是败给了拼音输入法&#xff0c;是被拼音输入法给“打残”了&#xff0c;取代了&#xff0c;其实这只是表面原因&#xff0c;笔者认为&#xff0c;其关键因素是PC的衰落和OCR技术的不断改进和发展&#xff0c;理由如下&#xff1a; 1、PC出…

TCP/IP详解

目录 一、OSI参考模型 1.图示 2.OSI七层模型各自作用 3.七层通信过程 二、IP协议 1.IPv4首部 2.IPv6首部 三、TCP协议 1.tcp首部格式 2.握手挥手图示 3.握手流程 4.为什么要三次握手&#xff1f; 5.四次挥手流程 6.为什么要四次分手&#xff1f; 7.为什么要等待…

kafka接收外部接口的数据,并实现转发

目录 一、什么是kafka 二、kafka接收外部接口数据 三、kafka收到数据后转发 四、kafka总结 一、什么是kafka Kafka是一种分布式流式处理平台&#xff0c;最初由LinkedIn开发。它设计用于高吞吐量、低延迟的数据处理&#xff0c;能够处理大规模的实时数据流。Kafka采用发布…

[PHP]解决exec执行unzip出现中文文件名乱码的问题

查看Linux编码&#xff0c;例如下图可看出Linx编码是zh_CN.UTF-8 问题截图&#xff1a; 以下代码都会产生乱码 exex(unzip -d /xxx /x/test.zip); exex(unzip -O zh_CN.UTF-8 -d /xxx /x/test.zip); exex(unzip -I zh_CN.UTF-8 -d /xxx /x/test.zip); 解决方法&#xff1a; …

Java线程的创建和使用

目录 基本概念 线程的创建和使用 线程的生命周期 基本概念 程序(program) 程序(program)是为完成特定任务、用某种语言编写的一组指令的集合。即指一段静态的代码&#xff0c;静态对象。 进程(process) 进程(process)是程序的一次执行过程&#xff0c;或是正在运行的一个程…

ESP32+MQTT+MySQL实现发布订阅【气味数据收集】

ESP32MQTTMySQL实现发布订阅【气味数据收集】 &#x1f52e;&#x1f52e;&#x1f52e;&#x1f52e;&#x1f52e;相关文章&#x1f52e;&#x1f52e;&#x1f52e;&#x1f52e;&#x1f52e; ESP32连接MQ Sensor实现气味反应 &#x1f517; https://blog.csdn.net/ws1516…

指针知多少

作者简介&#xff1a;დ旧言~&#xff0c;目前大一&#xff0c;现在学习Java&#xff0c;c&#xff0c;Python等 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 望小伙伴们点赞&#x1f44d;收藏✨加关注哟&#x1f495;&#x1f495; ⛵前言 不知道大家还记…

avi格式怎么转换成mp4?教你几种简单转换小技巧

由于 AVI 格式的文件结构&#xff0c;它们不适合用于流式传输。这意味着&#xff0c;如果你想在线观看一个 AVI 格式的视频&#xff0c;你需要等待整个文件下载完成后才能开始观看。这对于那些希望尽快开始观看视频的人来说可能是一个问题。那么我们怎么将AVI格式的视频转换成M…

【C语言】memcpy,memmove,memcmp,memset函数详解

memcpy,memmove,memcmp,memset函数详解 memcpy函数一、 memcpy函数的定义&#xff1a;二、memcpy函数的功能&#xff1a;三、memcpy函数模拟memcpy注意事项 memmove函数一、memmove函数简介二、memmove函数的模拟1.两种情况2模拟实现 memcmp函数memecmp函数介绍 memset函数mems…

Cell 子刊 - 4D打印一只可变形的蜘蛛

国自然“十四五”优先发展领域公布&#xff0c;共计115项&#xff01;&#xff08;生物医学领域节选&#xff0c;近 50 项&#xff09;中提到 4D打印是一个重要方向。 凝胶状墨水使得3D打印应用于电子设备的金属物体更容易。 3D打印在经济性、设计自由度和效率方面均超越了传统…

Matplotlib中文乱码解决方案(两种方式)

Matplotlib 默认不支持中文字体&#xff0c;这因为 Matplotlib 只支持 ASCII 字符&#xff0c;但中文标注更加符合中国人的阅读习惯。因此&#xff0c;本节重点讲解如何在 Windows 环境下让 Matplotlib 显示中文。 Matplotlib中文乱码 当不对 Matplotlib 进行设置&#xff0c…

网页版五子棋设计实现自动化测试

目录 一、设计测试用例 二、执行测试 登录页面 功能测试 界面测试 注册界面 功能测试 界面测试 游戏大厅 功能测试 界面测试 游戏房间 功能测试 界面测试 一、设计测试用例 二、执行测试 在执行测试之前首先获取到驱动。 登录页面 功能测试 首先定义star…

2023年9月长沙/郑州/济南DAMA-CDGA/CDGP认证考试报名

据DAMA中国官方网站消息&#xff0c;2023年度第三期DAMA中国CDGA和CDGP认证考试定于2023年9月23日举行。 报名通道现已开启&#xff0c;相关事宜通知如下&#xff1a; 考试科目: 数据治理工程师(CertifiedDataGovernanceAssociate,CDGA) 数据治理专家(CertifiedDataGovernanc…

Spark(26):Spark通讯架构

目录 0. 相关文章链接 1. Spark通信架构概述 2. Spark 通讯架构解析 0. 相关文章链接 Spark文章汇总 1. Spark通信架构概述 Spark 中通信框架的发展&#xff1a; Spark 早期版本中采用 Akka 作为内部通信部件。Spark1.3 中引入 Netty 通信框架&#xff0c;为了解决 Shuf…

靶机渗透之prime1(解法2)

prime1 靶机渗透获取目标shell查看当前用户下的信息查找是否含有有效的备份文件经过查找找到enc文件密码md5格式生成登录靶机Prime提权成功获取flag 靶机渗透 获取目标shell 查看当前用户下的信息 在当前文件夹下&#xff0c;enc文件需要密码&#xff0c;尝试去寻找该文件的密…

移远通信发布新款5G/4G、LPWA和GNSS天线,进一步优化物联网终端性能

2023年7月17日&#xff0c;全球领先的物联网整体解决方案供应商移远通信宣布&#xff0c;再次推出三款新型天线产品&#xff0c;以更优的通信和定位性能&#xff0c;满足各类物联网终端在5G/4G、LPWA和GNSS等技术上的更高设计需求。这三款天线包括&#xff1a; YEMN926J1A&…

【GlobalMapper精品教程】061:快速生成全球任意地区等高线

本文讲解在globalmapper中根据任意指定的区域下载数字地形并生成等高线,支持在CASS中打开并编辑。 文章目录 一、指定下载区域二、下载地形数据三、生成等高线四、投影转换五、导出等高线一、指定下载区域 首先,通过在线地图指定一个区域。当然你有区域范围,可以直接下载。…

爱上PyCharm全新UI的五个理由!让Python开发更个性化

在2023.1版本中&#xff0c; JetBrains官方产品团队对 PyCharm 的外观进行了重新设计&#xff0c;目标是降低视觉复杂性&#xff0c;使用户能够轻松访问基本功能&#xff0c;并根据需要逐级呈现复杂功能 – 打造整洁、现代且专业的外观和质感。 在本文中&#xff0c;我们将进一…