docker下netcore記憶體dump

2023-03-01 21:01:23

一般開發階段可以通過visualstudio來檢查程式的記憶體 、cup等的優化問題。vs下偵錯=》效能探查器,這裡面大有千秋。

但是好多記憶體問題是經過時間積累下來才暴露出來的,在生產環境中不做不了這些操作了。

在linux裸機下面的記憶體漏失排查微軟官網是有詳細說明的,按照操作來就可以了。教學如下:

偵錯記憶體漏失教學 | Microsoft Learn

 

但是部署在docker下的程式怎麼排查呢?

這裡有一個關鍵的地方就是轉儲檔案,所有分析排查操作都是針對這個檔案來操作的。

linux裸機下面可以通過dotnet-dump collect命令來收集該檔案,docker下面其實也有createdump命令來收集這個檔案。但是前提是要給足docker許可權,執行netcore服務的時候需要帶上--privileged=true這個引數。

下面通過一個小例子演示在docker下面抓取出轉存檔案,後面的操作跟微軟官方檔案一樣,不過多贅述。

 

首先進入mytest容器內部 

 docker exec -it 03e7 bash

 

容器內部執行該命令可以看到createdump命令有沒有,如果提示沒有足夠許可權那就是執行docker服務沒有給足許可權,該帶上--privileged=true 了。

 

 find / -name createdump 

上面的find命令查詢docker內部有沒有createdump的工具,docker內部是自帶了的,如果沒有就升級一下docker版本。

遇到這個Operation not permitted命令我要回頭重啟一下服務帶上--privileged=true了,因為我中途幹了別的。

如果想檢視一下內部的pid,可以通過top命令,下面是安裝top的。。。

可以看到我們的dotnet部署的pid是1,關鍵抓取轉存檔案的命令就是執行一下 createdump  pid

/usr/share/dotnet/shared/Microsoft.NETCore.App/7.0.3/createdump 1

下面就是推出docker,把檔案拷貝到宿主機器上了,通過docker cp 待分析容器id:/tmp/coredump.1 coredump.1 拷貝檔案到我們宿主機器,ls查詢。

docker cp a59ff3a2b39e:/tmp/coredump.1 coredump.1

 

下面就是通過分析該檔案了

dotnet-dump analyze coredump.1

後面操作按照檔案一步一步的看來  偵錯記憶體漏失教學 | Microsoft Learn

到這裡算是完成了docker內抓取轉存檔案和分析的操作,但是有更方便的命令,那就是dotnet-monitor

官網的介紹和使用同樣簡單不容易看懂所以我找到了一遍手把手教學的部落格,這個同樣是對docker下面做了詳細介紹。

使用 dotnet-monitor 分析.NET 應用程式 - SpringLeee - 部落格園 (cnblogs.com)

 

總結,微軟官方檔案有好多使用的分析工具,但是不是檔案很詳細,docker下面的操作都是一筆帶過,這裡就靠各位大佬的總結,所以看著官方檔案找到自己需要解決問題的工具,再去搜尋對應的用法,還是能解決實際生產的問題。