dotnet core调试docker下生成的dump文件

最近公司预生产环境.net core应用的docker容器经常出现内存暴涨现象,有时会突然吃掉几个G,触发监控预警,造成容器重启。


分析了各种可能原因,修复了可能发生的内存泄露,经测试本地正常,但是发到预生产还是会有内存暴涨现象,反而更改GC模式后内存使用保持较低水平,百思不得其解,所以想到使用调试dump文件方式来分析应用内存状况。

环境:

lldb:3.9

dotnetcore:2.1.6

docker image:microsoft/dotnet:2.1.6-aspnetcore-runtime

(根据文档,dotnetcore2.0需要使用lldb3.6,但是我尝试了没有成功,lldb使用的dotnetcore版本与dump应用的dotnetcore版本要一致,由于core2.1现在官方只提供2.1.6的runtime文件,故本次测试使用2.1.6版本,如果哪位童鞋在core2.0上调试成功了,麻烦告诉我方法)

linux下需要使用lldb来进行dump分析,但是安装这个太慢,所以我找了个安装好的docker image使用,有兴趣的也可以自行安装,这里就不介绍安装过程了,.net core 本身提供了lldb sos 插件,只要加载使用就好。


启动一个.net core应用容器,这里需要多加几个参数,不然无法创建dump(另外多说一句,docker内crash coredump文件无法生成也是权限原因,我这边启动时都给了权限,如果仅仅是需要使用.netcore提供createdump工具,只需要加--privileged=true):

docker run -d -p 80:80 --name dumptest --ulimit core=-1 --security-opt seccomp=unconfined --privileged=true dumptest:v1


--ulimit core=-1              不限制coredump大小
--security-opt seccomp=unconfined   允许容器执行全部系统调用
--privileged=true            允许createdump访问其他进程

进入容器:

docker exec -it dumptest /bin/bash

创建dump文件:

/usr/share/dotnet/shared/Microsoft.NETCore.App/2.1.6/createdump 1

(经观察,容器内的跑的应用进程ID都是1,所以直接使用,也可以使用top命令来查看进程ID,创建dump文件在/tmp/coredump.1)

退出容器:

exit

在宿主机创建文件夹/data/docker,并将容器中的dump文件拷贝到宿主机:

cd /&&mkdir data&&cd data&&mkdir docker

docker cp dumptest :/tmp/coredump.1 /data/docker

拉取lldb镜像(此镜像是lldb3.9的dotnetcore版本为2.1.5,有其他需求请自行查找):

docker pull yyoda/dotnet-lldb

启动lldb容器,并将coredump文件路径映射到容器内(如果想要长期使用不要带--rm参数):

docker run -d -v /data/docker:/dump --rm -it --name lldb yyoda/dotnet-lldb:latest /bin/bash

镜像内需要安装dotnetcore2.1.6,为了方便安装,在容器内部使用阿里源:

cd /data/docker
touch sources.list

将下面的源加入sources.list:

deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse


进入lldb容器:


docker exec -it lldb /bin/bash


更新源:


mv /dump/sources.list /etc/apt/source.list
apt-get update


安装dotnetcore2.1.6 runtime(由于网络等原因,如果失败多试几次):


wget -q https://packages.microsoft.com/config/ubuntu/14.04/packages-microsoft-prod.deb
dpkg -i packages-microsoft-prod.deb


apt-get install apt-transport-https
apt-get update
apt-get install dotnet-runtime-2.1


启动lldb:


lldb-3.9 dotnet -c /dump/coredump.1 -o "plugin load /usr/share/dotnet/shared/Microsoft.NETCore.App/2.1.6/libsosplugin.so"


(如果sos加载失败,启动后输入命令:plugin load /usr/share/dotnet/shared/Microsoft.NETCore.App/2.1.6/libsosplugin.so


   如果runtime加载失败,启动后输入命令:setclrpath /usr/share/dotnet/shared/Microsoft.NETCore.App/2.1.6)


输入soshelp命令,出现下图:


640?wx_fmt=png


查看堆上的对象类型分配情况(由于结果太多,这里加入大于1024byte过滤):


dumpheap -stat -min 1024


640?wx_fmt=png


查看指定类型对象情况:


dumpheap -mt 00007f2a28b874e8 -min 1024


640?wx_fmt=jpeg

