如何利用快照( snapshot )功能快速定位性能问题

我们常常会遇到这样的困惑,收到用户或者客服的反馈,平台使用有问题,但是测试人员搭建环境后又没办法复现故障,最后导致问题没法解决,眼睁睁地看着用户流失。

这是因为线上生产环境非常复杂、很多时候是偶发性 bug ,但却很难捕捉。特别是随着微服务盛行,系统复杂度增加,线上故障的快速定位和及时分析解决面临着巨大挑战,以前只能靠人来解决。但是人的问题解决能力与速度依赖于经验,有时候甚至需要跨部门的配合,这样的成本非常高,一旦关键人员流失、部门配合不融洽,整个故障的解决速度就会极速下降。

这时候我要给大家带来一款好用的性能分析工具- Application Insight (应用性能管理平台,以下简称 Ai ),至于它能干什么呢?往下看你就知道了~

 trace & snapshot 功能介绍

01业务运行中有哪些错误呢?

在代码运行中,常常会遇到这几类型问题:

JVM

常见的比如 oom 内存溢出、内存泄漏、gc pause 、磁盘运行不足等

● 数据库

常见的比如数据库负载繁忙、数据库服务器超负载、单一 sql 语句执行缓慢、数据库连接池获取时间长、对数据库连接池的访问次数过多等

● 外部服务

常见的比如外部服务网络问题、不同应用之间的调用阻塞、索引设置不合适等

● 其它问题

上面都是我们常见的场景,但是还有一些问题是深深的潜藏在程序中,需要我们深入地分析代码才能找到原因。

线程死锁、循环操作、事务异常、jvm crash 等

02什么是 trace ?

trace 收集程序运行时的信息来查询程序运行情况,定位代码中需要修改和优化的部分,提高代码运行速度,提升用户体验。

业内常用的方法有如下三种:

● 事件方法

在 Java 语言中,使用 jvmti( jvm tools interface )api 方法来捕捉诸如方法调用、类载入、类卸载、进入离开线程等事件,然后再基于这些事件进行代码行为的分析。

● 统计抽样

每隔一段事件中断调用系统,收集当前的调用栈信息,记录调用栈中出现的函数及这些函数的调用结构,基于这些信息得到函数的调用关系图及每个函数的 cpu 使用信息。

● 插码

在目标程序中插入指令代码,这些指令代码会记录程序运行的开始时间、结束时间等,再经过统计得出函数调用情况、函数 cpu 使用情况。

03 AI 的 trace

Ai 采用插码与快照(统计抽样)的方式来实现 trace ,trace 包括慢 trace 、错误 trace 、sql trace 、snapshot 四类:

● 慢 trace

在用户的事务响应时间超过阈值的时候去进行采集。系统默认是2秒,但用户可以根据自己实际情况在 Ai 的“设置-慢事务”处进行设置。

?

?

● 错误 trace

当程序运行异常或直接报错时,我们会直接采集错误 trace,还原现场。

?

● Sql trace

在平台开启慢 sql 追踪,并设置慢 sql 追踪阈值,当 sql 的性能大于该阈值的时候,agent 记录慢 sql 的堆栈信息。默认为0.5s,用户可以根据自己实际情况在 Ai 的“设置-数据库”进行设置。

同时用户可以开启 sql 执行计划,对于执行缓慢的 sql 进行抓取。

?

?

● snapshot

snapshot 实现原理为在客户业务运行缓慢时对调用进行多次代码快照,并且进行方法、耗时分析,得出快照 trace 。

采集规则为 web 事务连续两分钟的平均响应时间超过4*apdex_T(默认两秒),且每分钟的快照数不超过1个。

用户无需做任何配置,即可使用此功能,还可以根据业务动态调整阈值。

?

用户案例分析

 

01问题类型:连接服务被拒绝

1)问题现象:用户反馈无法退出登录

2)问题调查和分析

a:登录平台查看登出的接口情况

登录接口为 rest / api / login ,选择该 web 事务后进入查看详情,使用“筛选”进行条件过滤,获取失败的 trace 。

?

b:查看错误 trace

在总览页面,通过异常分析,看到 http 响应码和异常类、异常信息,这时候我们已经清楚问题原因了。

?

点击“详情”查看程序的执行情况,可以看到程序循环了三次,均出现错误

