观测云在 .NET 业务中分析性能问题的最佳实践

背景

某药业集团是一家以创新技术驱动的线下医疗数据 SaaS 平台建设和运营公司,其主营的某智慧医疗平台产品,围绕线下医疗场景痛点提供一体化服务解决方案。近期集团对其生物检材在线递检系统进行功能升级开发及 IaaS 平台迁移。在针对新系统和新基础设施服务进行性能压测时,偶发后端服务响应超时问题并影响到最终系统上线的项目进度,也影响了新引入 IaaS 服务商的云产品能力评估。为快速闭环该问题,推动服务按时迁移上线。用户决定采用观测云作为上线前性能压测的辅助分析工具,找出产生后端服务响应超时问题的根因。

接入准备

经与开发工程师沟通,本次测试的在线递检系统基于 .NET Core 框架进行后端业务的开发,部署方式采用 K8s 云服务部署,要求性能分析数据采集探针能够良好适配 .Net Core 微服务环境。观测云数据采集探针 DataKit 提供了优秀的 APM 分布式跟踪能力,可支持包括 .NET Framework 和 .NET Core 应用程序在内的多种开发语言程序在实际运行环境中的分析。帮助用户有效感知上线后应用的运行状态,解决故障异常和性能异常等问题。

针对用户环境中采用容器化部署的方式,我们将 .Net 数据采集器打入容器镜像,并配置相应的环境变量,使服务在加载时同步启动 APM 数据采集器。当有应用请求访问到当前服务时,链路记录的数据将发送至本集群 DataKit 探针,实现应用链路数据的采集和发送:

FROM xxx/sdk:6.0 #base image# Install datadog-dotnet-apm for Cent&RH
#COPY datadog-dotnet-apm-2.42.0-1.x86_64.rpm /opt
#RUN sudo rpm -Uvh /opt/datadog-dotnet-apm-2.42.0-1.x86_64.rpm && /opt/datadog/createLogPath.sh# Install dd-dotnet for Ubuntu
COPY datadog-dotnet-apm_2.42.0_amd64.deb /opt
RUN dpkg -i /opt/datadog-dotnet-apm_2.42.0_amd64.deb && /opt/datadog/createLogPath.sh# Set Datakit receiver endpoint
ENV DD_TRACE_AGENT_URL=http://datakit-service.datakit:9529
ENV DD_AGENT_HOST=datakit-service.datakit
ENV DD_TRACE_AGENT_PORT=9529# Set environment variables
ENV CORECLR_ENABLE_PROFILING=1
ENV CORECLR_PROFILER={846F5F1C-F9AE-4B07-969E-05C26BC060D8}
ENV CORECLR_PROFILER_PATH=/opt/datadog/Datadog.Trace.ClrProfiler.Native.so
ENV DD_DOTNET_TRACER_HOME=/opt/datadog# Set additional Datadog environment variables
ENV DD_LOGS_INJECTION=true
ENV DD_RUNTIME_METRICS_ENABLED=true

问题分析

在完成应用数据接入后,针对当前客户遇到的性能问题表现,我们计划了以下几个分析步骤,来逐步探查性能问题产生的原因:

1、应用性能概览查看异常 span

受实际应用程序的规模和复杂性的影响,我们首先需要排除是否是运行时环境的各种 Exception 处理或重试导致了该问题。如果一个 .NET 应用程序的 span 显示出高延迟,用户可以通过观测云应用性能概览和服务详情列表,并点击存在异常的错误服务,跳转至链路详情来分析判断性能问题是否与故障相关:

例如在上面的服务详情中,我们点击服务错误数并跳转查看相关链路,在链路详情列表中点击对应的长耗时 span,即可查看到当前长耗时状态是否是发生错误的 span 导致的。在示例图的应用链路火焰图中,最下层的查询错误是导致整个链路超时的原因,这个故障可通过观测云 APM 火焰图直接定位发现,可以大幅提升代码问题分析效率。

2、长耗时应用 span 的跳转分析

