百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

使用sidecar container dump 正在运行的容器

nanshan 2025-07-06 15:19 3 浏览 0 评论

引言

memory dump是分析线上程序内存占用非常好的工具

windows上可以直接任务管理器右键生成dump,假如需要根据条件比如CPU 内存占用到多少生成dump可以使用procdump

额外的,还可以使用dotmemory.exe创建dump

linux呢?

可以使用dotnet-dumpdotnet-gcdump

经我测试,dotnet-gcdump安装后可直接执行命令无问题,但在dump中未发现更多数据,于是尝试使用dotnet-dump

但是我在正式服务器上安装一堆东西执行命令后却报错:

1
dotnet-dump fails with "Writing dump failed (HRESULT: 0x80004005)"
BASH

GPT告诉我这是因为docker run时未添加特权参数--cap-add=SYS_PTRACE --security-opt seccomp=unconfined导致的

但问题是,我只需要为这个线上容器(Container)创建dump而不是要重新起一个容器

本文介绍解决方法

解决方案

微软的官方文档里面有提到这种方法:Collect diagnostics in Linux containers

即为sidecar container

就是另起一个带有特权参数的容器,通过命名空间共享(share a process namespace)

在特权容器中创建dump

这里给出我的命令

以下命令皆由AI生成

操作步骤

正常使用dotnet-dump的命令

这里先给出正常情况下,特权参数启用testServer时的命令以做参考

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
###docker run --name test007 --security-opt seccomp=unconfined --rm --cap-add=SYS_PTRACE testServer

docker exec -it test007 bash
###add proxy
export https_proxy=http://127.0.0.1:7890
export http_proxy=http://127.0.0.1:7890


###install sdk
apt-get update
apt-get install -y wget apt-transport-https software-properties-common

wget https://packages.microsoft.com/config/debian/$(lsb_release -rs)/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
dpkg -i packages-microsoft-prod.deb

apt-get update
apt-get install -y dotnet-sdk-5.0


####install dump tool
dotnet tool install --global dotnet-dump --version 5.0.251802
dotnet tool install --global dotnet-gcdump --version 5.0.251802


export PATH="$PATH:$HOME/.dotnet/tools"

###should get error: dotnet-dump fails with "Writing dump failed (HRESULT: 0x80004005)" if not --security-opt seccomp=unconfined --rm --cap-add=SYS_PTRACE
dotnet-dump collect -p 1 -o /tmp/webservice.dmp --type Full

exit
docker cp test007:/tmp/webservice.dmp .
BASH

这里因为我的服务用的.NET 5.0因此选用5.0的版本,假如不知道对应安装的dotnet-dump版本可查看dotnet-dump versions

PS:测试时可以使用docker commit test007 test007-2命令临时将安装的内容保存,方便调试

sidecar container dotnet-dump生成dump

正常sidecar应该是这样的命令

1
docker run --rm -it --name t07 --pid=container:test007 --cap-add SYS_PTRACE -v /tmp/dumps:/dumps_out test007-2 bash -c "dotnet-dump collect -p 1 -o /dumps_out/myapp.dmp --type Full"
BASH

这里使用安装了dotnet-dump的临时image:test007-2

生成的dump文件为Host/tmp/dumps/myapp.dmp

但实际执行会发现报错:

Process 1 not running compatible .NET runtime.

微软的官方文档里有提到这个报错:Use .NET CLI tools in a sidecar container or from the host

它的方案是共享/tmp 路径,这里我没明白什么意思,但是我找到另一种支持的方法

sidecar container createdump生成dump

Microsoft.NETCore.App中已经自带了createdump程序,可以直接生成dump

这个文件位于容器的/usr/share/dotnet/shared/Microsoft.NETCore.App目录中,根据你安装的runtime版本有所不同,因此首先我找到本地自带的createdump版本

1
2
docker run -it --name t07 mcr.microsoft.com/dotnet/aspnet:5.0 bash -c "ls /usr/share/dotnet/shared/Microsoft.NETCore.App/"
####output 5.0.5
BASH

直接使用createdump创建dump

1
docker run --rm -it --name t07 --pid=container:test007 --cap-add SYS_PTRACE -v /tmp/dumps:/dumps_out mcr.microsoft.com/dotnet/aspnet:5.0 bash -c "/usr/share/dotnet/shared/Microsoft.NETCore.App/5.0.5/createdump --full --name /dumps_out/myapp_createdump.dmp 1"
BASH

生成的dump文件为Host/tmp/dumps/myapp.dmp

1为test007dotnet服务的pid,可以通过命令查询

5.0.5为本机mcr.microsoft.com/dotnet/aspnet:5.0createdump版本

同时,使用aspnet:5.0的镜像还避免了正式服务多实例数据异常的风险,可以说是一劳多得,一箭双雕

传输

