国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

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

這篇具有很好參考價(jià)值的文章主要介紹了用 perfcollect 洞察 Linux 上.NET程序 CPU爆高。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

一:背景

1. 講故事

如果要分析 Linux上的 .NET程序 CPU 爆高,按以往的個(gè)性我肯定是抓個(gè) dump 下來(lái)做事后分析,這種分析模式雖然不重但也不輕,還需要一定的底層知識(shí),那有沒(méi)有傻瓜式的 CPU 爆高分析方式呢?

相信有很多朋友知道 B站713事件,最終就是用 perf 找到了那個(gè)讓 cpu 100% 的 lua 函數(shù),截圖如下:

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

這里我們也借助 perf 這款工具實(shí)現(xiàn) .NET程序的 cpu 爆高洞察, perf 就不過(guò)多介紹了,它是Linux系統(tǒng)中提供的一款性能分析工具,類(lèi)似 Windows 的 ETW 跟蹤,所以對(duì)他的了解是非常重要的。

這里要注意的是我們并不直接使用,而是用微軟提供的基于 perf 的高層封裝工具 perfCollect,它不僅能收集 perf 能收集的事件,還能收集 .NET 中的 EventSource 事件,簡(jiǎn)直是福音哈。

PerfCollect 跟蹤

1. 測(cè)試代碼

為了能夠讓 CPU 爆高,我們故意讓其中一個(gè)方法死循環(huán),一個(gè)方法運(yùn)行一段時(shí)間正常結(jié)束,參考代碼如下:


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 上,接下來(lái)在 /etc/profile 中增加一個(gè)環(huán)境變量 export COMPlus_PerfMapEnabled=1 ,目的是讓 RIP 能夠成功解析到 C# 的方法名,截圖如下:

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

有了這些前置基礎(chǔ),接下來(lái)就是把程序跑起來(lái),用 htop 觀(guān)察下 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

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

2. 安裝 PerfCollect

剛才也說(shuō)了 PerfCollect 是微軟提供的一款工具,集成了 perf + LTTng 兩塊,前者用于捕獲Linux系統(tǒng)級(jí)事件,后者用于捕獲 CoreCLR 以及 EventSource 事件,接下來(lái)就是下載,賦權(quán)限,安裝。