?

在错误详情,查看详情的调用栈,我们排查到“caused by java.net.ConnectException:拒绝连接(connection refused)

?

?

?

3)解决方案

与运维人员配合重启负责注册模块的服务器后,业务恢复正常。

4)建议方案

在报警处针对重要业务服务进行配置,当响应时间超过阈值或者出现频率超过阈值时,提前报警,挽回损失。

4.1 新功能体验

登录平台后可以查看报警状态

?

进入事务详情,鼠标悬停查看该时间段内发生的最近最严重的报警详情

?

点击红点跳转报警记录查看该事务在该时间段内的所有详情

?

4.2 如何配置报警

a:从 Ai 页面点击报警

进入报警页面,再选择报警规则,创建报警规则名称、选择类型、自定义规则的可用与不可用时间(比如节假日不可用等)

?

b:选择报警对象

目前系统支持按照具体 web 事务、按照不同集群、按照高频 web 事务入口( cpm >10)来进行选择,我们选择按照具体的 web 事务为报警对象。

?

c:选择严重条件

根据我们的业务述求,只要过去10分钟内该事务的平均响应时间大于2秒,而且至少有5分钟的平均响应时间大于2s, 则触发严重报警。

?

d:选择警告条件

根据我们的业务述求,只要过去10分钟内该事务的平均响应时间大于1秒,而且至少有5分钟的平均响应时间大于1s, 则触发严重报警。

?

此时我们报警规则已配置好,当事务触发报警时,便可在 Ai 平台直接查看是否有报警、是否严重。如果您想及时感知报警,可进行进一步的配置。

4.3 如何接收报警

a:创建接收人

?

b:选择接收方式

目前 Ai 默认邮件与 webhook 报警方式,但通过与 Cloud Alert (智能告警平台,简称 CA 平台)的打通,支持短信、微信、钉钉等通知方式,更详细的报警分发与报警压缩可查看(通过免费版,中小运维团队够够的)https://www.aiops.com/CAintroduce.html

c:将接收人和报警规则关联

选择报警规则和触发行为即可

?

常常使用我们 Ai 平台看报警的小伙伴一定有点奇怪,为什么我没有在 Ai 平台中看到报警状态的相关信息呢?

没错,Ai 与报警深度关联功能是我们新开发的功能,我也提前体验了一把,感觉棒棒哒!该功能于12月中旬上线,小伙伴们敬请期待吧~

若您还不是 OneAPM 用户,请点击 https://user.oneapm.com/pages/v2/signup 立即注册免费试用,即刻感受性能优化吧!

在使用的过程中,如您有任何疑问和建议,欢迎随时联系我们,我们将竭诚为您服务:

qq:321095806

社区:http://club.oneapm.com

原文地址:https://www.cnblogs.com/oneapm/p/11934446.html

时间: 2024-11-10 14:07:34

如何利用快照( snapshot )功能快速定位性能问题的相关文章

90%的人会遇到性能问题,如何用1行代码快速定位?

简介:如何在众多异常性能指标中,找出最核心的那一个,进而定位性能瓶颈点,最后进行性能调优.整篇文章会按照代码.CPU.内存.网络.磁盘等方向进行组织,针对对某一各优化点,会有系统的「套路」总结,便于思路的迁移实践. 1. 代码相关 遇到性能问题,首先应该做的是检查否与业务代码相关——不是通过阅读代码解决问题,而是通过日志或代码,排除掉一些与业务代码相关的低级错误.性能优化的最佳位置,是应用内部. 譬如,查看业务日志,检查日志内容里是否有大量的报错产生,应用层.框架层的一些性能问题,大多数都能从日

Android中利用icodetools工具快速定位App破解中关键点方法

icodetools工具地址:https://github.com/fourbrother/icodetools 一.前言 在前面已经介绍了icodetools工具的实现原理和具体使用规则,关于这部分的知识点还不了解的同学可以去下面两篇文章详细查看:Android中注入代码工具icodetools原理篇,Android中注入代码工具icodetools完善篇.同时这个工具已经放到github上了,感兴趣的同学可以下载尝试各种app的代码注入功能. 那么有了这两篇文章之后,现在我得实际操作了,要动

快速定位网站性能问题,提前下班!

