.NET 容器环境下创建应用 dump 文件

.NET 容器环境下创建应用 dump 文件

Intro

有时候我们的应用会出现一些异常的情况,比如内存飙升,线程死锁等等,通过一些 metrics 我们可能大概的了解内存是增长了,但是具体是哪里增长了,单单看内存的变化很难看出来哪里导致的内存变化,所以很多时候我们还是需要对应用进行 dump,通过分析应用 dump 文件来进一步分析是哪里出现的问题。

Prepare

在容器中进行 dump 的时候我们需要 Linux 中的 SYS_PTRACE 权限,所以需要在部署或运行容器的时候指定一下(默认是没有的)

  • 如果你是直接用 docker run 执行的话可以在执行 docker run  的时候指定 docker run --cap-add=SYS_PTRACE

  • 如果你使用 docker compose 来运行,可以在 docker-compose.yml 配置文件中配置 cap_add,下面是一个示例

    version: '2.1'
    services:reservation:build:context: .dockerfile: Dockerfilecontainer_name: reservationcap_add:- SYS_PTRACE
    
  • 如果你在 k8s 中使用,需要在 k8s 的 yaml 文件中配置,示例如下:

    apiVersion: apps/v1
    kind: Deployment
    metadata:name: sparktodo-apilabels:app: sparktodo-api
    spec:replicas: 1revisionHistoryLimit: 0template:    spec:containers:- name: sparktodo-apiimage: weihanli/sparktodo-api:latestimagePullPolicy: IfNotPresentresources:requests:memory: "64Mi"cpu: "20m"limits:memory: "128Mi"cpu: "50m"ports:- containerPort: 80
    +         securityContext:
    +           capabilities:
    +             add: ["SYS_PTRACE"]
    

我们也可以在容器中检测是否已经开启了 SYS_PTRACE 权限,可以通过命令 capsh --print 来查看已经配置的权限,如果提示命令不存在,则需要安装一个 package,alpine 安装 libcap,Ubuntu 安装 libcap2-bin

# alpine
apk add libcap# ubuntu
apt-get install libcap2-bin

createdump

createdump 是随着 .NET Core runtime 一起发布的一个创建 dump 的一个工具,createdump 可以收集托管信息和 Native 信息,默认 createdump 会创建一个 mini dump,会创建一个比较小的一个 dump,仅包含一些必要的托管信息和堆栈信息,我们也可以通过参数来控制生成全量的 dump(full dump),全量 dump 生成的 dump 文件会比较大,但是包含的信息会比较多,内存中所有的信息都会包含在内。mini dump 没有 full dump 包含那么多有用的信息,所以大小会比较小,通常你请别人帮忙分析 dump 的时候都是选择 full dump。

createdump 一般位于 /usr/share/dotnet/shared/Microsoft.NETCore.App/<version>/createdump

使用起来直接用 createdump <pid> 就可以了,默认会创建一个 minidump,如果要创建一个 full dump,需要指定参数,createdump <pid> -u 或者 createdump <pid> --full

-f, --name - dump path and file name. The %p, %e, %h %t format characters are supported. The default is '/tmp/coredump.%p'
-n, --normal - create minidump.
-h, --withheap - create minidump with heap (default).
-t, --triage - create triage minidump.
-u, --full - create full core dump.
-d, --diag - enable diagnostic messages.

我们可以使用下面的格式来作为 dump 文件中的占位符:

%%  A single % character.
%d  PID of dumped process (for backwards createdump compatibility).
%p  PID of dumped process.
%e  The process executable filename.
%h  Hostname return by gethostname().
%t  Time of dump, expressed as seconds since the Epoch, 1970-01-01 00:00:00 +0000 (UTC).

dotnet diagnostics tool

微软提供了一系列的 dotnet 诊断工具可以帮助我们诊断应用程序中的问题,

  • dotnet-counters:  一个性能监视工具,用于初级运行状况监视和性能调查

  • dotnet-dump: 可在不使用本机调试器的情况下收集和分析 Windows 和 Linux  的 Core Dump

  • dotnet-gcdump: 可用于为活动 .NET 进程收集 GC dump

  • dotnet-trace: 可以使用来自应用的有意思的分析数据,分析数据通过 .NET Core 中的 EventPipe 公开,这些数据可帮助你分析应用运行缓慢的根本原因。

  • dotnet-stack: 可以快速打印正在运行的 .net 进程中的所有线程的托管堆栈

可以使用安装 global tool 的方式安装,在运行时容器中安装 dotnet tool 可以参考之前一篇文章介绍,借助多阶段构建来方便的安装 dotnet tool,示例 dockerfile 如下:

