桃花岛主 lv-3

docker镜像中安装dotMemory对容器中应用的内存dump进行分析(泄露,不释放等)

-- docker镜像中安装dotMemory对容器中应用的内存dump进行分析(泄露,不释放等)--持久更新
【官网】:https://www.jetbrains.com/help/dotmemory/Working_with_dotMemory_Command-Line_Profiler.html

应用场景

使用dotMemory分析docker容器中应用的内存占用dump,进而帮助发现内存占用异常,泄露,不释放等问题点,并指导优化修复方案.注意,该工具以.zip 存档或 NuGet 包(Windows、Linux、macOS)的形式免费分发,并且不需要安装 dotMemory。 您可以将其自由上传到任何计算机,以拍摄有问题的应用程序的内存快照。要分析收集的快照,您将需要 JetBrains dotMemory 的独立版本.

基础资源

dotMemory分析

使用须知

在生产环境使用dotMemory需要特别谨慎,因为使用方式不对可能会对生产上的应用带来降低响应速度,甚至是停止应用。建议在测试环境运行,如果一定要生产环境,应该是附加并分析现有应用,而不是直接从dotMemory启动应用。

配置步骤

[注】如果对如何在docker中运行.net core应用,请看这里:win10+wsl2+docker desktop实现asp.net core在 docker中运行

Step1)在dockerfile中添加dotMemory采集工具的下载安装脚本.

注:

请注意,该工具以.zip 存档或 NuGet 包(Windows、Linux、macOS)的形式免费分发,并且不需要安装 dotMemory。

您可以将其自由上传到任何计算机,以拍摄有问题的应用程序的内存快照。要分析收集的快照,您将需要 JetBrains dotMemory 的独立版本。


附dockerfile的内容

#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.
FROM mcr.microsoft.com/dotnet/aspnet:3.1 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:3.1 AS build
WORKDIR /src
COPY ["WLab.WebApi/WLab.WebApi.csproj", "WLab.WebApi/"]
RUN dotnet restore "WLab.WebApi/WLab.WebApi.csproj"
#拷贝所有文件
COPY . .
WORKDIR "/src/WLab.WebApi"
RUN dotnet build "WLab.WebApi.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "WLab.WebApi.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .

#部署dotmemory 命令行工具
#docker 容器内的路径文件夹
WORKDIR /dotmemory/bin

RUN apt-get update -y && apt-get install -y wget && \
wget -O dotMemoryclt.zip https://www.nuget.org/api/v2/package/JetBrains.dotMemory.Console.linux-x64/2021.3.2 && \
apt-get install -y unzip && \
unzip dotMemoryclt.zip -d ./dotMemoryclt && \
chmod +x -R dotMemoryclt/*

#回到原目录
WORKDIR /app

ENTRYPOINT ["dotnet", "WLab.WebApi.dll"]


step2)构建相关的镜像(一个asp.net core webapi的应用,外加一个dotMemory dump采集工具).

docker build -f WLab.WebApi/Dockerfile -t wlab-docker-api .       //注:运行的工作目录是解决方案目录下,dockerfile文件再项目目录下,后面的点也是必须的.




step3)运行相关的容器.


docker run --name wlab-docker-api -it -p 5000:80 wlab-docker-api --privileged=true


[注]--privileged=true是增加一个超级权限,也可以不要.


step4)运行dotMemory命令行,获取正在应用的dump.


附脚本:

[email protected]:~# docker ps
CONTAINER ID   IMAGE             COMMAND                  CREATED          STATUS          PORTS                           NAMES
3b1d1a985d07   wlab-docker-api   "dotnet WLab.WebApi.бн"   41 minutes ago   Up 41 minutes   443/tcp, 0.0.0.0:5000->80/tcp   wlab-docker-api
[email protected]:~# ps -elf
F S UID        PID  PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD
4 S root         1     0  0  80   0 -   260 -      Dec17 ?        00:00:15 /init
5 S root       124     1  0  80   0 -   224 -      Dec17 ?        00:00:00 /init
1 S root       125   124  0  80   0 -   224 x64_sy Dec17 ?        00:00:00 /init
4 S root       126   125  0  80   0 - 422246 futex_ Dec17 pts/0   00:00:03 /mnt/wsl/docker-desktop/docker-desktop-user-distro proxy --distro-name Ubuntu --docker-desktop-r
1 Z root       139   124  0  80   0 -     0 -      Dec17 ?        00:00:00 [init] <defunct>
5 S root      1070     1  0  80   0 -   260 -      12:59 ?        00:00:00 /init
1 R root      1071  1070  0  80   0 -   260 -      12:59 ?        00:00:00 /init
4 S root      1072  1071  0  80   0 -  2508 do_wai 12:59 pts/1    00:00:00 -bash
0 R root      1171  1072  0  80   0 -  2655 -      13:35 pts/1    00:00:00 ps -elf
[email protected]:~# docker exec -it 3b1d1a985d07 /bin/bash

#进入dockerfile中指定的dotMemory的命令行安装目录.
[email protected]:/app# cd /dotmemory/bin/dotMemoryclt/tools
[email protected]:/dotmemory/bin/dotMemoryclt/tools# ./dotMemory.sh get-snapshot 1072  --save-to-dir=Snapshots
dotMemory.sh is deprecated and will soon be removed: Use the dotmemory command instead.
Performs memory profiling of .NET applications

Unable to attach to the process #1072: Make sure it exists and it is a .NET Core 3.0+/.NET 5+ process.

#默认1是根进程id,也是容器的主进程
[email protected]:/dotmemory/bin/dotMemoryclt/tools# ./dotMemory.sh get-snapshot 1  --save-to-dir=Snapshots
dotMemory.sh is deprecated and will soon be removed: Use the dotmemory command instead.
Performs memory profiling of .NET applications

Found 1 process(es):
  [1] dotnet

Attaching to [1] dotnet runtime...
Profiler connected. PID:1, Core CLR runtime v3.1.0.0
  ATTACHED. Getting snapshot...
  [PID:1] SNAPSHOT #1 SAVED.
  [PID:1] Processing snapshot #1... (this might take a few minutes)
  [PID:1] SNAPSHOT #1 READY.
Profiler disconnected. PID:1

Saving workspace...
WORKSPACE SAVED
file:///dotmemory/bin/dotMemoryclt/tools/Snapshots/[1]-dotnet.2022-12-18T05-36-18.499.dmw


step5)将dump文件从docker容器拷贝到宿主ubuntu的目录下.



附脚本:

[email protected]:~# docker cp 3b1d1a985d07:/dotmemory/bin/dotMemoryclt/tools/Snapshots/[1]-dotnet.2022-12-18T05-36-18.499.dmw /opt/dotmemory/
[email protected]:~#



step6)开始dotMemory对内容dump的分析.

具体可参考: 

Get Started with dotMemory




常见问题

  • 通过DockerFile构建镜像时报错failed to solve with frontend dockerfile.v0: failed to create LLB definition
    【解决方案】在DockerFile中,第一行必须是FROM XXX(并且该镜像源需要是存在的),否则就会出现上述报错

快速入门

参考资料