观测云在 .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 顺利达成。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

云仓酒庄北京朝阳区旗舰店发布活动盛况:红酒品鉴沙龙共筑美好

原标题:云仓酒庄北京朝阳区旗舰店活动盛况:红酒品鉴沙龙与招商交流共筑美好未来 在繁忙的都市中,有一片静谧的天地,那便是云仓酒庄北京朝阳区旗舰店。这里不仅是红酒爱好者的聚集地,更是商业交流的新平台。近日&#…

网络编程-套接字相关基础知识

1.1. Socket简介 套接字&#xff08;socket&#xff09;是一种通信机制&#xff0c;凭借这种机制&#xff0c; 客户端<->服务器 模型的通信方式既可以在本地设备上进行&#xff0c;也可以跨网络进行。 Socket英文原意是“孔”或者“插座”的意思&#xff0c;在网络编程…

2023 年安徽省职业院校技能大赛(高职组)

#需要资源或有问题的&#xff0c;可私博主&#xff01;&#xff01;&#xff01; #需要资源或有问题的&#xff0c;可私博主&#xff01;&#xff01;&#xff01; #需要资源或有问题的&#xff0c;可私博主&#xff01;&#xff01;&#xff01; 某企业根据自身业务需求&#…

3.Linux/UNIX平台Python的下载、安装和配置环境变量——《跟老吕学Python编程》

3.Linux/UNIX平台Python的下载、安装和配置环境变量——《跟老吕学Python编程》 一、下载Linux/UNIX版Python1.Python官网2.Linux/UNIX版Python下载网址 二、在Linux/UNIX安装Python1.在Ubuntu Linux安装Python1.1 检查Python版本1.2 高级包管理工具1.3 添加存储库1.4 更新软件…

短剧在线搜索源码(全网首发)

一个非常哇塞的在线短剧搜索页面&#xff0c;接口已经对接好了&#xff0c;上传源码到服务器解压就能直接用&#xff0c;有能力的可以自己改接口自己写自己的接口 接口文档地址&#xff1a;doc.djcat.sbs 源码下载地址&#xff1a;https://pan.xunlei.com/s/VNstN8C6N3VK1a1k…

设计模式 -- 2:策略模式

目录 总结部分&#xff1a;策略模式的优点部分代码部分 总结部分&#xff1a; 策略模式和简单工厂模式很像 区别在于 简单工厂模式 需求的是由工程创造的类 去给客户直接答案 而策略模式在于 我有主体 一个主体 根据策略的不同来进行不同的计算 我的主体就负责收钱 然后调度相…

运维专题.Docker+Nginx服务器的SSL证书安装

运维专题 DockerNginx服务器的SSL证书安装 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/q…

力扣977. 有序数组的平方

思路&#xff1a;暴力法&#xff1a;全部平方&#xff0c;然后调用排序API&#xff0c;排序算法最快是N*log(N)时间复制度。 双指针法&#xff1a;要利用好原本的数组本就是有序的数组这个条件&#xff0c; 只是有负数 导致平方后变大了&#xff0c;那么平方后的最大值就是在两…

【机器学习智能硬件开发全解】(三)—— 政安晨:嵌入式系统基本素养【计算机体系结构中的CPU关系】

通过上一篇文章的学习: 【机器学习智能硬件开发全解】&#xff08;二&#xff09;—— 政安晨&#xff1a;嵌入式系统基本素养【处理器原理】https://blog.csdn.net/snowdenkeke/article/details/136662796我们已经知道了CPU的设计流程和工作原理&#xff0c;紧接着一个新问题…

武汉云仓酒庄:品牌细节,用心呈现葡萄酒文化新高度

武汉云仓酒庄&#xff1a;品牌细节&#xff0c;用心呈现葡萄酒文化新高度 在繁忙的武汉都市中&#xff0c;有一处静谧的角落&#xff0c;那便是云仓酒庄。这里不仅仅是葡萄酒的汇聚之地&#xff0c;更是葡萄酒文化传播与交流的重要平台。近日&#xff0c;武汉云仓酒庄以其精心…

【LeetCode热题100】2. 两数相加(链表)

一.题目要求 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数…

面试复盘记录(数据开发)

一、apple外包1.矩阵顺时针旋转遍历2.两表取差集 二、 一、apple外包 没问理论&#xff0c;就两个算法题。 1.矩阵顺时针旋转遍历 Given an m x n matrix, return all elements of the matrix in spiral order.Example 1:Input: matrix [[1,2,3],[4,5,6],[7,8,9]] Output: …

叶子分享站PHP源码

叶子网盘分享站PHP网站源码&#xff0c;创建无限级文件夹&#xff0c;上传文件&#xff0c;可进行删除&#xff0c;下载等能很好的兼容服务器。方便管理者操作&#xff0c;查看更多的下载资源以及文章&#xff0c;新增分享功能&#xff0c;异步上传文件/资源等 PHP网盘源码优势…

VUE内盘期货配资软件源码国际外盘二合一

开发一个Vue内盘期货配资软件源码&#xff0c;同时兼容国际外盘二合一的功能&#xff0c;是一个复杂且专业的任务&#xff0c;涉及前端Vue.js框架的使用、后端服务器处理、数据库管理、实时交易接口对接等多个方面。下面是一些关于开发此类软件的基本指导和考虑因素&#xff1a…

Docker拉取镜像存储不足

在使用Docker时&#xff0c;我们经常遇到一个问题&#xff0c;就是拉取镜像时提示存储空间不足。这是因为Docker在拉取镜像时需要将镜像文件下载到本地存储中&#xff0c;而有时本地存储空间不足以容纳完整的镜像文件。 本文将介绍一些解决这个问题的方法&#xff0c;并提供相…

Diffusion 公式和代码解读

1、训练过程 下面就是代码实现过程 2、训练过程的损失函数。也就是上面的公式。 二、采样过程&#xff0c;生成过程&#xff1a;

BufferWriter类解析

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴——bug菌&#xff0c;今天又来给大家普及Java SE相关知识点了&#xff0c;别躲起来啊&#xff0c;听我讲干货还不快点赞&#xff0c;赞多了我就有动力讲得更嗨啦&#xff01;所以呀&#xff0c;养成先点赞后阅读的好…

【LLMs+小羊驼】23.03.Vicuna: 类似GPT4的开源聊天机器人( 90%* ChatGPT Quality)

官方在线demo: https://chat.lmsys.org/ Github项目代码&#xff1a;https://github.com/lm-sys/FastChat 官方博客&#xff1a;Vicuna: An Open-Source Chatbot Impressing GPT-4 with 90% ChatGPT Quality 模型下载: https://huggingface.co/lmsys/vicuna-7b-v1.5 | 所有的模…

基于恒功率PQ控制的三电平并网逆变器MATLAB仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 模型简介 三相 T 型三电平逆变器电路如图所示&#xff0c;逆变器主回路由三个单相 T 型逆变器组成。 直流侧输入电压为 UPV&#xff0c;直流侧中点电位 O 设为零电位&#xff0c;交流侧输出侧是三相三线制连…

《互联网的世界》第七讲-能源

本想聊聊 tcp 和 quic&#xff0c;但这些都属于术的范畴&#xff0c;变化多端&#xff0c;等孩子们长大了又不知变成什么样子了&#xff0c;趁这段时间在家&#xff0c;还是得讲一些相对不变的东西&#xff0c;或法或势。 从 安阳卖血糕的精巧篦子 想到如何做圆米粉和圆面条&a…