[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.

安裝好之后進(jìn)行 10s 采集,采集完之后就會(huì)生成一個(gè) 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 復(fù)制到 Windows 平臺(tái)上用 PerfView 分析。

3. Perfview 分析

說(shuō)句良心話(huà),Perfview 真的是太強(qiáng)大了,什么文件都能從中提取有用信息,比如 .dmp,.nettrace 還有這里的 .zip ,用 Perfview 打開(kāi) zip 之后,雙擊 CPU Stacks 選項(xiàng),找到我們的 PID 進(jìn)程即(.NET ThreadPool),截圖如下:

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


[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

雙擊打開(kāi)之后,去掉 GroupPats 信息,可以看到占比最高的是 Program::Test1() 方法。

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

有朋友可能要問(wèn)這個(gè)信息怎么解讀呢?其實(shí)非常簡(jiǎn)單,perf 也是按照 1ms 采樣一次的方式,所以 10s 的樣本數(shù): 1w =10 * 1000。

從上圖中可以看到,總的采樣到了 9999 個(gè)樣本,其中 Program::Test1() 占據(jù)了 9993,占比高達(dá) 99.9%,到這里我們就定位出了原來(lái)這個(gè)函數(shù)就是 hot 函數(shù)。

三:總結(jié)

不知道大家發(fā)現(xiàn)沒(méi)有,在 Windows 上很容易監(jiān)控的東西,在 Linux 上就要麻煩的多,其實(shí)很容易理解,Windows 是微軟的, .NET 也是微軟的,自然是一等公民的存在。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-576565.html

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

到了這里,關(guān)于用 perfcollect 洞察 Linux 上.NET程序 CPU爆高的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀(guān)點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Linux下多核CPU指定程序運(yùn)行的核

    Linux下多核CPU指定程序運(yùn)行的核

    查看CPU核心數(shù)量:lscpu 1.4.1 通過(guò)運(yùn)行時(shí)的參數(shù)設(shè)置 1.4.2 通過(guò)代碼設(shè)置 查看程序的PID 查看程序可運(yùn)行的核 得出該程序可以在0-3 4個(gè)核上運(yùn)行。 假設(shè)我們要使程序運(yùn)行在第2個(gè)核上: 查看程序的PID 查看程序可運(yùn)行的CPU核 得出設(shè)置成功,已將程序綁定在CPU的第2個(gè)核上。

    2024年02月21日
    瀏覽(19)
  • 如何洞察 C# 程序的 GDI 句柄泄露

    如何洞察 C# 程序的 GDI 句柄泄露

    前段時(shí)間有位朋友找到我,說(shuō)他的程序界面操作起來(lái)很慢并且卡頓等一些不正?,F(xiàn)象,從任務(wù)管理器看了下 GDI句柄 已經(jīng)到 1w 了,一時(shí)也找不出什么代碼中哪里有問(wèn)題,讓我?guī)兔聪?,其?shí)這種問(wèn)題看內(nèi)存dump作用不是很大,主要是寫(xiě)腳本很麻煩,這一篇我們就來(lái)簡(jiǎn)單聊聊如何

    2024年02月08日
    瀏覽(22)
  • linux 部署 net6 應(yīng)用程序(寶塔版)

    linux 部署 net6 應(yīng)用程序(寶塔版)

    首先在VS2022上面把應(yīng)用編譯成linux 上的運(yùn)行文件! 然后通過(guò)上傳到指定目錄,也用過(guò)寶塔的坑定會(huì)。 依照官網(wǎng)的操作。我的是CentOS 7,誰(shuí)叫8不支持了呢。 安裝 .NET 之前,請(qǐng)運(yùn)行以下命令,將 Microsoft 包簽名密鑰添加到受信任密鑰列表,并添加 Microsoft 包存儲(chǔ)庫(kù)。 打開(kāi)終端并

    2024年02月07日
    瀏覽(21)
  • linux 服務(wù)器利用寶塔面板部署.net 6(.net core)服務(wù)端程序圖文步驟

    linux 服務(wù)器利用寶塔面板部署.net 6(.net core)服務(wù)端程序圖文步驟

    隨著.net core 跨平臺(tái)技術(shù)的興起,微軟.net擁抱云原生,支持跨平臺(tái),可以使基于.net core技術(shù)的服務(wù)端程序輕松移植到基于Linux的云服務(wù)器上,本文以圖文的方式介紹如何利用阿里云輕量應(yīng)用服務(wù)器安裝寶塔面板部署基于.net core的后端服務(wù)器接口程序并正常運(yùn)行。 步驟 準(zhǔn)備一臺(tái)

    2024年02月14日
    瀏覽(92)
  • .net core控制臺(tái)應(yīng)用程序在linux運(yùn)行

    .net core控制臺(tái)應(yīng)用程序在linux運(yùn)行

    1)創(chuàng)建.net 6.0控制臺(tái)應(yīng)用程序 2)在應(yīng)用根目錄執(zhí)行cmd命令發(fā)布應(yīng)用:dotnet publish -o .deploy 3)將發(fā)布文件上傳到服務(wù)器 ? ?4)運(yùn)行控制臺(tái)應(yīng)用程序(dotnet /home/app/ConsoleApp/ConsoleApp5.dll) 5)如果需要定時(shí)執(zhí)行,可以添加sh文件 參考:linux定時(shí)備份(刪除)mysql_linux數(shù)據(jù)庫(kù)定時(shí)備

    2024年02月16日
    瀏覽(99)
  • 【.Net動(dòng)態(tài)Web API】背景與實(shí)現(xiàn)原理

    【.Net動(dòng)態(tài)Web API】背景與實(shí)現(xiàn)原理

    ??前言 本文是《.Net Core進(jìn)階編程課程》教程專(zhuān)欄的導(dǎo)航站(點(diǎn)擊鏈接,跳轉(zhuǎn)到專(zhuān)欄主頁(yè),歡迎訂閱,持續(xù)更新…) 專(zhuān)欄介紹:通過(guò)源碼實(shí)例來(lái)講解Asp.Net Core進(jìn)階知識(shí)點(diǎn),讓大家完全掌握每一個(gè)知識(shí)點(diǎn)。 專(zhuān)欄適用于人群:Web后端開(kāi)發(fā)人員 ————————————————

    2024年04月22日
    瀏覽(18)
  • 記一次 .NET 某汽貿(mào)店 CPU 爆高分析

    記一次 .NET 某汽貿(mào)店 CPU 爆高分析

    上周有位朋友在 github 上向我求助,說(shuō)線(xiàn)程都被卡住了,讓我?guī)兔聪?,截圖如下: 時(shí)隔兩年 終于有人在上面提 Issue 了,看樣子這塊以后可以作為 求助專(zhuān)區(qū) 來(lái)使用,既然來(lái)求助,必須得免費(fèi)幫忙解決,從朋友這邊拿到 dump 之后,接下來(lái)就可以分析了。 在朋友的文案描述中

    2024年02月05日
    瀏覽(23)
  • 記一次 .NET 某儀器測(cè)量系統(tǒng) CPU爆高分析

    記一次 .NET 某儀器測(cè)量系統(tǒng) CPU爆高分析

    最近也挺奇怪,看到了兩起 CPU 爆高的案例,且誘因也是一致的,覺(jué)得有一些代表性,合并分享出來(lái)幫助大家來(lái)避坑吧,閑話(huà)不多說(shuō),直接上 windbg 分析。 這里要提醒一下,別人說(shuō)爆高不一定真的就是爆高,我們一定要拿數(shù)據(jù)說(shuō)話(huà),可以用 !tp 觀(guān)察下。 雖然卦中的 CPU 不低但也

    2024年02月08日
    瀏覽(17)
  • 基于php微信小程序在線(xiàn)聽(tīng)故事系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)

    基于php微信小程序在線(xiàn)聽(tīng)故事系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)

    開(kāi)發(fā)概要 開(kāi)發(fā)操作系統(tǒng):windows10 + 4G內(nèi)存 + 500G 小程序開(kāi)發(fā):微信開(kāi)發(fā)者工具(MINA框架) 后臺(tái)環(huán)境:IIS +PHP 后臺(tái)開(kāi)發(fā)語(yǔ)言:PHP 后臺(tái)開(kāi)發(fā)工具:Dreamweaver +PhpStorm 數(shù)據(jù)庫(kù):mysql8 數(shù)據(jù)庫(kù)管理工具:navicat 其他開(kāi)發(fā)語(yǔ)言:html + css +javascript

    2024年02月11日
    瀏覽(24)
  • 記一次 .NET 某物流API系統(tǒng) CPU爆高分析

    記一次 .NET 某物流API系統(tǒng) CPU爆高分析

    前段時(shí)間有位朋友找到我,說(shuō)他程序CPU直接被打滿(mǎn)了,讓我?guī)兔聪略趺椿厥拢貓D如下: 看了下是兩個(gè)相同的程序,既然被打滿(mǎn)了那就抓一個(gè) dump 看看到底咋回事。 凡事都要用數(shù)據(jù)說(shuō)話(huà),我們使用 !tp 命令觀(guān)察一下。 從卦象看果然是被打滿(mǎn)了,那為什么會(huì)滿(mǎn)呢?一般來(lái)說(shuō)

    2024年02月15日
    瀏覽(15)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包