对于没有产生显著错误但性能依然存在问题的调用过程,我们需要借助观测云应用性能监测的服务列表统计或应用性能概览继续分析问题原因。首先需要找到慢响应服务的位置,再通过跳转分析的方式打开链路执行详情进行进一步分析。例如在下图中,首先根据服务名称确定我们需要分析的接口。再通过对应接口的 P99 响应时长,定位到和前端 app 操作时响应超时相关的具体链路:

以上面的分析场景为例,我们结合客户压测过程中前端某接口的响应超时,对其请求的 Orxxx.WebApi 服务进行进一步的分析。通过时间窗筛选,查看测试时间段附近统计的各服务接口,点击该服务后跳转到对应该链路的详情页,进一步查看指定接口调用统计及资源耗时情况:

点击下方资源调用分析列表中的长耗时接口,跳转进入火焰图将该接口的详细调用过程进行展开分析。通过火焰图中的链路调用详情,可以看到最底层的 /_search 调用即是本次调用耗时最长的接口,而这次长耗时调用进一步导致了当前服务最终对外返回超时的问题:

对于大多数问题分析场景,定位到这样的具体接口已可转开发团队进行代码层面的进一步分析和优化修改。但也不排除有时会因为运行时环境出现的某种异常,反向干扰到代码执行的情况,这种故障单从代码执行层面无法找到故障原因。此外,还可能遇到在进行代码优化后可能仍未获取到比较满意的性能得情况。或者单纯通过静态代码分析无法查找出具体的异常代码,需要进一步定位分析原因。这种情况下我们需要使用观测云 APM 的 Profile 功能对应用执行的运行时环境指标进行分析,进一步查找影响性能的相关线索。

3、应用性能监测 Profile 分析

观测云提供的应用性能 Profile 提供基于线程采样的代码详细执行耗时统计,帮助用户进一步探查链路长耗时 span 在资源消耗方面存在的问题。例如,用户可通过 CPU Time 这个 profile 指标,找到消耗大量 CPU 周期的代码块。或通过 Walltime 指标,找出执行时间长的方法。当某个 method 因某种原因未被操作系统完全调度在核心上的线程执行时(等待 I/O 或等待锁),Profile 分析可以帮助用户找出这类请求,并明确执行变慢的原因。

由于 Profile 功能本身有一定的性能开销。在本次性能分析过程中我们通过观 K8s 负载的环境变量,按需开启指定 api 负载所在容器的 .Net Profile 功能。当运行时环境开启 Profile 采集后,即可在应用性能监测的 Profile 页面中看到相关数据的采集列表:

查看与慢调用 span 相关的 Profile 数据通常有两种方式,对于执行时间明显超过某个阈值的单块调用 (CPU time>500ms) ,观测云将自动关联该 Profile 数据到对应的链路,用户通过应用链路详情界面的代码热点功能即可跳转至对应的 Profile 火焰图,查看对应的长耗时执行时间是由哪个 method 产生。在本次故障问题的定位中。我们发现订单接口的货品查询 api 在采样周期内有明显的锁等待耗时长的问题。表现为故障时间段内会出现若干个查询连续超时的情况。原因如图中所示,其信号量和自旋锁的等待时间都比较长,这通常与运行时环境的参数配置有关。对于此类问题,即便代码持续优化,只要参数配置不合理就无法从根源上解决性能劣化的问题。

另一种查看对应 Profile 数据的方式是根据性能异常链路的执行时间,直接在 Profile 详情页中查看对应时段内的 Profile 详情火焰图。这种方式适用于单个代码块执行时间未超过系统自动关联的判定阈值,但依然需要分析其性能问题的场合。由于其分析效果与上述方法基本等同,这里不再赘述。

在本次问题的分析过程中,我们针对 _search 服务执行时间超时问题进行了进一步的 Profiling 分析,通过反复压测相关接口,触发超时步骤并查看 Profile 数据,发现在高并发条件下 Orxxx.WebApi 服务的几个副本随机出现的少量超时,其原因为信号量及锁竞争。需要结合当前并发量及资源访问或运行时参数的配置情况,转给开发和环境运维的同学进行后续的分析和优化。

