线上服务平均响应时间太长,怎么排查?

2023-11-17

最困难的事情就是认识自己!

个人网站 ,欢迎访问!

前言:

最近线上环境某个接口服务响应时间偏长,导致用户体验超差,那平时该怎么快速的排查这类问题呢?

①、为代码添加上详细的打印日志; 不建议 ,一是线上环境,没法随便的重新部署更换了详细日志的代码,二是 添加详细的日志输出,那就意味这会生成大量的日志文件,这些日志文件会占据大量服务器磁盘空间。

②、搭建一个模拟了线上环境的测试环境进行复盘排查;额,出现了这种问题哪有那么多的时间让你进行环境复盘排查,所以此方案也是 不建议的

③、线上诊断神器 Arthas ,这个工具是阿里开源的,专门用于线上环境问题排查的,这个工具提供了很多 的 命令 用来排查问题; 当出现上面的响应时间偏长的问题,就可以使用 Arthas 提供的 trace 命令进行排查,使用这个工具的 trace 命令可以统计到方法中整个调用链路上的所有性能开销和追踪调用链路,查找其中耗时比较长的方法再具体排查即可。

文章接下来将从两方面展开:

①、搭建模拟线上服务接口响应时间偏长的环境;SpringBoot 服务接口 + JMeter 模拟服务接口调用;

②、使用诊断神器 Arthas 提供的命令 trace 命令进行响应时间偏长的问题排查;

模拟线上环境:

1、SpringBoot 项目搭建,并且编写好服务接口;

注意:服务接口代码为了简便,只写了 一些大循环的代码 来模拟较长的耗时;除此之外,实际上还包含很多多其它常见的情况,例如:

①、服务接口方法中存在很多的 JDBC 操作 ,并且由于数据库中数据量太大,导致很多的 JDBC 查询非常耗时,并且此时可能由于还没有创建合适的索引,导致查询耗时更加的长,最终导致服务接口响应时间偏长;

②、此服务接口中调用了 其它的服务接口 ,由于内部调用的其它服务接口出现问题等,导致此其它服务接口执行耗时比较长,进而导致服务接口响应时间偏长;

服务接口代码如下:

test1、test2方法如下:

2、JMeter 模拟用户调用的测试脚本配置:

3、服务接口 SpringBoot 代码 和 JMeter 测试脚本的所在项目位置:

服务接口代码准备好后,使用IDEA开发工具将其导出为 Jar 包 。

服务接口代码和JMeter脚本获取地址: https://github.com/leishen6/springboot_arthas

为了模拟最为真实的线上环境,需将准备好的 服务接口 Jar 包放到 服务器中,然后使用命令 *java -jar .jar 运行起 Jar 包; 然后使用 JMeter 进行接口的调用,在 聚合报告 中发现平均响应时间偏长;如图:

如果有用户反映某功能响应时间太长了,别着急,根据下面的方法进行排查,绝对方便又快速的找到问题原因。

Arthas 问题排查:

1、首先需要下载阿里开源的Arthas 的诊断工具 Jar 包,下载地址:arthas-boot.jar ;然后将 Jar 包放到 部署服务接口项目的服务器中

2、然后使用 ps 命令,查询出当前运行服务接口的程序进程号;例如:本文章模拟的服务接口程序 Jar 包名称为 springboot_arthas-1.0.0.jar ,所以命令为: ps -ef | grep springboot_arthas-1.0.0

3、然后运行Arthas 诊断工具,命令:java -jar arthas-boot.jar ;开始运行的界面如图:

此时诊断工具还没有运行完,需要手动选择要诊断/监控的java 进程,并且此工具也会列出全部的java进程号,你只需要输入 它们最前的序号 [1] 即可;如图:

4、运行完后,可以使用 trace命令 监控服务接口方法中调用的其它方法的耗时;

trace 命令能主动搜索 class-patternmethod-pattern 对应的方法调用路径,渲染和统计整个调用链路上的所有性能开销和追踪调用链路。

具体命令格式: trace [全限定类名] [类中的方法名]

例如:监控本服务接口;

com.lyl.controller.TestController : 全限定类名,process:TestController 类中的方法;

具体命令: trace com.lyl.controller.TestController process

5、trace 命令执行结果展示,如图:

通过trace 命令监控统计的调用链路各个方法的执行耗时,可以发现调用的 com.lyl.util.StringUtil 类中的 test2() 方法执行耗时比较大;所以需要特别去查看这个方法的代码是否存在问题;如果这个代码中还存在许多的方法调用链路,则需要再次使用 trace 命令进行监控调用链路的耗时,找出具体可能存在问题的方法。

