用 Sidecar 容器为 .NET Core 应用做诊断和性能分析
在微服务架构和云原生应用广泛采用的今天,.NET Core 应用被越来越多地部署在 Kubernetes 集群中。然而,一旦这些应用出现性能瓶颈,仅靠传统的日志和指标可能无法定位问题的根本原因。
从 .NET Core 3 开始,微软推出了一系列跨平台的运行时诊断工具,比如:
dotnet-counters
:用于查看实时性能计数器dotnet-dump
:抓取和分析内存转储dotnet-trace
:采集运行时事件和 CPU 栈信息dotnet-gcdump
:采集垃圾回收(GC)相关信息
这些工具通过 .NET Core 的 Diagnostic Server 与目标进程进行通信,在 Linux 系统中,它们通过 Unix Domain Socket 进行 IPC 交互。默认的 Socket 文件位于 /tmp
目录下。
使用 Sidecar 模式部署诊断工具
在容器环境下部署诊断工具通常有两种方式:
将工具和应用程序打包在同一个镜像中
使用 sidecar 容器独立运行诊断工具
第一种方式会导致镜像体积变大,且工具升级不方便。因此,推荐使用 Sidecar 容器:它与主容器在同一个 Pod 中运行,共享网络和存储卷,适合部署监控或日志收集等辅助任务。
我们将构建一个 Sidecar 模式的诊断方案,解决以下三个关键问题:
如何从 Sidecar 容器访问主容器内的 .NET Core 进程
如何共享
/tmp
目录以建立 IPC 通道如何持久化诊断数据
案例演示:分析一个 ASP.NET Core Worker Service
首先,我们创建一个简单的 Worker Service 应用,它会周期性计算某个位置的质数(模拟 CPU 密集型任务):
_logger.LogInformation("Prime number at position {position} is {value}", pos, FindPrimeNumber(pos));
然后为该应用构建镜像并推送到容器仓库(如 Docker Hub 或 Azure 容器注册表)。
接着,我们构建第二个容器镜像,专用于运行诊断工具,包含:
dotnet tool install --tool-path /tools dotnet-trace
dotnet tool install --tool-path /tools dotnet-dump
dotnet tool install --tool-path /tools dotnet-counters
Kubernetes 部署设计
为了持久化诊断数据,我们需要一个挂载的共享存储。在 Azure Kubernetes Service (AKS) 中,我们可以动态创建基于 Azure Files 的存储卷。以下是关键的 YAML 片段:
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
shareProcessNamespace: true
containers:
- name: toolbox
image: <your-sidecar-image>
volumeMounts:
- name: tmp
mountPath: /tmp
- name: data
mountPath: /data
- name: app
image: <your-app-image>
volumeMounts:
- name: tmp
mountPath: /tmp
volumes:
- name: tmp
emptyDir: {}
- name: data
persistentVolumeClaim:
claimName: monitor-azfiles
注意点:
shareProcessNamespace: true
使得 Sidecar 可以看到主容器的进程/tmp
目录通过emptyDir
共享,建立 IPC 通道Sidecar 容器的
/data
目录挂载 Azure Files 持久卷,用于存储诊断结果设置
stdin: true
和tty: true
保证 Sidecar 容器处于可交互状态
部署完成后,你可以使用 kubectl exec
命令进入 Sidecar 容器:
kubectl exec -it <pod-name> -n net-worker -c toolbox -- /bin/bash
实际运行诊断工具
1. 使用 dotnet-trace
采集追踪数据
首先获取主容器的进程 ID:
dotnet-trace ps
然后开始采集数据并将其保存到挂载的共享目录中:
dotnet-trace collect -p 13 --format Chromium -o /data/trace.json
下载 /data/trace.json
后,可以用 Chrome 或 Edge 浏览器访问 chrome://tracing
或 edge://tracing
查看可视化结果。
2. 使用 dotnet-counters
查看性能指标
dotnet-counters collect --process-id 13 --refresh-interval 10 --output /data/counters --format json
同样可以将 JSON 文件下载后用 VS Code 打开分析。
总结
通过将诊断工具打包进 Sidecar 容器,并结合共享的 /tmp
目录和持久卷存储,我们可以在 Kubernetes 中高效、灵活地为 .NET Core 应用进行性能诊断。这种方式解耦了诊断工具与主应用容器,具有良好的可维护性和扩展性。
用 Sidecar 容器为 .NET Core 应用做诊断和性能分析的更多相关文章
- 将 Sidecar 容器带入新的阶段
作者 | 徐迪.张晓宇 导读:本文根据徐迪和张晓宇在 KubeCon NA 2019 大会分享整理.分享将会从以下几个方面进行切入:首先会简单介绍一下什么是 Sidecar 容器:其次,会分享几个阿里 ...
- 重磅!K8S 1.18版本将内置支持SideCar容器。
作者:justmine 头条号:大数据与云原生 微信公众号:大数据与云原生 创作不易,在满足创作共用版权协议的基础上可以转载,但请以超链接形式注明出处. 为了方便阅读,微信公众号已按分类排版,后续的文 ...
- 我们都可以把它放 Sidecar 容器中,这样微服务具备了 Super power,一种超能力
云原生时代,微服务如何演进? 原创 李响 阿里技术 2020-08-28 https://mp.weixin.qq.com/s/KQG2U8_aotDL4YFB8ee6Zw 一 微服务架构与云原 ...
- 利用docker容器运行.net core webapi
利用docker容器运行.net core webapi :first-child { margin-top: 0 !important; } > :last-child { margin-bo ...
- ASP.NET Core之跨平台的实时性能监控(2.健康检查)
前言 上篇我们讲了如何使用App Metrics 做一个简单的APM监控,最后提到过健康检查这个东西. 这篇主要就是讲解健康检查的内容. 没看过上篇的,请移步:ASP.NET Core之跨平台的实时性 ...
- 健康检查NET Core之跨平台的实时性能监控
ASP.NET Core之跨平台的实时性能监控(2.健康检查) 前言 上篇我们讲了如何使用App Metrics 做一个简单的APM监控,最后提到过健康检查这个东西. 这篇主要就是讲解健康检查的内 ...
- 使用Django.core.cache操作Memcached导致性能不稳定的分析过程
使用Django.core.cache操作Memcached导致性能不稳定的分析过程 最近测试一项目,用到了Nginx缓存服务,那可真是快啊!2Gb带宽都轻易耗尽. 不过Api接口无法简单使用Ngin ...
- 用Chrome开发者工具做JavaScript性能分析
来源: http://blog.jobbole.com/31178/ 你的网站正常运转.现在我们来让它运转的更快.网站的性能由页面载入速度和代码执行效率决定.一些服务可以让你的网站载入更快,比如压缩J ...
- chrome使用Timeline做性能分析
使用Timeline做性能分析 Timeline面板记录和分析了web应用运行时的所有活动情况,这是研究和查找性能问题的最佳途径.###Timeline面板概览 Timeline面板主要有三个部分构成 ...
- 怎样让oracle实验本在不做实验时性能提升——win7下举例
怎样让oracle实验本在不做实验时性能提升--win7下举例 型号:ThinkPad E431 系统:WIN7 实验使用的笔记本不使用数据库时.建议将oracle关闭,使其释放占用的资源. orac ...
随机推荐
- Zookeeper Java客户端连接慢、超时问题Ad-Hoc检查清单
TL;DR 排查思路: 首先确认你的设备到zookeeper的连通性是OK的,可通过命令echo srvr | nc HOST 2181,检查是否可以正常打印节点信息.windows用户可以在命令行输 ...
- C# USB 摄像头 OpenCV 视频picBox呈现,抓拍图像保存呈现。
1.winform 应用程序,两个picturebox空间,一个用于视频呈现,一个用于抓拍呈现. 2.引用包OpenCvSharp4.OpenCvSharp4.Extensions.OpenCvSha ...
- C# Socket通信简单示例
https://files.cnblogs.com/files/mojiejushi/SocketDemo.rar
- Web前端入门第 7 问:HTML 标签不闭合、乱闭合、只有闭合标签有没有什么问题?
HTML 标签语法遵循层级嵌套的树形结构,如果写出来的代码不是树形结构,浏览器会怎么渲染? 注意:以下截图都来源于 Chrome 浏览器,不同浏览器可能会产生不同的渲染结果. 先看正常代码 <s ...
- Qt关于使用QSqlQuary::size()这个函数值返回是-1
QSqlQuary::size( ) 今天做项目的时候,用Qt连接Oracle数据库,前面都是连接成功,但是用SQL语句去操作数据库的时候,发现老是读不到内容,卡了好久. QSqlQuery Rule ...
- linux tmux 使用教程
前言 Tmux 是一个终端复用器(terminal multiplexer),非常有用,属于常用的开发工具. 本文介绍如何使用 Tmux. 一.Tmux 是什么? 1.1 会话与进程 命令行的典型使用 ...
- MySQL 常用优化
目录 单表优化 字段 索引 查询SQL 引擎 MyISAM InnoDB 系统调优参数 升级硬件 读写分离 缓存 表分区 分区的好处是: 分区的限制和缺点: 分区的类型: 分区适合的场景有: 垂直拆分 ...
- Pydantic多态模型:用鉴别器构建类型安全的API接口
title: Pydantic多态模型:用鉴别器构建类型安全的API接口 date: 2025/3/20 updated: 2025/3/20 author: cmdragon excerpt: Py ...
- Radmin远程自动登入管理工具
功能说明: Radmin远程自动登入管理工具,服务器登入密码采用加密方式存储,软件可添加,编辑,删除服务器列表以及扫描服务器是否在线. 连接方式:有完全控制,仅查看,文件传输,关机等功能. 使用说明: ...
- iOS Facebook和Google登录
前言 最近在对接完Google和Facebook登录之后准备对这部分内容做一个小小的总结,方便以后有需要的时候查看. 具体的Google账号申请和Facebook账号的申请在这里就不做介绍了,这部分内 ...