FROM mcr.microsoft.com/dotnet/aspnet:5.0-alpine AS base
# https://www.abhith.net/blog/docker-sql-error-on-aspnet-core-alpine/
RUN apk add icu-libs
ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT false
# use forward headers
ENV ASPNETCORE_FORWARDEDHEADERS_ENABLED=true
LABEL Maintainer="WeihanLi"
EXPOSE 80FROM mcr.microsoft.com/dotnet/sdk:5.0-alpine AS build-env
WORKDIR /app# 安装 dotnet tool
RUN dotnet tool install --global dotnet-dump
RUN dotnet tool install --global dotnet-gcdump
RUN dotnet tool install --global dotnet-countersCOPY SparkTodo.Shared/SparkTodo.Shared.csproj SparkTodo.Shared/
COPY SparkTodo.API/SparkTodo.API.csproj SparkTodo.API/
RUN dotnet restore SparkTodo.API/SparkTodo.API.csproj# copy everything and build
COPY . .WORKDIR /app/SparkTodo.API
RUN dotnet publish -c Release -o out# build runtime image
FROM base AS final# 从前面的 SDK 镜像中拷贝 dotnet tools 到 runtime 镜像中
COPY --from=build-env /root/.dotnet/tools /root/.dotnet/tools
# 设置 PATH 以方便使用
ENV PATH="/root/.dotnet/tools:${PATH}"WORKDIR /app
COPY --from=build-env /app/SparkTodo.API/out .
ENTRYPOINT ["dotnet", "SparkTodo.API.dll"]

你也可以按照上面的方式安装自己想要安装的 dotnet tool,按上面安装之后我们就可以直接使用 dotnet-dump/dotnet-gcdump/dotnet-counters 命令了

dump 之旅

container for test

了解一些基础知识之后,我们就来开始创建 dump 吧,示例应用在 Github 上 https://github.com/WeihanLi/SparkTodo,你可以下载这个应用来做尝试,或者在自己的应用上来试验

首先我们 build 一个 docker 镜像,在项目根目录执行 docker build -t sparktodo-api . 来构建镜像

镜像构建好之后,运行一个容器来进行测试

docker run -d --name sparktodo-api --cap-add=SYS_PTRACE sparktodo-api

容器运行成功之后,可以使用下面的命令进入到容器中,出现下图提示则成功的进入容器中了

docker exec -it sparktodo-api sh

Createdump

首先我们来使用自带的 createdump 来创建一个应用的 dump,

有两种方式找到我们的 createdump

我们可以先切换目录到 /usr/share/dotnet/shared/Microsoft.NETCore.App,然后 ls 查看当前的 runtime 版本,切换到版本目录下即可找到 createdump

另外一种方式,我们可以通过 dotnet --info 来查看当前 runtime 版本,然后直接切换到对应的 /usr/share/dotnet/shared/Microsoft.NETCore.App/<dotnet-version> 目录下即可

通常情况下,我们的容器中只有一个进程,进程 Id 为 1的进程通常就是我们的应用进程,如果不确定的话也可以使用 ps -ef 命令来查看当前的进程信息

可以看到,PID 为 1 的进程就是我们的应用所在的进程,然后就可以通过下面的命令来创建 dump 了

./createdump 1 -u

看到这样的提示,我们的 dump 就创建成功了,这样我们可以使用 LLDB 或者 dotnet-dump 进行 dump 分析了

dotnet-dump

dotnet-dump 是微软提供的一个很方便的 dump 分析和收集工具,dotnet-dump 只能分析托管代码,但是绝大部分场景下对我们来说已经足够了,而且 dotnet-dump 是一个 dotnet tool,可以在各个平台下提供完全一致的体验,不像 LLDB 每个系统的安装方式可能都不一样,安装的版本也可能不同,不如 dotnet-dump 体验良好

首先我们可以使用 dotnet-dump ps 来查看可以进行 dump 的 dotnet 进程,然后使用 dotnet-dump collect -p <pid> 来创建 dump 文件

dotnet-gcdump

dotnet-gcdump 也是微软提供的一个用来分析应用程序问题的 dotnet tool,dotnet-dump 创建的 dump 会比较大,包含除了 gc 之外的其他信息,比如 lock 情况,线程堆栈信息等,使用 dotnet-gcdump 创建的 dump 仅包含 gc 堆的信息,dump 文件会小很多,并且 gcdump 文件可以直接用 VS 打开,可以比较方便的查看 GC 内存占用信息,dotnet-gcdump 的使用和 dotnet-dump 类似,并且新版本(.NET 5.0)的 dotnet-gcdump 可以通过 dotnet-gcdump report -p <pid> 直接从某一个进程导出 GC 内存使用信息