dump文件一般很大,所以需要压缩传输

tar -czvf dump.tar.gz /tmp/dumps/myapp.dmp

假如压缩后还是很大,且正式服务器带宽不大,可以看我之前的文章:

使用docker加速阿里云ECS下载

参考资料

  • Google AI Studio
  • Collect diagnostics in Linux containers

相关推荐

爆肝 30 天!从 JVM 调优到百万级 QPS,我的 Java 性能飞升全记录(2)

前言:从崩溃边缘到百万级QPS的逆袭凌晨3点的办公室,监控大屏突然飙红,QPS从5万断崖式下跌到800,CPU满载报警,GC时间突破3秒大关——这是我们的电商大促系统在压测中遭...

如何彻底清除服务器上的恶意软件与后门 ?

当服务器遭受入侵后,清除恶意软件和后门是恢复系统安全性的关键步骤。如果清除不彻底,攻击者可能通过隐藏后门程序再次发动攻击。以下是一个系统化的操作指南,帮助您彻底清除服务器上的恶意软件和后门,同时加强服...

Docker 部署高性能抖音 TikTok数据爬取工具,支持无水印视频下载

一、项目简介此项目基于PyWebIO、FastAPI和HTTPX,是一个高效的异步数据爬取工具,专注于抖音/TikTok平台的数据提取。通过Web端界面,用户可以在线批量解析并下载无水印的视频或...

我如何将Unix时间转换为可读的值?

高频处理时间问题在处理时间值时,程序中的一种常见方法是将其转换为线性刻度表示。无法将"2005年1月17日下午5:37"这样的日期存储为变量,并期望能够进行任何操作。因此,在合格的程序...

用shell进行ASCII字符转换与URL编码技巧

如何将ASCII字符转换为十进制(或十六进制)值并进行相反的转换?如何进行URL编码和URL解码?如果你在编写脚本时已知八进制或十六进制值,你可以使用printf命令实现:#POSIXprintf...

Linux远程shell登录出现bash-4.2#问题

出现以上问题的原因是/root目录下丢失了.bashrc和.bash_profile文件/etc/skel/.bash_profile和/etc/skel/.bashrc的文件复制到/root下即可命...

三部门:推进算力互联互通 推动国家枢纽节点和需求地之间400G/800G 高带宽全光连接

每经AI快讯,1月6日,国家发展改革委等三部门印发《国家数据基础设施建设指引》。其中提出,加强新兴网络技术创新应用,优化网络计费方式,降低东西部数据传输成本,促进东部中高时延业务向西部转移。推进算力互...

三部门:推动国家枢纽节点和需求地之间400G/800G高带宽全光连接

国家发展改革委、国家数据局、工业和信息化部等印发《国家数据基础设施建设指引》的通知。其中提到,加强新兴网络技术创新应用,优化网络计费方式,降低东西部数据传输成本,促进东部中高时延业务向西部转移。推进算...

高带宽低延迟如何开启?实际效果如何?

在上次的《实测AMD平台玩游戏用什么频率的内存更好?》中通过测试已经得知,AMDCPU的最佳频率是6000,具体该如何选择,如何设置能提升游戏帧数,往下看小白新手也能看明白。内存选择6000频率内存...

排列五第22237期规律预测走势图分享

二定头尾:03458,X,X,035890XX00XX30XX50XX80XX93XX03XX33XX53XX83XX94XX04XX34XX54XX84XX95...

格式化字符串漏洞及利用_萌新食用

前言格式化字符串漏洞具有任意地址读,任意地址写。printfprintf--一个参数:情况1当参数只有1个字符串的话(含有%?),//?即i,x,s等等<br>第一个...

Linux配置ip地址的两种方法(linux配置ip详细步骤)

Linux配置ip地址的两种方法,实验环境为centos7.6方法1:nmcli工具配置(centos7以下版本不支持该方法)第一步,通过nmcliconnection查看网卡名称[root@lo...

排列五9月30日第22263期最新规律走势预测讲解

二定头尾:034589,X,X,0125670XX00XX10XX20XX50XX60XX73XX03XX13XX23XX53XX63XX74XX04XX14XX2...

GDB调试的高级技巧(gdb调试工具的使用)

GDB是我们平时调试c/c++程序的利器,查起复杂的bug问题,比打印大法要好得多,但是也不得不说,gdb在默认情况下用起来并不是很好用,最近学习到几个高级点的技巧,分享下:一美化打印先上个例子...

给NAS测评打个样:QNAP TS-251D双盘位NAS全面测评体验

这两年随着大家网络条件越来越好,视频、电影资源越来越丰富。以及智能手机的普及拍照也更加方便,大家对于存储的需求也越来越高。除了传统的优盘、移动硬盘之外现在私有云方面也有了更多的选择。那么日常私有云选购...

取消回复欢迎 发表评论: