前言

之前“一线码农”大佬有写文章介绍了如何在 windows 下自动 dump,正好手里有个在 docker 环境下 dump 的需求,所以在参考大佬文章的基础上,有了本篇。

工具

dotnet-dump (https://docs.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-dump)

ProcDump for linux (https://github.com/Sysinternals/ProcDump-for-Linux)

dotnet-dump

dotnet-dump是微软官方推出的一个.NET全局工具,安装和使用都非常简单。

安装:

dotnet tool install --global dotnet-dump

使用:

dotnet-dump collect --process-id 1902 # pid

但是它不能够自动dump(也可能是我不知道),所以本文主要讨论下面这个工具

ProcDump for linux

本工具是 ProcDump 的社区 linux 移植版,不过主要开发人员也是微软的员工。

它可以实现根据 CPU 占用 、内存占用、线程数等情况进行自动 dump,我们以此来应对程序出现异常时需要dump文件进行分析的场景。

安装

在 Dockerfile中添加以下命令:

注意我们要在运行时的镜像中添加,并且最好是自行构建一个基础镜像,而不是每次都进行安装。

# final stage/image
FROM mcr.microsoft.com/dotnet/aspnet:5.0 # 安装所需依赖
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
wget \
gdb \
lldb # 安装 procdump
RUN wget https://packages.microsoft.com/repos/microsoft-debian-buster-prod/pool/main/p/procdump/procdump_1.1.1-220_amd64.deb -O procdump.deb \
&& dpkg -i procdump.deb \
&& rm procdump.deb

本文基于 aspnet:5.0 镜像,即 debian 10,如果基于其他镜像,可去下面目录中寻找对应的包

https://packages.microsoft.com/repos/

也可参考作者提供的安装说明

运行

因为 docker 容器并不能很方便的在启动时同时执行多个进程,所以我们需要一个sh文件以便在启动时同时执行dotnet和procdump。

因为我个人不喜欢在 Dockerfile 之外还要依赖其他文件,所以我直接在 Dockerfile 里进行了sh文件的创建

RUN echo "#!/bin/bash \n\
procdump -M 200 -w dotnet & \n\
dotnet \$1 \n\
" > ./start.sh
RUN chmod +x ./start.sh
ENTRYPOINT ["./start.sh", "<YourApp>.dll"]

如果有需要的话,也可以自行创建一个start.sh,内容为

#!/bin/bash
procdump -M 200 -w dotnet &
dotnet $1

Dockerfile 改为

COPY start.sh ./start.sh
RUN chmod +x ./start.sh
ENTRYPOINT ["./start.sh", "<YourApp>.dll"]

这样就可以了,在docker run的时候会同时启动dotnet和procdump,并且当内存大于200M的时候会自动dump。

还有一点要注意,docker run的时候需要添加--privileged 以提高权限。例如docker run --privileged -it xx

其中 procdump 的各个参数为

Usage: procdump [OPTIONS...] TARGET
OPTIONS
-h Prints this help screen
-C 当CPU超过或等于指定值(0到100 * nCPU)时,触发核心转储生成。
-c 当CPU小于指定值(0到100 * nCPU)时触发核心转储生成。
-M 当内存提交超过或等于指定值(MB)时,触发核心转储生成
-m 当内存提交小于指定值(MB)时,触发核心转储生成。
-T 当线程数超过或等于指定值时触发。
-F 当文件描述符计数超过或等于指定值时触发。
-I Polling frequency in milliseconds (default is 1000)
-n Number of core dumps to write before exiting (default is 1)
-s Consecutive seconds before dump is written (default is 10)
-d Writes diagnostic logs to syslog
TARGET 以下二选一:
-p 进程的 pid
-w 进程的名字

举例来说,以下命令表示当 CPU 使用率为>= 65%或内存为>= 100 MB 时创建一个 dump 文件

procdump -C 65 -M 100 -p 1234

其他

dump 文件的持久化

大家都知道 docker 容器消失的话,那么其中的 dump 文件也会消失。

所以需要输出 dump 文件到一个指定的、进行过持久化挂载的卷中,不过可惜的是,当前procdump for linux还没有一个输出参数来控制输出目录,只会在应用程序的同级目录生成,所以现在需要手动移动一下。

我看已经有人提了 PR,未来会增加一个 -o 参数以控制输出。

参考

https://www.cnblogs.com/huangxincheng/p/14661031.html

https://docs.docker.com/config/containers/multi-service_container/

https://github.com/msbrz/procdump-docker

如何在 Docker 环境下自动给 .NET 程序生成 Dump的更多相关文章

  1. [视频教程] 如何在docker环境下的纯净ubuntu系统中安装最新版nginx

    视频地址: https://www.bilibili.com/video/av68984490/ 笔记: 1.拉取ubuntu镜像并运行 docker pull ubuntudocker run -i ...

  2. 4.1. 如何在Windows环境下开发Python

    4.1. 如何在Windows环境下开发Python 4.1. 如何在Windows环境下开发Python 4.1.1. Python的最原始的开发方式是什么样的 4.1.1.1. 找个文本编辑器,新 ...

  3. docker环境下solr6.0配置(中文分词+拼音)

    前言:这篇文章是基于之前的“linux环境下配置solr5.3详细步骤”(http://www.cnblogs.com/zhangyuan0532/p/4826740.html)进行扩展的.本篇的步骤 ...

  4. docker环境下solrcloud+zookeeper集群部署教程

    前言:两个月前的16年11月份完成的配置,使用的solr6.1和zookeeper3.4,刚刚写成blog,目前版本可能有小版本的变化. 本例完成结果为:在docker环境下部署solrcloud集群 ...

  5. Docker环境下运行python+selenium+chrome

    Docker环境下运行python+selenium+chrome docker运行时占用的资源非常少,而且能将环境进行有效的隔离,可以快速的进行部署,因此可以将docker与selenium结合实现 ...

  6. 有了SSL证书,如何在IIS环境下部署https?【转载】

    昨天各位小伙伴都很开心的领取了自己的SSL证书,但是大部分小伙伴却不知道如何部署,也许是因为第一次接触SSL这种高端的东西吧,不过个人觉得就是懒懒懒...本来小编也挺懒的,但是答应了各位小伙伴的,那么 ...

  7. Docker环境下的Mysql8 实现主从数据库数据同步方案

    本文记录下通过MySQL Replication在Docker环境下,通过多个容器 实现数据库主从配置. MySQL Replication就不多解释了,简单说就是MySQL非常出色的一个功能,该功能 ...

  8. Mac+Docker环境下xdebug的配置

    由于容器化的需要,前几天我本地也换成了docker环境.就研究了一下docker环境下phpstorm和xdebug的配置. http://www.mmfei.com/?p=453 这个博客给出了一个 ...

  9. Elasticsearch Docker环境下安装

    Elasticsearch Docker环境下安装 Daemon镜像配置的是https://registry.docker-cn.com Linux:vi /etc/docker/daemon.jso ...

随机推荐

  1. HashMap、ConcurrentHashMap 1.7和1.8对比

    本篇内容是学习的记录,可能会有所不足. 一:JDK1.7中的HashMap JDK1.7的hashMap是由数组 + 链表组成 /** 1 << 4,表示1,左移4位,变成10000,即1 ...

  2. 基于 Socket 的群聊聊天室(带图形界面,包含注册、登录、数据入库功能)

    代码下载 https://github.com/juno3550/GroupChatRoom 实现框架 Chat 包: server.py:服务器端执行代码(TCP 服务器,根据客户端消息调用 mod ...

  3. Spring Cloud Alibaba(6)---Nacos持久化Mysql8.0版本

    Nacos持久化Mysql8.0版本 有关Nacos之前写过三篇文章. Spring Cloud Alibaba(3)---Nacos概述 Spring Cloud Alibaba(4)---Naco ...

  4. OO第四单元总结与课程总结

    OO第四单元总结与课程总结 第四单元作业架构设计 总体分析:本单元作业的需求集中于对UML类图进行查询.对于查询操作来说自然的想法是提前预见到需要查询的内容,在一开始就采用适当的数据结构将必要的信息进 ...

  5. &#128112;&#127999;‍♂️

    出于利益我便是绝对的利己主义者,凡事以自己为根本,以求自己利益最大化而不顾他人.社会.国家: 出于兴趣考我便希望全天下的人都好,都可爱,都不必受餐食无饱和居无定所的困苦,不必因感情的躁动而心情颠簸,因 ...

  6. PAT归纳总结——一些容易记混的概念

    在刷题的过程中,有时候会遇到一些数据结构中的一些概念,如果对这些概念理解不清楚,甚至理解有误的话,就很可能把题目做错.所以,专门找出在刷题过程中出现的一些概念,以免考试的时候用到想不起来. 拓扑排序 ...

  7. lumen Rest API 起步

    lumen Rest API 起步 修改项目文件 .env DB_DATABASE=<数据库名> DB_USERNAME=<数据库用户名> DB_PASSWORD=<数据 ...

  8. 对c语言回调函数的理解

    对于回调函数,可以简单的理解为一种特别的函数调用方法,我们可以对比一下回调函数与普通函数在调用方法上的区别. 1. 普通函数调用 一般为实现方在其函数体执行过程中直接调用. 代码示例: #includ ...

  9. 【Git】2. Git常用命令详解、版本切换原理

    一.新增文件 1.设置用户签名 签名的作用就是为了区分不同的人,方便查看版本的时候知道操作的人是谁.首次安装好git之后必须设置一下签名,否则无法提交代码. 另外,这里设置的签名跟你登录到远程仓的账号 ...

  10. PHP中文转拼音扩展

    Pinyin 基于 CC-CEDICT 词典的中文转拼音工具,更准确的支持多音字的汉字转拼音解决方案. 安装 使用 Composer 安装: $ composer require "over ...