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

PerfView專題 (第十四篇): 洞察那些 C# 代碼中的短命線程

這篇具有很好參考價值的文章主要介紹了PerfView專題 (第十四篇): 洞察那些 C# 代碼中的短命線程。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一:背景

1. 講故事

這篇文章源自于分析一些疑難dump的思考而產(chǎn)生的靈感,在dump分析中經(jīng)常要尋找的一個答案就是如何找到死亡線程的生前都做了一些什么?參考如下輸出:


0:001> !t
ThreadCount:      22
UnstartedThread:  0
BackgroundThread: 1
PendingThread:    0
DeadThread:       20
Hosted Runtime:   no
                                                                         Lock  
       ID OSID ThreadOBJ    State GC Mode     GC Alloc Context  Domain   Count Apt Exception
   0    1 3a74 00efb368     2a020 Preemptive  02F2AF48:00000000 00ec2fa0 1     MTA 
   5    2 6758 00f07a48     2b220 Preemptive  00000000:00000000 00ec2fa0 0     MTA (Finalizer) 
XXXX    3    0 00f31df0   1039820 Preemptive  00000000:00000000 00ec2fa0 0     Ukn (Threadpool Worker) 
XXXX    4    0 00f34080   1039820 Preemptive  00000000:00000000 00ec2fa0 0     Ukn (Threadpool Worker) 
XXXX    5    0 00f363a8   1039820 Preemptive  00000000:00000000 00ec2fa0 0     Ukn (Threadpool Worker) 
XXXX    6    0 00f372e8   1039820 Preemptive  00000000:00000000 00ec2fa0 0     Ukn (Threadpool Worker) 
XXXX    7    0 00f39f80   1039820 Preemptive  00000000:00000000 00ec2fa0 0     Ukn (Threadpool Worker) 
XXXX    8    0 00f3cbd0   1039820 Preemptive  00000000:00000000 00ec2fa0 0     Ukn (Threadpool Worker) 
XXXX    9    0 00f3d128   1039820 Preemptive  00000000:00000000 00ec2fa0 0     Ukn (Threadpool Worker) 
XXXX   10    0 00f40630   1039820 Preemptive  00000000:00000000 00ec2fa0 0     Ukn (Threadpool Worker) 
XXXX   11    0 00f43310   1039820 Preemptive  00000000:00000000 00ec2fa0 0     Ukn (Threadpool Worker) 
XXXX   12    0 00f42db8   1039820 Preemptive  00000000:00000000 00ec2fa0 0     Ukn (Threadpool Worker) 
XXXX   13    0 00f49180   1039820 Preemptive  00000000:00000000 00ec2fa0 0     Ukn (Threadpool Worker) 
XXXX   14    0 00f4a228   1039820 Preemptive  00000000:00000000 00ec2fa0 0     Ukn (Threadpool Worker) 
XXXX   15    0 00f53a28   1039820 Preemptive  00000000:00000000 00ec2fa0 0     Ukn (Threadpool Worker) 
XXXX   16    0 00f56598   1039820 Preemptive  00000000:00000000 00ec2fa0 0     Ukn (Threadpool Worker) 
XXXX   17    0 00f59180   1039820 Preemptive  00000000:00000000 00ec2fa0 0     Ukn (Threadpool Worker) 
XXXX   18    0 00f59b28   1039820 Preemptive  00000000:00000000 00ec2fa0 0     Ukn (Threadpool Worker) 
XXXX   19    0 00f5e8a0   1039820 Preemptive  00000000:00000000 00ec2fa0 0     Ukn (Threadpool Worker) 
XXXX   20    0 00f5f248   1039820 Preemptive  00000000:00000000 00ec2fa0 0     Ukn (Threadpool Worker) 
XXXX   21    0 00f63fc0   1039820 Preemptive  00000000:00000000 00ec2fa0 0     Ukn (Threadpool Worker) 
XXXX   22    0 00f66b50   1039820 Preemptive  00000000:00000000 00ec2fa0 0     Ukn (Threadpool Worker) 

前面的 XXXX 代表線程已死亡,那誰能告訴我 ID=22 的線程生前執(zhí)行了什么代碼呢?其實(shí)去年我寫了一篇如何用 WinDbg 去尋找程序中的短命線程。 TTD 專題 (第一篇):C# 那些短命線程都在干什么?

雖然可以用 WinDbg 的 TTD 來解決,但也有很多的限制,諸如:

  • 生產(chǎn)環(huán)境不能安裝 windbg 或者 安裝不上
  • 不能對生產(chǎn)程序進(jìn)行附加

