PerfView專題 (第一篇): 如何尋找熱點函數

一:背景

準備開個系列來聊一下 PerfView 這款工具,熟悉我的朋友都知道我喜歡用 WinDbg,這東西雖然很牛,但也不是萬能的,也有一些場景他解決不了或者很難解決,這時候借助一些其他的工具來輔助,是一個很不錯的主意。

很多朋友喜歡在項目中以記錄日志的方式來監控項目的流轉情況,其實 CoreCLR 也是這樣的,參考如下代碼:

void?gc_heap::fix_allocation_context?(alloc_context*?acontext,?BOOL?for_gc_p,BOOL?record_ac_p)
{dprintf?(3,?("Fixing?allocation?context?%Ix:?ptr:?%Ix,?limit:?%Ix",(size_t)acontext,(size_t)acontext->alloc_ptr,?(size_t)acontext->alloc_limit));
}void?gc_heap::background_sweep()
{//concurrent_print_time_delta?("finished?with?mark?and?start?with?sweep");concurrent_print_time_delta?("Sw");dprintf?(2,?("----?(GC%d)Background?Sweep?Phase?----",?VolatileLoad(&settings.gc_index)));//block?concurrent?allocation?for?large?objectsdprintf?(3,?("lh?state:?planning"));
}void?gc_heap::background_ephemeral_sweep()
{dprintf?(3,?("bgc?ephemeral?sweep"));
}

那這些日志會送到哪里去呢,當然是 Windows 的 ETW 了,那有什么工具可以方便提取呢?PerfView 就是這么其中一款。

這一篇我們做一個 CPU 爆高的場景下如何尋找 熱點函數 的例子,看看如何用 PerfView 去挖。

二:PerfView 尋找熱點函數

很多場景下的 CPU 高,是因為某個或者某幾個線程在高頻的執行某個方法,有可能是死循環,有可能是陷入了CPU密集型方法內,解決這個問題一個好的思路就是對 CPU 進行采樣,比如我的 12 核電腦。

0:000>?!cpuid
CP??F/M/S??Manufacturer?????MHz0??6,5,2??????????????????25921??6,5,2??????????????????25922??6,5,2??????????????????25923??6,5,2??????????????????25924??6,5,2??????????????????25925??6,5,2??????????????????25926??6,5,2??????????????????25927??6,5,2??????????????????25928??6,5,2??????????????????25929??6,5,2??????????????????2592
10??6,5,2??????????????????2592
11??6,5,2??????????????????2592

1. 如何采樣

采樣的原理就是周期性的去看下當前的 CPU 核中運行的幾個線程正在執行什么方法, 當采樣到了幾萬個或者幾十萬個樣本之后,就可以對這些采集到的方法進行分組排序來找到 topN,那些 TopN 的方法自然就是導致 CPU 爆高可能的誘因。

windbg 有一個 !running 命令可以用來顯示當前處理器中正在運行的線程。

lkd>?!runningSystem?Processors:??(0000000000000fff)Idle?Processors:??(000000000000065e)Prcbs?????????????Current?????????(pri)?Next????????????(pri)?Idle0????fffff80268a33180??ffffaf8ec9bd8080?(15)???????????????????????fffff8026b526600??................5????ffffd900e1700180??ffffaf8eca36b080?(?8)???????????????????????ffffd900e170b340??................7????ffffd900e1900180??ffffaf8ec2f18080?(?8)???????????????????????ffffd900e190b340??................8????ffffd900e1a00180??ffffd900e1a0b340?(?0)???????????????????????ffffd900e1a0b340??................11????ffffd900e1d00180??ffffaf8eb6bee080?(?8)???????????????????????ffffd900e1d0b340??................

接下來寫一個程序,讓其中一個線程無限循環,然后通過 PerfView 去找這個熱點。

internal?class?Program{static?void?Main(string[]?args){Task.Run(()?=>?Test1());????//Test1?故意死循環Task.Run(()?=>?Test2());????//Test2?是一個正常函數Console.WriteLine("我是主線程!");Console.ReadLine();}static?void?Test1(){var?i?=?10;var?b?=?true;while?(i?>?0){b?=?!b;}}static?void?Test2(){for?(int?i?=?0;?i?<?10000;?i++){var?j?=?string.Join(",",?Enumerable.Range(0,?100));}Console.WriteLine("Test執行結束");}}

2. 使用 PerfView 采樣

點擊菜單中的 Collect -> Collect ,彈出如下面板。

9e221356a1b07acd15ed4da6c76fde76.png

在這個面板中,選中如下幾項。

1)CPU Samples:

設置對 CPU 進行采樣。

2)CPU Sample Interval Msec

設置采樣的頻次是 1ms/次。

3)Max Collect Sec

設置總共采樣多少秒,這里設置為 15 秒。

4).NET Symbol Collection