通过 dotnet-gcdump collect -p <pid> 来创建 GC dump 文件

More

容器中的 dump 生成之后可以通过 docker cp(k8s 中可以用 kubectl cp)将 dump 文件拷贝到本地来进行分析,新版本的 dump 文件可以直接使用 VS 打开

微软的官方文档真的是一个宝库,有很多很不错的文档,关于 dotnet 诊断工具也有几篇很有用的介绍,没事的时候看看文档,说不定就能发现宝藏~~

References

  • https://docs.microsoft.com/en-us/dotnet/core/diagnostics/debug-linux-dumps

  • https://www.programmersought.com/article/81354675797/#dotnetdotnetdump_45

  • https://man7.org/linux/man-pages/man7/capabilities.7.html

  • https://stackoverflow.com/questions/43621959/how-can-i-find-out-which-capabilities-a-container-has-been-given

  • https://stackoverflow.com/questions/38758627/how-can-we-add-capabilities-to-a-running-docker-container

  • https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities

  • https://stackoverflow.com/questions/6903329/minidump-vs-fulldump

  • https://github.com/dotnet/diagnostics/blob/main/documentation/design-docs/dotnet-tools.md

  • https://github.com/WeihanLi/SparkTodo

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

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

相关文章

安装mysql二进制文件_MySQL二进制文件规范安装

演示环境介绍操作系统&#xff1a;CentOS 6.7 (64位)二进制包&#xff1a;MySQL-5.6.30-linux-glibc2.5-x86_64.tar.gzMySQL 下载地址&#xff1a;http://dev.mysql.com/downloads/1、下载MySQL# mkdir /root/mysql# cd /root/mysql# wget http://dev.mysql.com/get/Downloads…

清华体质优良可降5分录取;窃取密钥者奖百万;阿里投入1亿保护方言;腾讯不正当竞争被罚;这就是今天的大新闻...

今天是3月21日农历二月十五今天星期四网络突然变得特别的卡严重影响到我的激情下面是今天的大新闻清华体质优良可再降5分录取&#xff08;中国新闻网&#xff09;据清华大学招生办公室官方微信消息&#xff0c;2019年清华大学将继续在自主招生中开展体质测试。体质测试成绩优良…

[Android]关于IntentService

2019独角兽企业重金招聘Python工程师标准>>> IntentService其实是Service加Handler的组合&#xff0c;Handler存在于专门的HandlerThread上&#xff0c; 区别于UI thread, Service每通过onStart()收到Intent&#xff0c;则转给Handler,通过handleMessage()的方式一个…

Facebook 竟然把服务 27 亿人的 AI 硬件系统开源了?!

全世界只有3.14 % 的人关注了数据与算法之美一直以来&#xff0c;社区对 Facebook 的硬件研究比较关注。在今日的开放计算项目全球峰会上&#xff0c;Facebook 技术策略主管 Vijay Rao 开源了全新的 AI 硬件&#xff1a;面向 AI 训练与推理的硬件系统 Zion 与 Kings Canyon&…

一秒创建高级查询服务

在业务开发中&#xff0c;一个常用的功能就是“高级查询”&#xff0c;就是客户可以根据自己的需要设置查询条件查找数据&#xff0c;类似下图&#xff1a; 通常&#xff0c;我们需要为每个“高级查询”定制Dto类&#xff0c;用于传输条件&#xff0c;并要根据条件组合成查询语…

首款产后抑郁药问世;京东推出城市操作系统;阿里将推出全新销售平台;香港政府砸5300亿填海;脸书再爆隐私丑闻;这就是今天的大新闻...

今天是3月22日农历二月十六今天星期五一周就这么过去了周末得好好耍下面是今天的大新闻首款产后抑郁药问世&#xff08;红星新闻&#xff09;据美国CNN新闻3月19日报道&#xff0c;当地时间本周二&#xff08;19日&#xff09;&#xff0c;美国食品和药物管理局&#xff08;FDA…

navicat如何连接腾讯mysql_使用Navicat连接腾讯云Mysql数据库

1、安装# 安装mysql服务sudo apt-get install mysql-server# 安装客户端sudo apt install mysql-client# 安装依赖sudo apt install libmysqlclient-dev# 检查状态sudo netstat -tap | grep mysql2、设置密码root> mysqlmysql> update mysql.user set authentication_str…

WPF实现环(圆)形进度条

WPF开发者QQ群&#xff1a; 340500857 | 微信群 -> 进入公众号主页 加入组织“ 前言&#xff0c;接着上一篇圆形菜单。”欢迎转发、分享、点赞、在看&#xff0c;谢谢~。 01—效果预览效果预览&#xff08;更多效果请下载源码体验&#xff09;&#xff1a;02—代码如下一、…

