基本信息
文件名称:排查 dotNET Core 程序内存暴涨的问题.docx
文件大小:26.44 KB
总页数:32 页
更新时间:2025-05-21
总字数:约3.53万字
文档摘要

排查dotNETCore程序内存暴涨的问题

0.问题

新版本上线之后,发现内存猛涨,入站流量猛增,不清楚具体原因,部分接口提示OOM异常,随后Pod直接崩溃无限重启。

1.准备

Pod已经接入了NewRelic和Graylog,但是仍然没有办法找到真正的罪魁祸手,此时只能进入Pod容器当中抓取内存Dump信息。我们容器的基础镜像是基于Apline-3.18的,进入容器之后执行了以下命令开始安装相应的工具。

#我们的镜像是基于runtime的,因此需要手动安装一下SDK,以便后续操作。

#这里还安装了bash,后续会使用bash进行交互操作,自带的sh不好用。

apkadddotnet6-sdkbash

#安装Dump工具

dotnettoolinstall--globaldotnet-dump

因为容器的ENTRYPOINT就是直接运行的dotNET程序,一般来说其PID都是1,如果你不清楚具体的进程ID,可以执行

尝试运行dotnet-dumpcollect-p1收集Dump信息,但是得到了以下错误:

/build#dotnet-dumpcollect-p1

Writingfullto/build/core090401

WritedumpfAIled-HRESULT:0

搜索一番之后,得知这是Pod没有足够的权限去执行Dump操作,因此修改了Rollouts(或者Deplotment)的YAML定义,添加对应的securityContext应用即可,随后便能够正确地获取Dump文件。

securityContext:

capabilities:

add:

-SYS_PTRACE

-SYS_ADMIN

seccompProfile:

type:RuntimeDefault

再次执行dotnet-dumpcollect-p1获取到了对应的Dump文件,将文件拷贝到挂载的NFS卷当中,随即下载到本地以便进行调试排查问题。

2.调查

得到Dump文件之后,我们可以使用多种工具来分析Dump文件,这里我使用的是dotnet-dump命令。因为我是macOS的机器,使用dotnet-dump我可以直接开始进行分析,你也可以使用VisualStudio、dotnetMemory、WinDBG来打开Dump的文件,具体看你的喜好了。

使用dotnetdumpanalyzedumpfilepath进入交互式页面:

Loadingcoredump:D:\dotNET_Dumps\\core142201...

Readytoprocessanalysiscommands.Typehelptolistavailablecommandsorhelp[command]togetdetailedhelponacommand.

Typequitorexittoexitthesession.

首先我们可以看一下目前GC堆的信息:

eeheap-gc

========================================

NumberofGCHeaps:3

----------------------------------------

Heap0(00007faa2a73b6b0)

generation0startsat7fa2495932e8

generation1startsat7fa2458279f0

generation2startsat7fa232703000

ephemeralsegmentallocationcontext:none

Smallobjectheap

segmentbeginallocatedcommittedallocatedsizecommittedsize

7fa2327020007fa2327030007fa249be40207fa2521740000x174e1020(390991904)0x1fa72000(531046400)

Largeobjectheapstartsat7fa3b2703000

segment