国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

聊一聊用 Dotnet-Trace 調查 Lock鎖競爭

系統 Linux
最近在分析一個 linux 上的 dump,最后的誘因是大量的lock鎖誘發的高頻上下文切換,雖然問題告一段落,但我還想知道一點信息,所謂的高頻到底有多高頻?鎖競爭到底是一個怎樣的鎖競爭?如果了解這些信息對我們后續分析此類問題非常有幫助。

一:背景

1. 講故事

最近在分析一個 linux 上的 dump,最后的誘因是大量的lock鎖誘發的高頻上下文切換,雖然問題告一段落,但我還想知道一點信息,所謂的高頻到底有多高頻?鎖競爭到底是一個怎樣的鎖競爭?如果了解這些信息對我們后續分析此類問題非常有幫助。

要想獲取此類信息,看 dump 肯定是沒有用的,只能給程序安裝一個攝像頭,在 Windows 平臺上可以在 perfview 上配一個 Microsoft-Windows-DotNETRuntime:ContentionKeyword 事件輕松搞定,截圖如下:

圖片

但 PerfView 是和 Windows 深度綁定的,那在 Linux 上怎么辦呢?對,有朋友知道用 dotnet-trace。

二:探究 dotnet-trace

1. 如何監控 lock 競爭

dotnet-trace 是 CLR 團隊寫的一個跨平臺的小工具,專門用于獲取 .NET 程序的各種事件,可以理解成 PerfView 的一個子集,這里安裝就不說了,詳見官方文檔:https://learn.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-trace

查閱文檔之后,只需要在 --clrevents 中配 contention 事件即可,詳情參見文檔:https://learn.microsoft.com/en-us/dotnet/fundamentals/diagnostics/runtime-contention-events

圖片

2. 測試案例

為了方便解讀,這里我故意造一個 鎖護送 現象,參考代碼如下:

internal class Program
    {
        public static object lockMe = new object();

        static void Main(string[] args)
        {
            long i = 10;

            Parallel.For(0, int.MaxValue, new ParallelOptions() { MaxDegreeOfParallelism = 4 }, (j) =>
            {
                lock (lockMe) i++; lock (lockMe) i++; lock (lockMe) i++; lock (lockMe) i++;
                lock (lockMe) i++; lock (lockMe) i++; lock (lockMe) i++; lock (lockMe) i++;
                lock (lockMe) i++; lock (lockMe) i++; lock (lockMe) i++; lock (lockMe) i++;
                lock (lockMe) i++; lock (lockMe) i++; lock (lockMe) i++; lock (lockMe) i++;
                lock (lockMe) i++; lock (lockMe) i++; lock (lockMe) i++; lock (lockMe) i++;
                lock (lockMe) i++; lock (lockMe) i++; lock (lockMe) i++; lock (lockMe) i++;
                lock (lockMe) i++; lock (lockMe) i++; lock (lockMe) i++; lock (lockMe) i++;
                lock (lockMe) i++; lock (lockMe) i++; lock (lockMe) i++; lock (lockMe) i++;
                lock (lockMe) i++; lock (lockMe) i++; lock (lockMe) i++; lock (lockMe) i++;
                lock (lockMe) i++; lock (lockMe) i++; lock (lockMe) i++; lock (lockMe) i++;
                lock (lockMe) i++; lock (lockMe) i++; lock (lockMe) i++; lock (lockMe) i++;
                lock (lockMe) i++; lock (lockMe) i++; lock (lockMe) i++; lock (lockMe) i++;
                lock (lockMe) i++; lock (lockMe) i++; lock (lockMe) i++; lock (lockMe) i++;
                lock (lockMe) i++; lock (lockMe) i++; lock (lockMe) i++; lock (lockMe) i++;
                lock (lockMe) i++; lock (lockMe) i++; lock (lockMe) i++; lock (lockMe) i++;
                lock (lockMe) i++; lock (lockMe) i++; lock (lockMe) i++; lock (lockMe) i++;
                lock (lockMe) i++; lock (lockMe) i++; lock (lockMe) i++; lock (lockMe) i++;
                lock (lockMe) i++; lock (lockMe) i++; lock (lockMe) i++; lock (lockMe) i++;
                lock (lockMe) i++; lock (lockMe) i++; lock (lockMe) i++; lock (lockMe) i++;
                lock (lockMe) i++; lock (lockMe) i++; lock (lockMe) i++; lock (lockMe) i++;
            });
        }
    }

將程序跑起來后,使用 dotnet-trace ps 找到 PID,再用 dotnet-trace 進行跟蹤,這里持續跟蹤 1分鐘。

[root@localhost ~]# dotnet-trace ps
 3316  dotnet  /usr/share/dotnet/dotnet  dotnet ConsoleApp3.dll  

[root@localhost ~]# dotnet-trace collect -p 3316 --clrevents contention --duration 00:00:01:00

Provider Name                           Keywords            Level               Enabled By
Microsoft-Windows-DotNETRuntime         0x0000000000004000  Informational(4)    --clrevents

