docker下netcore記憶體dump

星仔007發表於2023-03-01

一般開發階段可以透過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下面的操作都是一筆帶過,這裡就靠各位大佬的總結,所以看著官方文件找到自己需要解決問題的工具,再去搜尋對應的用法,還是能解決實際生產的問題。

相關文章