所以這兩點(diǎn)也制約了 TTD 的強(qiáng)大威力,那有沒有輕量級以及無侵入的方式洞察呢?最近在看 perfview 的文檔,發(fā)現(xiàn)完全可以使用內(nèi)核中Thread 的 ETW相關(guān)事件來搞定。

二:Thread 的ETW事件

1. 使用 Thread 的短命線程

如果死亡線程背后沒有標(biāo)記 Threadpool Worker 的話,那就說明是代碼自己用 new Thread 創(chuàng)建出來的線程,這種比較簡單,觀察 Windows Kernel/Thread/Start 或者 Microsoft-Windows-DotNETRunning/Thread/Creating 的ETW事件即可。

接下來寫一段簡單的案例代碼:


    internal class Program
    {
        static void Main(string[] args)
        {
            for (int i = 0; i < 5000; i++)
            {
                Test1();
            }

            Console.ReadLine();
        }
        public static int index = 1;

        public static void Test1()
        {
            new Thread(() => { Test2(); }).Start();
        }

        public static void Test2()
        {
            Thread.Sleep(10);

            var i = 10;
            var j = 20;

            var sum = i + j;

            Console.WriteLine($"i={index++},sum={sum}");
        }
    }

代碼非常簡單,用 new Thread 創(chuàng)建了一個短命線程,接下來打開 Perfview 使用默認(rèn)配置,完整的 Command 命令如下:


PerfView.exe  "/DataFile:PerfViewData.etl" /BufferSizeMB:256 /StackCompression /CircularMB:500 /ClrEvents:GC,Binder,Security,AppDomainResourceManagement,Contention,Exception,Threading,JITSymbols,Type,GCHeapSurvivalAndMovement,GCHeapAndTypeNames,Stack,ThreadTransfer,Codesymbols,Compilation /NoGui /NoNGenRundown /Merge:True /Zip:True collect

程序跑完后可以用 WinDbg 的 !t 去看看凌亂現(xiàn)場,可以發(fā)現(xiàn)有大量的 XXX 線程。


0:008> !t
ThreadCount:      1386
UnstartedThread:  0
BackgroundThread: 2
PendingThread:    0
DeadThread:       1383
Hosted Runtime:   no
                                                                             Lock  
 DBG   ID     OSID ThreadOBJ    State GC Mode     GC Alloc Context  Domain   Count Apt Exception
   0    1     4114 02CAC9C8     2a020 Preemptive  0559F108:0559FFEC 02c9c488 -00001 MTA 
   6    2     31b4 02CBA5F0     2b220 Preemptive  00000000:00000000 02c9c488 -00001 MTA (Finalizer) 
XXXX    3        0 02CCEC48     39820 Preemptive  00000000:00000000 02c9c488 -00001 Ukn 
XXXX  694        0 116C5B18     39820 Preemptive  00000000:00000000 02c9c488 -00001 Ukn 
XXXX  695        0 116C0578     39820 Preemptive  00000000:00000000 02c9c488 -00001 Ukn 
XXXX  696        0 116C1250     39820 Preemptive  00000000:00000000 02c9c488 -00001 Ukn 
XXXX  697        0 116BF8A0     39820 Preemptive  00000000:00000000 02c9c488 -00001 Ukn 
XXXX  698        0 116C5F60     39820 Preemptive  00000000:00000000 02c9c488 -00001 Ukn 
XXXX  699        0 116C38D8     39820 Preemptive  00000000:00000000 02c9c488 -00001 Ukn 
XXXX  700        0 116C74C8     39820 Preemptive  00000000:00000000 02c9c488 -00001 Ukn 
...
XXXX 1380        0 115097C0     39820 Preemptive  00000000:00000000 02c9c488 -00001 Ukn 
XXXX 1381        0 115079C8     39820 Preemptive  00000000:00000000 02c9c488 -00001 Ukn 
XXXX 1382        0 1150B170     39820 Preemptive  00000000:00000000 02c9c488 -00001 Ukn 
XXXX 1383        0 1150AD28     39820 Preemptive  00000000:00000000 02c9c488 -00001 Ukn 
XXXX 1384        0 11508258     39820 Preemptive  00000000:00000000 02c9c488 -00001 Ukn 
XXXX 1385        0 11505BD0     39820 Preemptive  00000000:00000000 02c9c488 -00001 Ukn 
   7 1386     6114 1150CF68     20220 Preemptive  055A07A8:055A1FEC 02c9c488 -00001 Ukn 

收集一會之后停止收集,選中Thread的內(nèi)核事件 Thread/Start,截圖如下:

PerfView專題 (第十四篇): 洞察那些 C# 代碼中的短命線程

從卦中可以看到有大量的 Start 事件,我們挑選其中一個觀察下線程棧,右鍵 Open Any Stacks 看看到底是什么代碼發(fā)出了這個 ETW 事件,截圖如下:

