日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

如何在 Docker 环境下自动给 .NET 程序生成 Dump

發(fā)布時間:2023/12/4 asp.net 59 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何在 Docker 环境下自动给 .NET 程序生成 Dump 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

之前“一線碼農”大佬有寫文章介紹了如何在 windows 下自動 dump,正好手里有個在 docker 環(huán)境下 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 的社區(qū) linux 移植版,不過主要開發(fā)人員也是微軟的員工。
它可以實現(xiàn)根據(jù) CPU 占用 、內存占用、線程數(shù)等情況進行自動 dump,我們以此來應對程序出現(xiàn)異常時需要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 容器并不能很方便的在啟動時同時執(zhí)行多個進程,所以我們需要一個sh文件以便在啟動時同時執(zhí)行dotnet和procdump。
因為我個人不喜歡在 Dockerfile 之外還要依賴其他文件,所以我直接在 Dockerfile 里進行了sh文件的創(chuàng)建

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"]

如果有需要的話,也可以自行創(chuàng)建一個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 的各個參數(shù)為

Usage: procdump [OPTIONS...] TARGETOPTIONS-h Prints this help screen-C 當CPU超過或等于指定值(0到100 * nCPU)時,觸發(fā)核心轉儲生成。-c 當CPU小于指定值(0到100 * nCPU)時觸發(fā)核心轉儲生成。-M 當內存提交超過或等于指定值(MB)時,觸發(fā)核心轉儲生成-m 當內存提交小于指定值(MB)時,觸發(fā)核心轉儲生成。-T 當線程數(shù)超過或等于指定值時觸發(fā)。-F 當文件描述符計數(shù)超過或等于指定值時觸發(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 syslogTARGET 以下二選一:-p 進程的 pid-w 進程的名字

舉例來說,以下命令表示當 CPU 使用率為>= 65%或內存為>= 100 MB 時創(chuàng)建一個 dump 文件

procdump -C 65 -M 100 -p 1234

其他

dump 文件的持久化
大家都知道 docker 容器消失的話,那么其中的 dump 文件也會消失。
所以需要輸出 dump 文件到一個指定的、進行過持久化掛載的卷中,不過可惜的是,當前procdump for linux還沒有一個輸出參數(shù)來控制輸出目錄,只會在應用程序的同級目錄生成,所以現(xiàn)在需要手動移動一下。
我看已經有人提了 PR,未來會增加一個 -o 參數(shù)以控制輸出。

參考

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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。