用來從微軟符號服務器上拉取符號,和采樣無關哈。

上面都設置完畢后,就可以點擊 Start Collection 采集了,不出意外的話,15s 之后你就會看到如下的截圖。

9b6021832780c235f033e5cf019a4bc9.png

接下來點擊 CPU Stacks,在彈出的面板中選中我們的 程序,雙擊之后就可以打開如下面板。

8bb5a20faea24be515b9913db5f616c4.png

從圖中可以看到,當前采樣了 15622 個樣本,符合 15 * 1000 ,接下來把上面的 GroupPats 默認分組給清掉,截圖如下:

80af6ad6e5f3413d571dadc69a9c2eea.png

從圖中可以看到當前 Test1() 方法在 15622 個樣本中占比 97.9%,命中次數高達 15290 次,很明顯這是一個絕對的 熱點函數,接下來就是翻源碼為什么 Test1 這么高頻?

如果你想看雞肋的 火焰圖,可以點擊 Flame Graph 列表項。

47cb9cc6ff0428cf05e381ecb713ac66.png

好了,本篇就先聊這么多吧。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/283783.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/283783.shtml
英文地址,請注明出處:http://en.pswp.cn/news/283783.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

3四則運算軟件2016011992

使用JAVA編程語言&#xff0c;獨立完成一個3到5個運算符的四則運算練習的命令行軟件開發 基本功能要求&#xff1a; 程序可接收一個輸入參數n&#xff0c;然后隨機產生n道加減乘除&#xff08;分別使用符號-*來表示&#xff09;練習題&#xff0c;每個數字在 0 和 100 之間…

JAVA高并發多線程必須懂的50個問題

下面是Java線程相關的熱門面試題&#xff0c;你可以用它來好好準備面試。 1) 什么是線程&#xff1f; 線程是操作系統能夠進行運算調度的最小單位&#xff0c;它被包含在進程之中&#xff0c;是進程中的實際運作單位。程序員可以通過它進行多處理器編程&#xff0c;你可以使用…

Centos7設置IP為固定值

1.進入到系統的IP地址保存文件所在目錄 [rootlocalhost ~]# cd /etc/sysconfig/network-scripts 2.修改保存IP信息的文件 [rootlocalhost ~]# vim ifcfg-eth0 &#xff08;你機器上的名字有可能不是這個&#xff0c;但是是以ifcfg-eth開頭的文件&#xff09; 保存后退出 3.重啟…

為 EditorConfig 文件開啟錯誤編譯失敗

前言上次&#xff0c;我們介紹了 EditorConfig 文件可以自定義代碼樣式規則。但是&#xff0c;當我們想設置代碼樣式嚴重性&#xff0c;比如不允許編譯成功時&#xff0c;又踩了不少坑。修改無效想把 var 首選項&#xff0c;從“首選"var" 僅重構”&#xff0c;改成“…

【.NET特供-第三季】ASP.NET MVC系列:傳統WebForm站點和MVC站點執行機制對照

本文以圖形化的方式&#xff0c;從‘執行機制’方面對照傳統WebForm站點和MVC站點。請參看下面圖形&#xff1a; 一、執行機制 當我們訪問一個站點的時候&#xff0c;瀏覽器和server都是做了哪些動作呢&#xff1f; &#xff08;本文僅僅是提供一個簡單的執行過程&#xff0c;有…

hdoj1045 Fire Net(二分圖最大匹配)

題意&#xff1a;給出一個圖&#xff0c;其中有 . 和 X 兩種&#xff0c;. 為通路&#xff0c;X表示墻&#xff0c;在其中放炸彈&#xff0c;然后炸彈不能穿過墻&#xff0c;問你最多在圖中可以放多少個炸彈&#xff1f; 這個題建圖有點復雜orz。 建圖&#xff0c;首先把每一行…

c++的命名空間

一.C的命名原則namespace是指標識符的各種可見范圍&#xff0c;c的所有標識符都被定義在一個名為std的namespace中。1.<iostream>和<iostream.h>是兩個不同的文件&#xff0c;后綴為.h的頭文件c標準已經明確提出不支持了&#xff0c;早些的實現將標準庫功能定義在全…

投阿里被拒,說跳槽太頻繁!三年兩個工作,問題真的那么大嗎?

什么樣的跳槽頻率才不算頻繁&#xff1f;一位網友發問&#xff1a;投阿里被拒&#xff0c;理由是跳槽太頻繁&#xff0c;不合適。三年兩個工作&#xff0c;問題真的那么大嗎&#xff1f;網友說&#xff0c;阿里對穩定性要求非常高&#xff0c;三年兩跳和五年三跳都是紅線&#…

Linux下防御DDOS攻擊的操作梳理