PerfView專題 (第十四篇): 洞察那些 C# 代碼中的短命線程

從卦中可以清晰的看到,原來是 Main() -> Test1() 方法創(chuàng)建的哈,終于水落石出。

2. 使用 ThreadPool 的短命線程

在真實(shí)場景中也有很多代碼是用 ThreadPool 創(chuàng)建出來的短命線程,這種短命線程其實(shí)有一個特點(diǎn),那就是曾經(jīng)有大量的任務(wù)進(jìn)隊(duì)列,導(dǎo)致 ThreadPool 被迫生成很多的線程來應(yīng)付,當(dāng)任務(wù)全部被消滅后,ThreadPool 就會把那些被迫生成的線程全部給裁掉

卸磨殺驢,真的好像我們的職場/(ㄒoㄒ)/~~。

所以突破點(diǎn)就是統(tǒng)計(jì)下 ThreadPoolEnqueueWork 事件,有了思路之后修改下測試代碼。


        public static void Test1()
        {
            Task.Run(() => { Test2(); });
        }

這里有一個注意點(diǎn),程序跑完之后還要稍等一兩分鐘,就是讓ThreadPool把多余的Thread給滅掉,用 windbg 觀察到的效果圖就是 講故事 那一節(jié)的,停止 perfview 收集后,尋找 ThreadPoolEnqueueWork 事件,截圖如下:

PerfView專題 (第十四篇): 洞察那些 C# 代碼中的短命線程

從卦中可以看到有大量的 ThreadPoolEnqueueWork 事件,接下來可以選擇右鍵菜單 Save View as Excel 導(dǎo)出到 Excel 中,然后對 Time Msec 進(jìn)行分組排序,看下哪一個時間段有大量的任務(wù)進(jìn)隊(duì)列,指標(biāo)高的時間段自然就是重點(diǎn)懷疑的。

這里要說一點(diǎn) Time MSecTrace Start Time 基礎(chǔ)上的毫秒級偏移值。

PerfView專題 (第十四篇): 洞察那些 C# 代碼中的短命線程

舉個例子: 4377.032 (4.37s) + 15:56:25.566 = 15:56:29.866

有了這些概念之后,找到問題區(qū)域的進(jìn)隊(duì)任務(wù),觀察下調(diào)用棧,大概率也能找到問題,從調(diào)用棧來看,原來是 Test1() 所致哈。。。 截圖如下:

PerfView專題 (第十四篇): 洞察那些 C# 代碼中的短命線程

三:總結(jié)

相比WinDbg TTD的重模式,Perfiew真的很輕,而且無侵入性,這兩個工具真的是珠聯(lián)璧合,相得益彰。文章來源地址http://www.zghlxwxcb.cn/news/detail-581072.html

PerfView專題 (第十四篇): 洞察那些 C# 代碼中的短命線程

到了這里,關(guān)于PerfView專題 (第十四篇): 洞察那些 C# 代碼中的短命線程的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • MySQL篇----第十四篇

    MySQL篇----第十四篇

    前些天發(fā)現(xiàn)了一個巨牛的人工智能學(xué)習(xí)網(wǎng)站,通俗易懂,風(fēng)趣幽默,忍不住分享一下給大家。點(diǎn)擊跳轉(zhuǎn)到網(wǎng)站,這篇文章男女通用,看懂了就去分享給你的碼吧。 1、設(shè)計(jì)良好的數(shù)據(jù)庫結(jié)構(gòu),允許部分?jǐn)?shù)據(jù)冗余,盡量避免 join 查詢,提高效率。 2、選擇合適的表字段數(shù)

    2024年02月19日
    瀏覽(26)
  • Java基礎(chǔ)---第十四篇

    平時可能大家使用的最多的就是使用 String 作為 HashMap 的 key,但是現(xiàn)在我們想使用某個自定 義類作為 HashMap 的 key,那就需要注意以下幾點(diǎn): 如果類重寫了 equals 方法,它也應(yīng)該重寫 hashCode 方法。 類的所有實(shí)例需要遵循與 equals 和 hashCode 相關(guān)的規(guī)則。 如果一個類沒有使用

    2024年02月07日
    瀏覽(21)
  • 【Python入門系列】第十四篇:Python Web開發(fā)

    PythonWeb開發(fā)是使用Python語言進(jìn)行Web應(yīng)用程序開發(fā)的過程。Python是一種簡潔、易讀且功能強(qiáng)大的編程語言,因此在Web開發(fā)領(lǐng)域廣受歡迎。 PythonWeb開發(fā)可以涵蓋多個方面,包括服務(wù)器端開發(fā)、數(shù)據(jù)庫管理、前端設(shè)計(jì)和API開發(fā)等。在服務(wù)器端開發(fā)中,常用的Python Web框架有Django、F

    2024年02月16日
    瀏覽(22)
  • 二十三種設(shè)計(jì)模式第十四篇--策略模式

    二十三種設(shè)計(jì)模式第十四篇--策略模式

    策略模式:主要圍繞一個類的行為或者其算法在運(yùn)行時更改,也是一種行為型模式。 在軟件開發(fā)中,我們經(jīng)常遇到需要根據(jù)不同的情況選擇不同算法或行為的情況。傳統(tǒng)的做法是使用大量的條件語句來實(shí)現(xiàn)這種邏輯,但這樣的實(shí)現(xiàn)方式往往難以維護(hù)和擴(kuò)展。策略模式(Strat

    2024年02月12日
    瀏覽(27)
  • 【接口測試基礎(chǔ)】第十四篇 | iHRM項(xiàng)目之登錄及員工管理實(shí)戰(zhàn)

    【接口測試基礎(chǔ)】第十四篇 | iHRM項(xiàng)目之登錄及員工管理實(shí)戰(zhàn)

    簡介: 功能模塊: 技術(shù)架構(gòu): 前端:以Node.js為核心的Vue.js前端技術(shù)生態(tài)架構(gòu) 后端:SprintBoot+SprintCloud+SprintMVC+SprintData(Spring全家桶) MySQL+Redis+RabbitMQ 初始化項(xiàng)目環(huán)境 1.新建用例集 2.創(chuàng)建環(huán)境變量 3.添加斷言 4.其它接口共性分析 4.1.由于是同一個接口,因此他們的請求方法、URL、

    2024年02月02日
    瀏覽(16)
  • 用 PerfView 洞察.NET程序非托管句柄泄露

    用 PerfView 洞察.NET程序非托管句柄泄露

    1. 講故事 前幾天寫了一篇 如何洞察 .NET程序 非托管句柄泄露 的文章,文中使用 WinDbg 的 !htrace 命令實(shí)現(xiàn)了句柄泄露的洞察,在文末我也說了,WinDbg 是以侵入式的方式解決了這個問題,在生產(chǎn)環(huán)境中大多數(shù)情況下是不能走附加進(jìn)程的模式,所以這也是它最大的局限性。 那如何

    2024年02月16日
    瀏覽(18)
  • 第十四屆藍(lán)橋杯編程題部分代碼題解

    C. 冶煉金屬 最大值就是取 a / b a / b a / b 的最小值,最小值就是二分找到滿足 m i d ? ( b i + 1 ) ≥ a i mid * (b_i + 1) ≥ a_i mi d ? ( b i ? + 1 ) ≥ a i ? 的最小值 D. 飛機(jī)降落 全排列枚舉所有降落方案,然后判斷即可 E. 接龍數(shù)列 狀態(tài)定義: f [ i , j ] f[i, j] f [ i , j ] 為前 i i i 個數(shù),

    2023年04月11日
    瀏覽(25)
  • 第十四屆藍(lán)橋杯校模擬賽-編程大題詳解+代碼(二)

    第十四屆藍(lán)橋杯校模擬賽-編程大題詳解+代碼(二)

    前言: 這幾天有不少小伙伴催促我盡快更新后五道編程題題解,然鄙人實(shí)在水平有限,實(shí)事求是,能力不足,不堪眾望。思索良久,第九題有解題思路且已完成部分解題,但未完全完成,第十題尚未有思路。在此愿有大佬指點(diǎn)一二! 目錄 一、做不完的核酸 問題描述 1.1 代碼

    2024年02月02日
    瀏覽(17)
  • Java多線程&并發(fā)篇----第二十四篇

    Java多線程&并發(fā)篇----第二十四篇

    前些天發(fā)現(xiàn)了一個巨牛的人工智能學(xué)習(xí)網(wǎng)站,通俗易懂,風(fēng)趣幽默,忍不住分享一下給大家。點(diǎn)擊跳轉(zhuǎn)到網(wǎng)站,這篇文章男女通用,看懂了就去分享給你的碼吧。 采用時間片輪轉(zhuǎn)的方式??梢栽O(shè)置線程的優(yōu)先級,會映射到下層的系統(tǒng)上

    2024年01月20日
    瀏覽(23)
  • 第十四屆藍(lán)橋杯(電子類)單片機(jī)開發(fā)——賽題源代碼分享

    第十四屆藍(lán)橋杯(電子類)單片機(jī)開發(fā)——賽題源代碼分享

    ? ? ? 需要源代碼一鍵三聯(lián),私聊我哦

    2024年02月05日
    瀏覽(92)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包