查看指定对象情况:


dumpobj 00007f2a1400fc88


640?wx_fmt=jpeg


剩下的就是熟悉sos命令,不在赘述了,大家自行研究吧。。。 

ps:附上docker容器内应用崩溃时生成dump方法:


1.容器启动时要带下面两个参数:


  --ulimit core=-1 
  --security-opt seccomp=unconfined 


2.宿主机上执行命令,更改dump文件输出路径:


  echo '/tmp/core.%t.%e.%p' | sudo tee /proc/sys/kernel/core_pattern


  (因为系统在产生 coredump 文件时是根据 /proc/sys/kernel/core_pattern 的设定模板来的,而默认的设定是 /usr/share/apport/apport %p %s %c %P,也就是用管道传apport。然而 Docker 里面的系统不一定有装 apport,并且 /proc 又是直接挂到 Docker 里面的,所以需要设置固定存放位置 /tmp。


    %p 所dump进程的进程ID


    %t core dump的时间 


    %e 程序文件名)


测试:


  进入容器后执行 kill -s SIGSEGV $$   触发当前shell终端的段错误。


  再次进入容器,在/temp路径下可以看到刚刚生成的dump文件


  640?wx_fmt=png

参考资料:

https://github.com/mikem8361/coreclr/blob/5c22cb85c7cc9173f2fb783bf24c0cbbb6096c89/Documentation/building/debugging-instructions.md

http://blogs.microsoft.co.il/sasha/2017/02/26/analyzing-a-net-core-core-dump-on-linux/

原文地址:https://www.cnblogs.com/iamsach/p/10118628.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318444.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Quadratic Form

Quadratic Form 题意: 一个n * n 的正定矩阵和一个n维的向量b,现在找一个x1,x2,…xn满足以下条件: 求这个式子,最后输出P * Q-1 mod 998244353. 题解: 参考 线性代数学过n阶正定的实矩阵等…

8分钟学会Consul集群搭建及微服务概念

Consul介绍:Consul 是由 HashiCorp 公司推出的开源软件,用于实现分布式系统的服务发现与配置。与其他分布式服务注册与发现的方案,Consul 的方案更“一站式”,内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Valu…

最小代价(区间dp)(ybtoj)

文章目录题目描述解析代码题目描述 解析 (我觉得)很难的dp 思路是真的没有想出来 关键在于dp的设计: dp[l][r]:[l,r]的最小价值 f[l][r][a][b]:把l到r之间除了数值在[a,b]之间的数全部消掉需要的最小价值 &#xff08…

.net core i上 K8S(六).netcore程序的service网络代理模式

正文上一章我们讲了pod的hostip模式,但在生产环境中,我们都是通过service来访问k8s集群的,service有两种模式来暴漏端口,今天我们来分享一下1.clusterIP模式我们在创建service的时候,默认创建的时clusterIP模式&#x…

Jamie and Tree[CF916E]

Jamie and Tree[CF916E] 题意: 有一棵n个点的树,每个节点上有一个权值wi,最开始根为1号点.现在有3种 类型的操作: • 1 root, 表示将根设为root. • 2 u v x, 设u, v的最近公共祖先为p, 将p的子树中的所有点的权值加…

领域驱动设计,让程序员心中有码(三)

“正如西方古典哲学在现代社会逐渐式微,成为少数内心丰满者们填充自己精神世界的宝贵食物,UML也这样;互联网技术飞速发展的今天,各类软件设计思想层出不穷,正是站在UML和其他各种软件基础理论巨人的肩膀上,…

Tavan

Tavan–简单的k进制题 呵呵真的简单 也就是考试没做出来罢了,不慌不慌,奶我一口,还能活 【题目摘要】 题目描述 小 Zeljko 一直在阁楼里读他奶奶的旧信,并且发现了一个长度为 N 的单词。 不幸的是,由于溢出的墨水&…

.NET Core 2.x中使用Named Options处理多个强类型配置实例

来源: Using multiple instances of strongly-typed settings with named options in .NET Core 2.x作者: Andrew Lock译者: Lamond Lu.NET Core从1.0版本开始,就已经开始使用Options模式绑定强类型配置对象。从那时起到现在&…

YBTOJ:魔法数字(数位dp)