DDOS的全稱是Distributed Denial of Service&#xff0c;即"分布式拒絕服務攻擊"&#xff0c;是指擊者利用大量“肉雞”對攻擊目標發動大量的正常或非正常請求、耗盡目標主機資源或網絡資源&#xff0c;從而使被攻擊的主機不能為合法用戶提供服務。 DDOS攻擊的本質是…

為什么信息化 ≠ 數字化?終于有人講明白了

作者&#xff1a;石秀峰 來源&#xff1a;談數據&#xff08;ID&#xff1a;learning-bigdata&#xff09; 近期&#xff0c;我一做數字化咨詢的朋友&#xff08;化名老王&#xff09;遇到了一個頭痛的問題&#xff1a;話說老王的團隊近期接了一個大單——一大型制造業的數字化…

JAVA代碼—算法基礎:數獨問題(Sodoku Puzzles)

JAVA代碼—算法基礎&#xff1a;數獨問題&#xff08;Sodoku Puzzles&#xff09; 數獨問題&#xff08;Sodoku Puzzles&#xff09; 數獨游戲&#xff08;日語&#xff1a;數獨 すうどく&#xff09;是一種源自18世紀末的瑞士的游戲&#xff0c;后在美國發展、并在日本得以發揚…

Linux系統恢復

實驗目的&#xff1a;熟悉了前面的啟動流程&#xff0c;系統的一個大致的啟動流程是怎樣的&#xff0c;而其中牽扯到了些許文件&#xff0c;這些文件在系統啟動時用于銜接各個步驟&#xff0c;如果這些文件損壞或缺失&#xff0c;系統將不能正常啟動&#xff0c;這次寫的內容就…

PerfView專題 (第二篇):如何尋找 C# 中的 Heap堆內存泄漏

一&#xff1a;背景 上一篇我們聊到了如何去找 熱點函數&#xff0c;這一篇我們來看下當你的程序出現了 非托管內存泄漏 時如何去尋找可疑的代碼源頭&#xff0c;其實思路很簡單&#xff0c;就是在 HeapAlloc 或者 VirtualAlloc 時做 Hook 攔截&#xff0c;記錄它的調用棧以及分…

關于 extern C的說明

在用C的項目源碼中&#xff0c;經常會不可避免的會看到下面的代碼 1 #ifdef __cplusplus 2 extern "C" { 3 #endif 4 5 /*...*/ 6 7 #ifdef __cplusplus 8 } 9 #endif 它到底有什么用呢&#xff0c;你知道嗎&#xff1f;而且這樣的問題經常會出現在面試or筆試…

Nginx 面試 40 問

Nginx是一款輕量級的Web服務器、反向代理服務器&#xff0c;由于它的內存占用少&#xff0c;啟動極快&#xff0c;高并發能力強&#xff0c;在互聯網項目中廣泛應用。 那么關于 Nginx 的核心技術點有哪些呢&#xff1f; 什么是Nginx&#xff1f; Nginx是一個 輕量級/高性能的…

用Cocos2dx開發棋牌游戲的觀點解析

眾所周知&#xff0c;目前棋牌游戲特別的火。很多游戲公司都想在這一塊賺錢&#xff0c;可是卻不知用什么軟件比較好的去開發棋牌游戲&#xff0c;對此&#xff0c;我列出了兩款比較靠譜的軟件去開發棋牌游戲&#xff0c;希望對大家有幫助&#xff01; 第一款軟件是cocos2dx,它…

JavaWEB中讀取配置信息

第一種方法是使用java.io和java.util包&#xff0c;缺點是路徑的概念要清晰&#xff0c;例子&#xff1a; Properties prop new Properties();InputStream in getClass().getResourceAsStream("/common.properties");try {prop.load(in);pool new JedisPool(config…

我把《系統設計》系列整理成了 PDF

大家好&#xff0c;我是等天黑。相信很多朋友應該注意到了&#xff0c;我最近發了很多系統設計的文章。是的&#xff0c;到目前為止&#xff0c;已經發了有 7 篇文章。這些內容主要翻譯自 Alex Xu 的 《System Design Interview》&#xff0c;有卷一和卷二兩本。System Design …

高性能IO模型淺析

服務器端編程經常需要構造高性能的IO模型&#xff0c;常見的IO模型有四種&#xff1a; &#xff08;1&#xff09;同步阻塞IO&#xff08;Blocking IO&#xff09;&#xff1a;即傳統的IO模型。 &#xff08;2&#xff09;同步非阻塞IO&#xff08;Non-blocking IO&#xff09;…

Java線程通信的幾種方式

一、問題 有兩個線程&#xff0c;A 線程向一個集合里面依次添加元素“abc”字符串&#xff0c;一共添加十次&#xff0c;當添加到第五次的時候&#xff0c;希望 B 線程能夠收到 A 線程的通知&#xff0c;然后 B 線程執行相關的業務操作。線程間通信的模型有兩種&#xff1a;共享…