JQuery上传插件Uploadify使用详解

Uploadify是JQuery的一个上传插件&#xff0c;实现的效果非常不错&#xff0c;带进度显示。不过官方提供的实例时php版本的&#xff0c;本文将详细介绍Uploadify在Aspnet中的使用&#xff0c;您也可以点击下面的链接进行演示或下载。官方下载官方文档官方演示首先按下面的步骤来…

每日一笑 | 不忘初心,最爱扫雷~

全世界只有3.14 % 的人关注了数据与算法之美&#xff08;图源网络&#xff0c;侵权删&#xff09;

在ASP.NET Core微服务架构下使用数据库切分和扩展

原文链接&#xff1a;https://itnext.io/how-to-use-database-sharding-and-scale-an-asp-net-core-microservice-architecture-22c24916590f微服务的一大优点是&#xff0c;它们可以独立扩展。本文展示了扩展一个微服务及其数据库的好处和挑战。您将创建一个示例应用程序并手动…

GridView实现数据编辑和删除(一)

2019独角兽企业重金招聘Python工程师标准>>> 前台的html代码&#xff1a; <asp:GridView ID"gv_Emplogin" runat"server" AutoGenerateColumns"False" onrowdeleting"gv_Emplogin_RowDeleting" onrowupdating"gv_…

8张图告诉你,在朋友圈发什么不会被嫌弃

爱发圈的你是否发现&#xff0c;打开朋友圈总有一些内容让你嫌弃&#xff1a;和本人真假难辨的美图自拍&#xff0c;每天十条以上的发帖&#xff0c;伪科普的转发…还有一些人你直接想删除&#xff1a;炫耀自己家的奢侈品&#xff0c;从不交摊位费的代购和微商和一日三餐都发圈…

iNeuOS工业互联网平台,在高校教学实训领域的应用

目 录1. 概述... 22. 实训柜... 23. 培训内容... 44. 二次开发培训... 51. 概述中国工业互联网从 0 向 1 演进从缺政策、缺技术、缺市场&#xff0c;逐渐转移到了缺人才&#xff0c;跨行业、跨领域的复合型人才&#xff1b;IT与OT融合型人才&#…

keepalived 原理,安装,配置

什么是Keepalived呢&#xff0c;keepalived观其名可知&#xff0c;保持存活&#xff0c;在网络里面就是保持在线了&#xff0c;也就是所谓的高可用或热备&#xff0c;用来防止单点故障(单点故障是指一旦某一点出现故障就会导致整个系统架构的不可用)的发生&#xff0c;那说到ke…

28合1智能积木,56种玩法,让孩子循序渐进“玩”出新知识

▲数据汪特别推荐点击上图进入玩酷屋小木作为一名资深积木达人&#xff0c;我可是大大小小的积木阅览无数&#xff0c;最近小木又发现一个超好玩的----28合1小卡百变积木&#xff01;小卡百变积木是小卡团队研发的一款全新概念的智能积木&#xff0c;由276颗高精度积木&#xf…

表3.5 文章管理测试用例表_本地管理表空间管理机制

表空间是一种为段&#xff08;表&#xff0c;索引等&#xff09;提供空间的逻辑结构&#xff0c;所以&#xff0c;当在表空间中增加&#xff0c;删除段的时候&#xff0c;数据库就必须跟踪这些空间的使用。如下例所示&#xff0c;假定一个新创建的表空间包含了五个表表一……表…

.NET | 多线程下的调用上下文 : CallContext

【.NET】| 总结/Edison Zhou最近在分析现在团队的项目代码&#xff08;基于.NET Framework 4.5&#xff09;&#xff0c;经常发现一个CallContext的调用&#xff0c;记得多年前的时候用到了它&#xff0c;但是印象已经不深刻了&#xff0c;于是现在来复习一下。1CallContext是个…

每日一笑 | 哪个男人到底是谁?!

全世界只有3.14 % 的人关注了数据与算法之美&#xff08;图源网络&#xff0c;侵权删&#xff09;

min里所有的参数都不存在_高中生物所有的考点难点,其实都在你不仔细看的课本里,必修1-3超强记忆手册!...

对很多理科生来说&#xff0c;高中生物就是一门不是文科胜似文科的学科。很多数学、物理成绩非常突出的学生却不能在这样一门“理科”课程当中取得优势。生物老师在这门学科的提高上反复强调“回归课本”却又让很多习惯刷题的理科生不知无从下手。进入高三后&#xff0c;生物、…