在微服务架构和云原生应用广泛采用的今天,.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 模式部署诊断工具

在容器环境下部署诊断工具通常有两种方式:

  1. 将工具和应用程序打包在同一个镜像中

  2. 使用 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: truetty: 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://tracingedge://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 应用做诊断和性能分析的更多相关文章

  1. 将 Sidecar 容器带入新的阶段

    作者 | 徐迪.张晓宇 导读:本文根据徐迪和张晓宇在 KubeCon NA 2019 大会分享整理.分享将会从以下几个方面进行切入:首先会简单介绍一下什么是 Sidecar 容器:其次,会分享几个阿里 ...

  2. 重磅!K8S 1.18版本将内置支持SideCar容器。

    作者:justmine 头条号:大数据与云原生 微信公众号:大数据与云原生 创作不易,在满足创作共用版权协议的基础上可以转载,但请以超链接形式注明出处. 为了方便阅读,微信公众号已按分类排版,后续的文 ...

  3. 我们都可以把它放 Sidecar 容器中,这样微服务具备了 Super power,一种超能力

    云原生时代,微服务如何演进? 原创 李响 阿里技术 2020-08-28   https://mp.weixin.qq.com/s/KQG2U8_aotDL4YFB8ee6Zw 一  微服务架构与云原 ...

  4. 利用docker容器运行.net core webapi

    利用docker容器运行.net core webapi :first-child { margin-top: 0 !important; } > :last-child { margin-bo ...

  5. ASP.NET Core之跨平台的实时性能监控(2.健康检查)

    前言 上篇我们讲了如何使用App Metrics 做一个简单的APM监控,最后提到过健康检查这个东西. 这篇主要就是讲解健康检查的内容. 没看过上篇的,请移步:ASP.NET Core之跨平台的实时性 ...

  6. 健康检查NET Core之跨平台的实时性能监控

    ASP.NET Core之跨平台的实时性能监控(2.健康检查)   前言 上篇我们讲了如何使用App Metrics 做一个简单的APM监控,最后提到过健康检查这个东西. 这篇主要就是讲解健康检查的内 ...

  7. 使用Django.core.cache操作Memcached导致性能不稳定的分析过程

    使用Django.core.cache操作Memcached导致性能不稳定的分析过程 最近测试一项目,用到了Nginx缓存服务,那可真是快啊!2Gb带宽都轻易耗尽. 不过Api接口无法简单使用Ngin ...

  8. 用Chrome开发者工具做JavaScript性能分析

    来源: http://blog.jobbole.com/31178/ 你的网站正常运转.现在我们来让它运转的更快.网站的性能由页面载入速度和代码执行效率决定.一些服务可以让你的网站载入更快,比如压缩J ...

  9. chrome使用Timeline做性能分析

    使用Timeline做性能分析 Timeline面板记录和分析了web应用运行时的所有活动情况,这是研究和查找性能问题的最佳途径.###Timeline面板概览 Timeline面板主要有三个部分构成 ...

  10. 怎样让oracle实验本在不做实验时性能提升——win7下举例

    怎样让oracle实验本在不做实验时性能提升--win7下举例 型号:ThinkPad E431 系统:WIN7 实验使用的笔记本不使用数据库时.建议将oracle关闭,使其释放占用的资源. orac ...

随机推荐

  1. Zookeeper Java客户端连接慢、超时问题Ad-Hoc检查清单

    TL;DR 排查思路: 首先确认你的设备到zookeeper的连通性是OK的,可通过命令echo srvr | nc HOST 2181,检查是否可以正常打印节点信息.windows用户可以在命令行输 ...

  2. C# USB 摄像头 OpenCV 视频picBox呈现,抓拍图像保存呈现。

    1.winform 应用程序,两个picturebox空间,一个用于视频呈现,一个用于抓拍呈现. 2.引用包OpenCvSharp4.OpenCvSharp4.Extensions.OpenCvSha ...

  3. C# Socket通信简单示例

    https://files.cnblogs.com/files/mojiejushi/SocketDemo.rar

  4. Web前端入门第 7 问:HTML 标签不闭合、乱闭合、只有闭合标签有没有什么问题?

    HTML 标签语法遵循层级嵌套的树形结构,如果写出来的代码不是树形结构,浏览器会怎么渲染? 注意:以下截图都来源于 Chrome 浏览器,不同浏览器可能会产生不同的渲染结果. 先看正常代码 <s ...

  5. Qt关于使用QSqlQuary::size()这个函数值返回是-1

    QSqlQuary::size( ) 今天做项目的时候,用Qt连接Oracle数据库,前面都是连接成功,但是用SQL语句去操作数据库的时候,发现老是读不到内容,卡了好久. QSqlQuery Rule ...

  6. linux tmux 使用教程

    前言 Tmux 是一个终端复用器(terminal multiplexer),非常有用,属于常用的开发工具. 本文介绍如何使用 Tmux. 一.Tmux 是什么? 1.1 会话与进程 命令行的典型使用 ...

  7. MySQL 常用优化

    目录 单表优化 字段 索引 查询SQL 引擎 MyISAM InnoDB 系统调优参数 升级硬件 读写分离 缓存 表分区 分区的好处是: 分区的限制和缺点: 分区的类型: 分区适合的场景有: 垂直拆分 ...

  8. Pydantic多态模型:用鉴别器构建类型安全的API接口

    title: Pydantic多态模型:用鉴别器构建类型安全的API接口 date: 2025/3/20 updated: 2025/3/20 author: cmdragon excerpt: Py ...

  9. Radmin远程自动登入管理工具

    功能说明: Radmin远程自动登入管理工具,服务器登入密码采用加密方式存储,软件可添加,编辑,删除服务器列表以及扫描服务器是否在线. 连接方式:有完全控制,仅查看,文件传输,关机等功能. 使用说明: ...

  10. iOS Facebook和Google登录

    前言 最近在对接完Google和Facebook登录之后准备对这部分内容做一个小小的总结,方便以后有需要的时候查看. 具体的Google账号申请和Facebook账号的申请在这里就不做介绍了,这部分内 ...