结语

结合对 Profile 的数据分析,开发同学对该查询接口的读写锁进行了优化,重新调整了部分运行时参数。并根据观测云 APM 的数据,对周边代码逻辑进行了全面排查。通过本轮优化后,线上递检系统在云资源配置、规格不变的情况下,顺利通过了迁移前性能压测,并按时完成系统上线工作。在后续的生产系统线上运行保障过程中,观测云还将继续同客户运维团队一起,为应用持续稳定运行提供可观测保障,及时发现性能隐患,消除性能问题,确保递检系统生产环境 SLA 顺利达成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/743101.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue3/vue2若依框架对比,点击新增编辑跳转到新页面(新增编辑共用代码)

vue2若依框架: router里面定义好,编辑里面添加一个id {path: /filmManagement,component: Layout,hidden: true,redirect: noredirect,children: [{path: editFilmDetail,component: () > import(/views/filmManagement/editFilmDetail),name: editFi…

旅游景区公共广播 园区广播 公路服务区广播

旅游景区公共广播 园区广播 公路服务区广播 旅游景区公共广播 旅游景区公共广播(又称背景音乐)简称BGM,它的主要作用是掩盖噪声并创造一种轻松和谐的气氛,是一种创造轻松愉快环境气氛的音乐。掩盖环境噪声,创造与旅游景区相适应的气氛&#…

报错:Nginx 部署后刷新页面 404 问题

文章目录 问题分析解决 问题 在部署完项目后 刷新页面,页面进入了404 分析 加载单页应用后路由改变均由浏览器处理,而刷新时将会请求当前的链接,而Nginx无法找到对应的页面 关键代码try_files,剩下俩如果其他地方配置了则可以省略。 在这…

GPT实战系列-LangChain构建自定义Agent

GPT实战系列-LangChain构建自定义Agent LangChain GPT实战系列-LangChain如何构建基通义千问的多工具链 GPT实战系列-构建多参数的自定义LangChain工具 GPT实战系列-通过Basetool构建自定义LangChain工具方法 GPT实战系列-一种构建LangChain自定义Tool工具的简单方法 GPT…

ArmSoM Rockchip系列产品 通用教程 之 RTC 使用

1. RTC 简介​ RTC:(Real_Time Clock):实时时钟 HYM8563是一种低功耗实时时钟(RTC)芯片,用于提供精确的时间和日期信息。它提供一个可编程的时钟输出,一个中断输出和一个掉电检测器,所有的地址…

新装 mysql 需注意配置的项

一 时区配置 mysql 安装后默认是使用系统时间,如果是linux系统就要注意系统时区是否配置正确 1 配置centos系统时区 # 查看当前系统时区 timedatectl status# 如果需要更改时区,比如设置为北京时间(中国标准时间) sudo timeda…

【Python使用】嘿马头条完整开发md笔记第1篇:课程简介,ToutiaoWeb虚拟机使用说明【附代码文档】

嘿马头条项目从到完整开发笔记总结完整教程(附代码资料)主要内容讲述:课程简介,ToutiaoWeb虚拟机使用说明,Pycharm远程开发,产品与开发,数据库1 产品介绍,2 原型图与UI图,3 技术架构,4 开发。OS…

STM32第七节:GPIO输入——按键检测(包含带参宏)

目录 前言 STM32第七节:GPIO输入——按键检测(包含带参宏) 带参宏 代码替换展示 定义带参宏 GPIO输入——按键检测 硬件部分 端口输入数据寄存器(GPIOx_IDR) 编写程序 配置以及编写bsp_key文件 main函数编程…

SpringBoot(Lombok + Spring Initailizr + yaml)

1.Lombok 1.基本介绍 2.应用实例 1.pom.xml 引入Lombok&#xff0c;使用版本仲裁 <!--导入springboot父工程--><parent><artifactId>spring-boot-starter-parent</artifactId><groupId>org.springframework.boot</groupId><version&g…

arcgis在GIS滑坡易发性分析中的应用技术研究

我国是地质灾害多发国家&#xff0c;地质灾害的发生无论是对于地质环境还是人类生命财产的安全都会带来较大的威胁&#xff0c;因此需要开展地质灾害风险普查。利用遥感&#xff08;RS&#xff09;技术进行地质灾害调查工作具有宏观、快速、准确的特点&#xff0c;能反映出地质…

空调 USACO2021

题目描述&#xff1a; 思路&#xff1a; 此题非常有技巧&#xff0c;我们首先可以先把希望温度和实际温度做差&#xff0c; 问题就转化成&#xff0c;把这个温度差如何去全都变为0&#xff0c;相对应的变成希望温度 也就是 去给温度差数组去做差分&#xff0c;因为&#xff0…

【正则表达式】正则表达式里使用变量

码 const shuai No My Name Is ShuaiGe.match(new RegExp(shuai, gi)); //↑↑↑↑↑↑↑↑ //等同于 //↓↓↓↓↓↓↓↓ /No/.test(My Name Is ShuaiGe)用作领域 搜索的字符动态改变&#xff0c;例如↓模糊搜索例&#xff1a; 一个文本宽&#xff0c;输入文本模糊搜索用户…

SpringCloud Gateway 新一代网关

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅&#xff0c;从传统的模块之间调用&#xff0c;一步步的升级为 SpringCloud 模块之间的调用&#xff0c;此篇文章为第六篇&#xff0c;即介绍 Gateway 新一代网关。 二、概述 2.1 Gateway 是什么 Gateway 是在 Spring 生…

基于SSM的协同过滤算法的电影推荐系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的协同过滤算法的电影推荐系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:TextArea)

多行文本输入框组件&#xff0c;当输入的文本内容超过组件宽度时会自动换行显示。 高度未设置时&#xff0c;组件无默认高度&#xff0c;自适应内容高度。宽度未设置时&#xff0c;默认撑满最大宽度。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&…

前端面试 ===> 【Vue2】

Vue2 相关面试题总结 1. 谈谈对Vue的理解 Vue是一种用于构建用户页面的渐进式JavaScript框架&#xff0c;也是一个创建SPA单页面应用的Web应用框架&#xff0c;Vue的核心是 数据驱动试图&#xff0c;通过组件内特定的方法实现视图和模型的交互&#xff1b;特性&#xff1a;&a…

选型|匠芯创工业级显示控制MCU

D13x系列微控制器 匠芯创D13x系列是一款基于RISC-V架构的高性能、国产自主、工业级跨界MCU&#xff0c;配备强大的2D图形加速、PNG解码、JPEG编解码引擎&#xff0c;具有丰富的屏接口&#xff0c;具有工业宽温、高可靠性、高开放性&#xff0c;可广泛应用于工业HMI、网关、串口…

解决vue2+elementUI的下拉框出现自动校验的问题

问题&#xff1a; 总结原因是因为新增的时候&#xff0c;传了空值进去 可以这样子解决 this.formData.value && this.$set(this.model, this.formData.key, this.formData.value)这种是只有值存在的时候才会给他赋值&#xff0c;但是这只解决单选下拉框&#xff0c;…

隧道技术和代理技术(三)

隧道技术 知识点 -隧道技术&#xff1a;解决不出网协议上线的问题&#xff08;利用出网协议进行封装出网&#xff09; -代理技术&#xff1a;解决网络通讯不通的问题&#xff08;利用跳板机建立节点后续操作&#xff09; 内环境示意图&#xff0c;方便理解 思路&#xff1a;…

【Mac】鼠标控制\移动\调整窗口大小BBT|边缘触发调整音量\切换桌面

一直在 win 习惯了通过鼠标的侧键来控制窗口的位置、大小&#xff0c;现在找到心的解决方案了&#xff0c;通过 BBT 设置侧键按下\抬起几颗。 以下解决方案的截图&#xff0c;其中还包括了其他操作优化方案&#xff1b; 滚轮配合 cmd 键调节页面大小&#xff1b;配合 option 键…