成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

聊一聊用 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

公平鎖非公平鎖

2018-06-07 13:17:12

契約測試單元測試API測試

2023-09-22 17:36:37

2021-01-28 22:31:33

分組密碼算法

2020-05-22 08:16:07

PONGPONXG-PON

2024-10-08 09:10:03

JDK通信并發

2020-02-02 13:59:59

MySQL數據庫線程

2021-03-11 08:55:47

JavaUser對象

2020-08-12 08:34:16

開發安全We

2021-01-01 09:01:05

前端組件化設計

2022-11-26 00:00:06

裝飾者模式Component

2020-06-28 09:30:37

Linux內存操作系統

2022-10-08 11:33:56

邊緣計算云計算

2018-01-10 14:13:04

測試矩陣API測試

2019-12-17 10:06:18

CDMA高通4G

2022-03-08 16:10:38

Redis事務機制

2022-03-29 09:56:21

游戲版本運營

2020-09-08 06:54:29

Java Gradle語言
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美视频三区 | 羞羞视频在线观看网站 | 成人在线视频一区二区三区 | 国产精品久久久精品 | 99精品视频免费观看 | 久久高清| 欧美区在线 | 97精品超碰一区二区三区 | 国产视频三区 | 成人精品一区二区三区中文字幕 | 国产激情亚洲 | 欧美一区二区三区国产 | www.99精品 | 拍拍无遮挡人做人爱视频免费观看 | 天天综合网91 | 国产激情视频在线观看 | 国产激情自拍视频 | 欧美性猛交 | 男女污污网站 | 日韩欧美精品 | 国产日韩欧美精品一区二区三区 | 欧美日韩高清一区 | 男女深夜网站 | 日韩欧美在线观看视频 | 成人免费一级视频 | 亚洲精品国产成人 | 亚洲精选一区二区 | 国产日产精品一区二区三区四区 | 久久亚洲美女 | 污视频免费在线观看 | 亚洲国产成人久久综合一区,久久久国产99 | 最新国产在线 | 欧美一区二区久久 | 亚洲九九精品 | 亚洲欧美日韩在线一区二区 | 91电影| 美女三区| 欧美日韩在线一区二区 | 中文字幕av在线一二三区 | 久久精品视频12 | 国产精品精品 |