Arthas 阿里开源的诊断工具还提供了很多的命令供使用,大家可以去查看学习,地址:命令列表

注意:

①、使用Arthas 诊断的程序代码,在打包时 不能混淆 ,否则在使用trace 命令会报 类或方法找不到

②、在使用trace命令监控统计时,需要JMeter测试脚本正在运行调用服务接口,如果没有调用,则统计不到内部调用链路的耗时情况;

由于本人水平有限,如有问题,敬请提出;

不要忘记留下你学习的足迹 [点赞 + 收藏 + 评论]嘿嘿ヾ

一切看文章不点赞都是“耍流氓”,嘿嘿ヾ(◍°∇°◍)ノ゙!开个玩笑,动一动你的小手,点赞就完事了,你每个人出一份力量(点赞 + 评论)就会让更多的学习者加入进来!非常感谢! ̄ω ̄=

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

线上服务平均响应时间太长,怎么排查? 的相关文章

  • JMeter 与远程服务器

    我正在尝试以分布式模式设置 JMeter 我有一个在 ec2 实例上运行的服务器 我希望主服务器在我的本地计算机上运行 我不得不跳过一些希望让 RMI 在服务器上正常工作 但通过将 java rmi server hostname 设置为
  • Jmeter 性能-阶梯式性能指标监听

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读2 3k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • Jmeter 性能-阶梯负载最终请求数

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读2 3k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • JMeter 中默认的响应超时是多少?

    如果我们没有在 HTTP 请求 采样器中设置任何超时 任何人都可以帮助了解 JMeter 中的默认响应时间吗 Thanks 它默认为0 无超时 设置超时的推荐方法是使用 GUI 如果由于某种原因它不适合您 您可以使用以下属性 用户属性 fi
  • 使用 XPATH 子字符串函数

    我需要帮助弄清楚这个 XPATH 子字符串函数 但我无法使用它 我尝试过这种方法的各种变体 a contains text Home href substring jsessionid 12 尝试从此标签获取 jsessionid 值 a
  • Jmeter 而控制器似乎没有将变量评估为数字

    我正在编写一个 jmeter 脚本 该脚本会不断加载数据 直到表达到指定的大小 我有一个 while 循环 其中有一个 HTTP 采样器来加载数据 然后是另一个带有 XPath 后处理器的 HTTP 采样器来检查表大小 它们调用两个不同的
  • jmeter无法记录浏览器操作

    我正在使用 apache jmeter 2 6 我想使用 HTTP 代理服务器记录浏览器操作 但动作并没有记录 我已经在线程组下定义了 HTTP 请求默认值 我为服务器名称指定了值 如下所示 http www xxxxx com 81 ht
  • JMeter 记录使用 HTTPS 的 iOS 本机应用程序会导致 SSL 握手问题

    我有一个用于我们的应用程序的 IPAD 混合应用程序 它会在登录过程中尝试访问我们的 https 服务器 我想使用 JMeter 来记录这个简单的流程 我正在本地计算机上运行 JMeter 代理服务器 我更新了 IPAD 代理详细信息 以便
  • 如何使用 JMeter 发送动态 URL 参数

    我想将 URL PATH 发送为 controller 1 1 controller 2 2 start 但是参数 2controller 2是动态的 如何发送该参数 使参数成为变量 controller 2 controller2 par
  • Jmeter中的“延迟时间”与“连接时间”有什么区别?

    我是jmeter 3 1用户 我不清楚 延迟时间 与 连接时间 的区别 事实上 在jmeter官方文档中 是这样说的 新的连接时间指标 connectTime 表示建立连接的时间 默认情况下 它不会保存到 CSV 或 XML 要保存它 请添
  • jmeter-如何获取当前日期和时间(以秒为单位)

    我想计算当前时间 以秒为单位 并将其用作我的 jmeter 测试计划中的参数 默认情况下 时间以毫秒为单位 有人可以帮我吗 您可以使用 time 函数 http jmeter apache org usermanual functions
  • 负载测试kafka消费者

    我正在编辑问题 因为我认为它不够清楚 如何对我的 kafka 消费者进行负载测试 我看过很多关于 apache kafka 负载测试的文章 但没有一篇关于消费者负载测试的文章 对于前 我在jsr223中编写了jmeter kafka生产者测
  • 我有 JSR233 监听器,它在 JMeter 非 GUI 模式下似乎被忽略

    我在 HTTP 请求下有 JSR233 侦听器 它存储所有响应时间值 创建数组 然后对数组进行排序以查找 90 行 然后在达到最终 90 行阈值时标记最后一个事务 请求通过或失败 GUI 中的一切都运行完美 但我使用 Docker Imag
  • 在 JMeter 中,您可以指定变量来填充 HTTP 请求默认值吗?

    我希望能够从 CSV 文件中读取值 或者更理想的是 properties使用 JMeter 文件 然后在多个中使用它Test Plan是在HTTP Request Defaults as the Server Name or IP 以及Po
  • 尝试使用 JMeter API 生成 JMeter 测试计划 (jmx):从代码创建的 jmeter jmx 文件与 JMeter 创建的文件不匹配

    我正在尝试使用 jmeter java api 创建 jmeter jmx 文件 这就是我所做的 gui jmx 使用 jmeter gui 应用程序创建一个参考 jmx 文件 我可以将其进行比较 对于测试计划 我仅添加一个线程组和线程组内
  • 无法在fiddler中捕获jmeter流量

    我创建了 JMeter 记录 但当我开始测试时 我在 Fiddler 中没有看到任何请求 我改变了 Fiddler 中的端口号为 8080 我在 JMeter 中使用该端口号 Steps 创建线程组 将Http请求添加到线程组并输入URL
  • JMeter:如何访问 ForEach 控制器内的循环计数器?

    我在 JMeter 中有一个 ForEach 控制器 如何访问此控制器内循环的计数器 通过变量 然后使用它来创建新变量 Put 计数器配置元素 http jmeter apache org usermanual component refe
  • JMeter:tearDown Thread Group的目的是什么

    我想了解JMeter中tearDown Thread Group的实际用法 在什么场景下可以使用tearDown Thread Group 根据提供的帮助JMeter 拆解线程组 http jmeter apache org userman
  • 如何使用脚本在 Jmeter 容器中设置变量及其值,例如用户参数

    我需要在 Jmeter 中设置和获取变量以实现 API 自动化 我正在使用 groovy 脚本来实现同样的目的 我可以使用以下代码将键值存储在属性文件中 props put shubhamKey shubhamValue 我不想使用 mai
  • 如何让Jmeter识别“localhost”URL?

    如何对只能由我的计算机访问的 localhost url 进行性能测试 我可以使用 jmeter 对 google 等实时网站进行性能测试 但 jmeter 无法检测本地 url 应用程序的 URL 192 168 121 20 80012

