第
排查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