文章目录题目描述解析题目描述 解析 迷惑。。。 首先,比较容易想到用二进制状态压缩记录1-9是否在十进制中出现过 然后就是整除的问题 如果记录余数,它的模数又有9个 开九维余数直接爆炸。。。 怎么办嘞? 有一个结论: 若&#xf…

Prosjecni(构造)

Prosjecni 【题目摘要】 描述 Slavko很无聊,所以他把正整数填到N*N的方阵中。 如果他填出来的方阵满足以下条件,他会特别高兴: ●每行中的数字的平均值是一个位于同一行的整数。 ●每列中的数字的平均值是一个位于同一列的整数。 ●表中的所…

撒花!中文翻译仓库链接已加入 ML.NET 官方示例网站首页

从2018年12月02日决定开始做ML.NET 示例中文版https://github.com/feiyun0112/machinelearning-samples.zh-cn,然后以每天一篇的速度进行翻译,总共耗时15天,将现有的官方实例全部翻译成了中文,并提交了添加中文链接PR,…

P3803 【模板】多项式乘法(FFT)

P3803 【模板】多项式乘法(FFT) 题目描述 给定一个 n 次多项式 F(x),和一个 m 次多项式 G(x)。 请求出 F(x)和 G(x)的卷积。 从低到高输出F(x)*G(x)的系数 另一种问法: 如果有两个无限序列a和b,那么它们卷积的结果是…

YBTOJ:单词频率(AC自动机)

解析 我对力量一无所知 通过这题,可以看出我对AC自动机还是完全没有理解 qwq 首先容易想到: 建一课trie树,然后建树时记录每个串s的终点,这个点后面每被经过一次,就相当于出现一次该单词s 但是,这种“出现”…

一元一次方程

一元一次方程–逆波兰栈 【题目摘要】 题目描述 SLON是一个调皮的学生,为了让他静下心来,老师给他出了一道数学题: 给定表达式A,A中含有变量x和,-,*,(,)这些符号,括号成对出现,一个算术运算符均对应两个操…

.net core上 K8S(七).netcore程序的服务发现

正文上一章我们分享了k8s的网络代理模式,今天我们来分享一下k8s中的服务发现。1.环境变量模式的服务发现k8s默认为我们提供了通过环境变量来实现服务发现的功能,前提是1.需要service在pod之前创建2.适用于同一命名空间1.1创建servicekubectl create -f n…

ASP.NET Core 实战:使用ASP.NET Core Web API 和 Vue.js 搭建前后端分离项目

一、前言这几年前端的发展速度就像坐上了火箭,各种的框架一个接一个的出现,需要学习的东西越来越多,分工也越来越细,作为一个 .NET Web 程序猿,多了解了解行业的发展,让自己扩展出新的技能树,对…

【CF1199 D,E, F】Welfare State // Matching vs Independent Set // Rectangle Painting 1

2019-08-15下午三道练习题CF1199 思路有点难想 but很好实现 这是原网站链接:传送门 这里只完成D, E, F三题 文章目录D:Welfare State题目大意正解瞅瞅代码E:Matching vs Independent Set题目大意正解代码实现F:Rectangle Painting 1题目大意正解代码实现…

YBTOJ:前缀匹配(AC自动机)

文章目录题目描述解析代码题目描述 解析 做的不错 把trie树真的当成一棵树递归即可 注意一个标记时的问题&#xff1a; void AC(){int lstrlen(s01),pl1;for(int i1;i<l;i){int aask(s0[i]);pltr[pl][a];int kpl;while(k>1){if(ok[k]) break;//注意&#xff01;ok[k]1;…

[HAOI2006]均分数据

[HAOI2006]均分数据 题解&#xff1a; 题目稍微解释一下&#xff1a; 把n个数以分为m组&#xff0c;计算每一组的和&#xff0c;求得到的这m个数的方差。由于分法是任意的&#xff0c;我们要求这些方差中的最小值 我们先用STL中的函数random_shuffle()用来对一个元素序列进行…

Docker最全教程——从理论到实战(八)

在本系列教程中&#xff0c;笔者希望将必要的知识点围绕理论、流程&#xff08;工作流程&#xff09;、方法、实践来进行讲解&#xff0c;而不是单纯的为讲解知识点而进行讲解。也就是说&#xff0c;笔者希望能够让大家将理论、知识、思想和指导应用到工作的实际场景和实践之中…