大家好,我是小雨小雨,致力于分享有趣的.实用的技术文章. 内容分为翻译和原创,如果有问题,欢迎随时评论或私信,希望和大家一起进步. 分享不易,希望能够得到大家的支持和关注. 查看network时间 直接来一张大图你怕不怕?哈哈 咱们先看看谷歌浏览器network中waterfall各字段的含义哈.简单看下就成,用到了再查不耽误的. Queueing: 排队时间,比如出现以下几种情况的时候,将进入排队 当前请求前有优先级更高的其他请求 HTTP的1.0和1.1版本中,如果对一个域发送超过六个请求,

快速定位隐蔽的sql性能问题及调优【转载】

在前几天,有个开发同事问我一个问题,其实也算是技术救援,他说在有个job数据处理的频率比较高,在测试环境中很难定位出在哪有问题,而且速度也还能接 受,但是在生产环境中总是会慢一些,希望我能在测试环境中协助他们,看看是不是sql语句出什么问题了还是其它相关的问题. 这种类似实时监控的语句,从第一印象来说,很可能通过awr捕获不到,如果通过ash来捕获,因为测试环境中有几十套测试环境在运行,就算得到某个时间点 的一些sql语句,直接在报告中映射到语句对应的schema信息还是有一些困难的.因为测试时

Swift - 给表格UITableView添加索引功能(快速定位)

像iOS中的通讯录,通过点击联系人表格右侧的字母索引,我们可以快速定位到以该字母为首字母的联系人分组. 要实现索引,我们只需要两步操作: (1)实现索引数据源代理方法 (2)响应点击索引触发的代理事件 效果图如下: 代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 4

Linux性能优化从入门到实战:06 CPU篇:快速定位CPU瓶颈

CPU性能指标 ?? ??(1)CPU使用率:1) 用户态CPU使用率(包括用户态 user 和低优先级用户态 nice).2) 系统CPU使用率.3) 等待 I/O 的CPU使用率.4) 软中断和硬中断的CPU使用率.5) 虚拟机占用的CPU使用率. ??(2)平均负载 Load Average:过去 1 分钟.过去 5 分钟和过去 15 分钟的平均负载 ??(3)进程上下文切换:1) 无法获取资源而导致的自愿上下文切换:2) 被系统强制调度导致的非自愿上下文切换. ??(4)CPU缓存命中率

32位汇编第四讲,干货分享,汇编注入的实现,以及快速定位调用API的数量(OD查看)

32位汇编第四讲,干货分享,汇编注入的实现,以及快速定位调用API的数量(OD查看) 昨天,大家可能都看了代码了,不知道昨天有没有在汇编代码的基础上,实现注入计算器. 如果没有,今天则会讲解,不过建议把昨天代码熟悉一遍(课程是紧跟着来的,请不要拉下任何一天,因为今天的知识, 可能就和昨天的知识挂钩,昨天的知识,和前天的挂钩.....,当然你如你懂汇编,不是新手,那么则可以直接往下看) 一丶远程线程注入,和汇编远程注入的区别 昨天的代码,大家可能看了(没看也没有关系,就是远程线程注入的代码,开发角

通过gdb快速定位“段错误”的位置

有些时候我们在一段 C/C++ 代码的时候,由于对一个非法内存进行了操作,在程序运行的过程中,出现了"Segmentation fault (core dumped)"--段错误. 呵呵,这种问题我想很多人会经常遇到.遇到这种问题是非常无语的,只是提示了"段错误",接着什么都没有,如果我们一味的去看代码找太疼苦了,因为我们都相信自己写的代码没问题,现实就是现实.接着,我们可能通过打印来定位到段错误的位置,这样会有个问题,如果代码量大,我们需要打印很多信息才能找到&q

LVM快照(snapshot)备份

转载自:http://wenku.baidu.com/link?url=cbioiMKsfrxlzrJmoUMaztbrTelkE0FQ8F9qUHX7sa9va-BkkL4amvzCCAKg2hBv5ZmYL_ERp3Wprd1jVxG-333s6tCJn2LGqCAvFmJ6dXC Logical VolumeManager (LVM)提供了对任意一个LogicalVolume(LV)做“快照”(snapshot)的功能,以此来获得一个分区的状态一致性备份. 在某一个状态下做备份的时候,可能