【.Net Core】分析.net core在linux下内存占用过高问题
现象
随着程序运行,内存占用率越来越高,直到触发linux的OOM,程序被杀死。
分析工具
运行环境:.net core 3.1(微软的分析工具要求最低3.0,无法分析2.1的core程序,需要先改为core 3.1才能分析)
linux:ubuntu 18
分析工具:dotnet-counters, dotnet-dump
工具的安装见:https://docs.microsoft.com/zh-cn/dotnet/core/diagnostics/dotnet-counters
分析过程
1,获取要分析进程的pid
使用top或者ps等等工具,获取程序的pid
对于docker环境,如果没有安装top命令,可以使用如下安装
apt-get install procps
2,查看内存使用情况(我这里pid为13156)
dotnet-counters monitor -p 13156

从结果来看,GC中的Gen2占用了较多的内存,理论上,不应该有很多的Gen2,我们需要分析一下Gen2里面到底是什么?
Gen0,Gen1,Gen2以及LOH的区别,以及.net core内存管理机制,见:
https://docs.microsoft.com/en-us/aspnet/core/performance/memory?view=aspnetcore-5.0
3,获取进程的dump文件
dotnet-dump collect -p 13156
说明:要使用这条命令获取dump,如果在docker中,需要提供docker的--private参数,如果是在AWS的ECS中使用的Fargate模式运行,则不支持此参数。需要在EC2上运行。
此命令会在当前目录生成一个dump文件
4,分析dump文件
dotnet-dump analyze core_20210510_054712
# 分析gen2中的内容,每个命令的参数以及和含义,可以使用help查看
dg gen2

从结果来看,有很多string类型的数据在gen2中,以及mysql的一些数据,我们打开看看具体是什么内容

看输出,有很多一样的内容,我们随便打开一个看看

可以看到内容就是数据库的返回数据

同样的方法,我们看看哪些string里面都是什么

有非常多的对象,我们也是随便打开一个看看内容

看着像是web的打印

总结
获取dump文件
dotnet-dump collect <pid>
分析dump文件
dotnet-analyze xxxxx
获取gen2或者其他的内存数据
dg gen2 | gen1 | gen1 | genloh
查看内存数据类型
dumpheap -mt xxxxxx
查看内存数据的具体内容
do xxxxxx
通过具体内容,配合开发人员定位代码问题
【.Net Core】分析.net core在linux下内存占用过高问题的更多相关文章
- Linux下内存占用和CPU占用的计算
->使用free命令查看内存使用情况: 1.echo 3 > /proc/sys/vm/drop_caches 2.free 或者使用cat /proc/yourpid/status 来查 ...
- linux服务器内存占用太高-释放内存
修改/proc/sys/vm/drop_caches,释放Slab占用的cache内存空间(参考drop_caches的官方文档): Writing to this will cause the ke ...
- Linux(Centos)内存占用过高处理
查看内存占用最大 ps aux| grep -v "USER" |sort -n -r -k 4 |awk 'NR==1{ print $0}' 命令查看占用内存最大的10个进程 ...
- 【调试】Core Dump是什么?Linux下如何正确永久开启?
[调试]Core Dump是什么?Linux下如何正确永久开启?
- 大并发连接的oracle在Linux下内存不足的问题的分析
大并发连接的oracle在Linux下内存不足的问题的分析 2010-01-28 20:06:21 分类: Oracle 最近一台装有Rhel5.3的40G内存的机器上有一个oracle数据库,数据库 ...
- linux 下 取进程占用内存(MEM)最高的前10个进程
# linux 下 取进程占用 cpu 最高的前10个进程ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head # linux 下 取进程占用内存 ...
- linux下磁盘占用达到100%了,找不到哪些大文件耗尽了磁盘
Linux下的根分区使用率100%,但是查看/分区下的目录都不大,没有占用满,这该怎么处理? 重启是肯定有效的,目前处理情况:重新restart应用后,空间释放出来 1.lsof | grep del ...
- Linux下内存查看命令
在Linux下面,我们常用top命令来查看系统进程,top也能显示系统内存.我们常用的Linux下查看内容的专用工具是free命令. Linux下内存查看命令free详解: 在Linux下查看内存我们 ...
- Linux下内存映射文件的用法简介
由于项目需要,所以学习了一下Linux下内存映射文件的用法,在这里共享一下自己的收获,希望大家提出宝贵意见,进行交流. 简介: 内存映射文件与虚拟内存有些类似,通过内存映射文件可以保留一个地址空间的区 ...
随机推荐
- certutil绕过
一般进内网过后我都会使用certutil下载文件,但在最近打一台内网机子的时候出现了certutil拒绝访问的情况,在本地搭建了一个环境尝试绕过certutil下载文件. 安装杀软更新到最新版本,开启 ...
- 学习C#第一天
学习C#第一天 先是了解了VS 2019编辑器的基本使用 安装Visual Studio https://mp.weixin.qq.com/s?__biz=MzU0MTg5NDkzNA==&m ...
- Elasticsearch 基础介绍
# Elasticsearch简介 ## 基础概念 Elasticsearch由Shay banon在2004年进行初步开发,并且在2010年2月发布第一个版本. 此后Shay banon在2 ...
- Kubernetes,kubectl常用命令详解
kubectl概述 祭出一张图,转载至 kubernetes-handbook/kubectl命令概述 ,可以对命令族有个整体的概念. 环境准备 允许master节点部署pod,使用命令如下: kub ...
- 201871030102-崔红梅 实验二 个人项目—— D{0-1}KP 项目报告
项目 内容 课程班级博客链接 班级博客 这个作业要求链接 实验二作业链接 我的课程学习目标 1.熟练掌握将本地代码保存至GitHub中2.掌握折扣背包问题3.回顾动态规划算法和回溯算法4.对java语 ...
- 记一次metasploitable2内网渗透之21,22,23,25端口爆破
Hydra是一款非常强大的暴力破解工具,它是由著名的黑客组织THC开发的一款开源暴力破解工具.Hydra是一个验证性质的工具,主要目的是:展示安全研究人员从远程获取一个系统认证权限. 目前该工具支持以 ...
- Kubernetes 学习笔记-- kafka往couchdb里倒东西
首先吐槽下国内这些论坛的技术精神,不是我崇洋媚外,有些复读机烦不烦啊,别人的东西吃进去吐出来好玩么? 还有一些不懂装懂,这种最可恶,明明自己都不明白自己在写什么,还是往精华区发,简直离谱,知道自己多挣 ...
- Hadoop完整搭建过程(四):完全分布模式(服务器)
1 概述 上一篇文章介绍了如何使用虚拟机搭建集群,到了这篇文章就是实战了,使用真实的三台不同服务器进行Hadoop集群的搭建.具体步骤其实与虚拟机的差不多,但是由于安全组以及端口等等一些列的问题,会与 ...
- Hadoop完整搭建过程(三):完全分布模式(虚拟机)
1 完全分布模式 完全分布模式是比本地模式与伪分布模式更加复杂的模式,真正利用多台Linux主机来进行部署Hadoop,对集群进行规划,使得Hadoop各个模块分别部署在不同的多台机器上,这篇文章介绍 ...
- Pycharm Fiddler Requests https in _create raise ValueError("check_hostname requires server_hostname
打开Fiddler, 开启抓取https, 在PyCharm中使用requests 发送https请求, 遇到 in _create raise ValueError("check_ho ...