Process        : /usr/share/dotnet/dotnet
Output File    : /root/dotnet_20230509_105906.nettrace
Trace Duration : 00:00:01:00
[00:00:01:00] Recording trace 29.7885  (MB)
Press <Enter> or <Ctrl+C> to exit...148  (MB)
Stopping the trace. This may take several minutes depending on the application being traced.

Trace completed.

[root@localhost ~]# ls

anaconda-ks.cfg  dotnet_20230509_105906.nettrace  Music     Templates
Desktop          Downloads                        Pictures  Videos
Documents        initial-setup-ks.cfg             Public

3. nettrace 文件分析

至于分析 dotnet_20230509_105906.nettrace 的工具就特別多了,dotnet-trace,perf,perfview,visualstudio,不過我個人建議還是使用 prefview,因為它的洞察能力會更好,用 perfview 打開之后點擊 EventStats 觀察統計信息:

圖片

從圖中可以看到 1min 的時間內生成了總計將近 200w 的 start 和 stop 事件。

有了統計信息還不行,我還想知道每一次 start 的詳細信息,可以點擊 perfview 中的 Events 面板中的 Microsoft-Windows-DotNETRuntime/Contention/Start 事件,可以看到記錄中每一次爭搶的開始時間。

圖片

有些朋友可能要問了,Start 和 Stop 到底代表什么意思,簡而言之就是爭搶的開始時間和結束時間,時間差就是排隊時間,截圖如下:

圖片

從圖中可以看到,某些競爭鎖的時候耗費了 1ms 的時間,同時得到調度的線程也不是串行的,比如 4232 號線程就得到了兩次連續執行。

接下來回答最后一個問題,除了看到每一次lock競爭的詳細信息,能不能看到每一次 lock 時的代碼調用棧呢?當然是可以的,畢竟 HasStack="True" ThreadID="3,316" ProcessorNumber="0" Cnotallow="Managed" ClrInstanceID="0" 中的 HasStack="True" 就是告訴當前是有調用棧信息的,在 Time MSec 列點擊右鍵選擇 Open Any Stacks。

圖片

從圖中的線程棧可以看到,Start 事件是由 Main 方法中的 Parallel.For 誘發的,非常清楚。

三:總結

dotnet-trace 是一個非常強大的跨平臺性能分析工具,構建在 EventPipe 之上,特點就是跨平臺,除了對鎖競爭外,還有其他的各種有趣的事件,有興趣的朋友可以查閱查閱。

責任編輯:武曉燕 來源: 一線碼農聊技術
相關推薦

2022-02-21 15:01:45

MySQL共享鎖獨占鎖

2019-12-12 14:52:10

數據庫腳本

2023-10-07 08:17:40

公平鎖非公平鎖

2023-09-22 17:36:37

2020-05-22 08:16:07

PONGPONXG-PON

2021-01-28 22:31:33

分組密碼算法

2024-10-08 09:10:03

JDK通信并發

2018-06-07 13:17:12

契約測試單元測試API測試

2020-02-02 13:59:59

MySQL數據庫線程

2021-03-11 08:55:47

JavaUser對象

2022-11-01 08:46:20

責任鏈模式對象

2021-01-29 08:32:21

數據結構數組

2023-05-15 08:38:58

模板方法模式

2021-08-04 09:32:05

Typescript 技巧Partial

2018-11-29 09:13:47

CPU中斷控制器

2022-08-08 08:25:21

Javajar 文件

2019-02-13 14:15:59

Linux版本Fedora

2021-02-06 08:34:49

函數memoize文檔

2020-10-15 06:56:51

MySQL排序

2023-07-06 13:56:14

微軟Skype
點贊
收藏

51CTO技術棧公眾號

