-- 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
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的分析.
具体可参考:
常见问题
-
通过DockerFile构建镜像时报错failed to solve with frontend dockerfile.v0: failed to create LLB definition
【解决方案】在DockerFile中,第一行必须是FROM XXX(并且该镜像源需要是存在的),否则就会出现上述报错
快速入门
无