随机推荐

  • 双线性插值原理分析及c++实现

    双线性插值原理分析及C 实现 双线性插值 又称为双线性内插 其核心思想利用虚拟点四周真实存在的四个像素点分别在两个方向上进行线性插值操作 公式推导过程 上述图片中像素点的说明 Q11 Q21 Q12 Q22 分别为虚拟点周围四个真实存在的像
  • MATLAB中reshape的使用方法整理

    1 语法 1 B reshape A m n 将矩阵A的元素返回到一个m n的矩阵B 如果A中没有m n个元素则返回一个错误 2 B reshape A m n p or B reshape A m n p 把A中元素进行重塑成m n p
  • 使用jenkins部署项目

    使用jenkins部署项目 IP 安装环境 系统 192 168 201 147 tomcat jenkins centos8 redhat8 192 168 201 149 tomcat centos8 redhat8 需求 通过192
  • WPF_性能优化

    WPF Windows Presentation Foundation 是微软推出的基于Windows的用户界面框架 运行在 NET Framework 3 0及以上版本 WPF是基于DirectX引擎的 支持GPU硬件加速 在不支持硬件加
  • 任务 01、重塑视觉艺术:Midjourney AI绘画的无限可能

    1 1 任务目标 了解什么是MidJourney MidJourney公司简介 了解生成式人工智能MidJourney原理 MidJourney 能做什么 目前市面主流的Ai绘画工具有哪些 MidJourney的商业价值与企业应用 1 2
  • js逆向-ast-hook定位参数生成位置

    声明 本文仅供参考学习 切勿用于其他途径 违者后果自负 前言 不了解ast hook的小伙伴可以翻看上一篇文章 链接 ast hook 以一个简单的网站为例 网址 aHR0cHM6Ly93d3cueGluaXVkYXRhLmNvbS8 接口
  • 算法与数据结构学习笔记

    文章目录 常用排序方式的时间 空间复杂度以及稳定性的总结 1 冒泡排序 2 选择排序 3 插入排序 4 希尔排序 基于插入排序 注意对比 5 归并排序 6 快速排序 最流行的排序算法 大多数情况都是最快的 7 堆排序 找出前几个前几个最大的
  • Ha-NeRF: Hallucinated Neural Radiance Fields in the Wild 代码复现与解读

    code GitHub rover xingyu Ha NeRF CVPR 2022 Ha NeRF Hallucinated Neural Radiance Fields in the Wild CVPR 2022 Ha NeRF Hal
  • 【批处理DOS-CMD-汇总】扩展变量-延迟变量cmd /v:on、cmd /v:off、setlocal enabledelayedexpansion、DisableDelayedExpansion

    Reference 批处理命令 for kaizen 博客园 Bat脚本之延时变量cmd v on komomon s blog的博客 CSDN博客 bat延迟变量 一 延迟变量 的存在背景 批处理的执行过程是 自上而下 逐条执行 而 逐条
  • Vue项目部署到服务器时上传报错“Uncaught (in promise) TypeError: s.upload.addEventListener is not a function”

    一 报错原因 使用vue admin element框架进行在本地文件上传以及富文本框中的文件上传是没有问题的 但是在上传部署vue项目到服务器上时 就会报如下图中一个错误 二 那么应该怎么解决呢 可以查找如下两个文件 并且进行对应值的修改
  • mysql查询时间datetime指定区间的所有值

    DROP TABLE IF EXISTS flight CREATE TABLE flight id int 11 NOT NULL start time datetime NOT NULL end time datetime NOT NU
  • python中有堆吗?

    堆 英语 heap 是计算机科学中一类特殊的数据结构的统称 堆的定义 n个元素的序列 k1 k2 ki kn 当且仅当满足下关系时 称之为堆 推荐学习 Python基础视频教程 这是标准的堆的定义 但是python 中并没有独立的堆类型 只
  • 微信小程序开发教程

    一 准备 下载微信小程序开发者工具 下载地址 注册微信小程序 前往注册 微信小程序开发文档 前往阅览 打开开发者工具 用微信扫码进入创建页面 填写配置如下 需要注意的是 AppId可以选择已经注册的账号Appid 也可以选择测试号 区别是测
  • 论文R语言复现

    高斯混合概率在众多领域都有重要应用 依据已知观测数据估计高斯模型中未知参数就显得尤为重要 由于观测值具体来自于高斯分布的哪个分模型是未知的 那么利用传统的极大似然 MLE 方法进行参数估计就变得十分困难 引入 EM 算法 该方法通过构造分布
  • [C++]模版特例化和模版偏特化

    函数模版特例化 例子 第一个版本 可以比较任意两个类型 template
  • 【事件驱动】【数码管识别】一(数码管检测(矩形检测函数解读))

    1 根据轮廓的三个点两条线的夹角 三点的位置关系 两个向量的夹角的余弦值等于两个向量的向量积除以两个向量的数量积 两个向量垂直则余弦值接近于0 该函数返回的就是余弦值 1e 10是1 10的负10次方 为了转换为doule型 2 找出矩形
  • C/C++之宏定义函数

    注意事项 1 将宏定义中的参数和整个宏 用 括起来 2 在宏定义结束的后面 不要加 宏定义只是简单的进行字符串替换 会把 也替换过去 include
  • Spring-1

    struts web层 比较简单 ValueStack值栈 拦截器 hibernate dao层 知识点杂 spring service层 重要 讲多少用多少 gt 了解 spring day01 基础 IoC控制反转 DI依赖注入 整合J
  • 安装完nodejs后在powershell使用node命令报错

    安装完nodejs后 在cmd中可以正常启动node 但是在powershell中出现如下错误 解决方法 鼠标右键点击计算机 打开属性 点击高级系统设置 然后打开环境变量 如下图所示 然后在下面的系统变量点击新建 添加如下图所示变量 然后编
  • 线上服务平均响应时间太长,怎么排查?

    最困难的事情就是认识自己 个人网站 欢迎访问 前言 最近线上环境某个接口服务响应时间偏长 导致用户体验超差 那平时该怎么快速的排查这类问题呢 为代码添加上详细的打印日志 不建议 一是线上环境 没法随便的重新部署更换了详细日志的代码 二是 添