97国产精品videossex| 国产极品一区| 91社在线播放| 国产精品jizz视频| 91久久精品国产| 国产狼人综合免费视频| 97久久精品国产| 在线亚洲欧美视频| 欧美sm极限捆绑bd| 亚洲欧美日韩精品久久| 日韩免费在线视频| 亚洲成人18| 国产特级嫩嫩嫩bbb| 亚洲区欧洲区| 久久99国产精品视频| 国产尤物一区二区| 精品久久香蕉国产线看观看亚洲| 亚洲精品视频免费| 奇米精品在线| 影音先锋导航| 国模大尺度视频一区二区| www.久久精品| 一区二区三区精密机械公司| 国产成人午夜视频| 日产国产高清一区二区三区| 9色国产精品| 亚洲成aⅴ人片久久青草影院| 婷婷综合一区| 希岛爱理一区二区三区| 国产日韩欧美| 日本v片在线高清不卡在线观看| 久久众筹精品私拍模特| 永久免费精品影视网站| 亚洲免费一在线| 在线视频精品一| 国产精品视频中文字幕91| 96精品久久久久中文字幕| 蜜桃传媒一区二区| 亚洲春色在线| 一二三四社区在线视频6| 成人影院入口| 欧美一二区在线观看| 精品91久久久久| 久久久精品黄色| 一本色道久久88综合亚洲精品ⅰ| 国产精品久久精品视| 久久精品网站视频| 久久九九热re6这里有精品| 蜜桃视频在线一区| 亚洲永久免费av| 国产精品美女久久| 欧美黑人孕妇孕交| 免费视频国产一区| 日韩欧美亚洲成人| 99国产视频在线| 超碰在线免费播放| 秋霞国产午夜精品免费视频| 亚洲一区二区欧美| 97在线视频精品| 亚洲理论电影在线观看| av在线一区不卡| 亚洲美女一区二区三区| 欧美一区二区大胆人体摄影专业网站| 香蕉视频禁止18| 亚洲一区二区av| 国产mv日韩mv欧美| 午夜精品福利在线观看| www.1024| 成久久久网站| 欧美日韩一区二区精品| 国内精品小视频| 美国成人av| 国产亚洲福利| 欧美成人精品不卡视频在线观看| 中文字幕电影在线| 国产**成人网毛片九色| 国产精品亚洲精品| mm1313亚洲国产精品美女| 久久久精品影视| 欧美日韩在线高清| 亚洲大片精品免费| 5566中文字幕一区二区电影| 久久久久se| 好吊妞国产欧美日韩免费观看网站 | 亚洲国产欧美另类丝袜| 亚洲制服欧美久久| 亚洲成aⅴ人片久久青草影院| 欧美一级欧美三级| 蜜桃一级网站.| 成人av在线电影| 精品在线观看一区二区| 狠狠一区二区三区| 亚洲精品日韩丝袜精品| 日韩欧美一区二区三区在线| 婷婷中文字幕一区三区| 亚洲精品在线视频观看| 精品日韩免费| 少妇高潮久久久久久潘金莲| 中文字幕av资源一区| 国产精品高清亚洲| 免费视频爱爱太爽了| 国产91丝袜在线播放0| 青青视频免费在线观看| 国产精品夜夜嗨| 国产一区二区在线视频播放| 成人a区在线观看| 男女视频在线看| 一区2区3区在线看| 日本不卡在线| 亚洲视频999| 欧美日韩激情| 亚洲欧美一区二区原创| 久久久久久97三级| 色视频在线观看免费| 欧美电影影音先锋| 日韩成人在线一区| 日韩在线www| 99成人在线视频| 免费成人深夜夜行网站视频| wwwwww.欧美系列| 屁屁影院在线观看| 亚洲精品一区久久久久久| 黄色在线观看www| 欧美日韩成人在线观看| 欧美日韩久久精品| 欧美高清中文字幕| 亚洲欧洲av另类| 日本伦理一区二区| 国产精品高清网站| 国产va免费精品观看精品视频| 一本色道久久88综合日韩精品| xxx.xxx欧美| 亚洲欧美另类在线观看| 国产精品4hu.www| 日韩成人在线视频观看| а√在线中文在线新版| 亚洲欧洲在线播放| 中文不卡1区2区3区| 亚洲国产高潮在线观看| 日韩影片在线观看| 91网站在线看| 日韩在线一区二区三区| 热re91久久精品国99热蜜臀| 亚州av乱码久久精品蜜桃| 国产精品国三级国产av| 欧美日韩国产黄| 国产视频一区二区在线播放| 国产精品自拍首页| 亚洲妇女屁股眼交7| 神马电影网我不卡| 久久婷婷开心| 亚洲第一久久影院| 理论片鲁丝二区爱情网| 欧美一区二区观看视频| 欧美国产激情| 亚洲精品一区二区| 日韩av一区在线观看| 日韩五码在线| 密臀av一区二区三区| 日韩电视剧免费观看网站| 林ゆな中文字幕一区二区| 国产精品免费一区豆花| 国产精品普通话对白| 两个人看的免费完整在线观看| 亚洲国产精品成人av| 欧美成人午夜77777| 久久国产亚洲精品无码| 欧美综合亚洲图片综合区| 日韩成人在线观看视频| 欧美视频观看一区| 日本道精品一区二区三区| 国产精品久久久久久久久男 | 欧洲精品99毛片免费高清观看| 日韩精品一区二区三区色偷偷| 欧美性高清videossexo| 欧美三级免费| 福利视频在线| 一区二区不卡在线视频 午夜欧美不卡'| 欧美日韩一二区| 91tv精品福利国产在线观看| av最新地址| 久久视频在线免费观看| 国产欧美在线观看一区| 在线观看涩涩| 国产超级av在线| 欧美大肥婆大肥bbbbb| 国产不卡免费视频| 欧美精品影院| 日韩电影在线免费观看| 538在线视频观看| 欧美激情第1页| 亚洲激情网站免费观看| 国产精品自在| 免费女人黄页| www.亚洲成人| 奇米影视一区二区三区小说| 国产69精品久久久久9999人| xxx国产在线观看| 亚洲精品中文字| 久久精品卡一|