不改一行代码定位线上性能问题

JAVA线上常见问题排查手段 在平时开发过程中,对于线上问题的排查以及系统的优化,免不了和Linux进行打交道。每逢大促和双十一,对系统的各种压测性能测试,优化都是非常大的一次考验。抽空整理了一下自己在线上问题排查以及系统优化的一些经验。 一、系统性能瓶颈在哪 我们常常提到项目的运行环境,那么运行环境包括哪些呢?一般包括你的操作系统、CPU、内存、硬盘、网络带宽、JRE环境、你的代码依赖的各种组件等等。所以系统性... 阅读详情

背景

最近时运不佳,几乎天天被线上问题骚扰。前几天刚解决了一个 HashSet 的并发问题,周六又来了一个性能问题。

大致的现象是:

我们提供出去的一个 OpenAPI 反应时快时慢,快的时候几十毫秒,慢的时候几秒钟才响应。

尝试解决

如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:854630135,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。

由于这种也不是业务问题,不能直接定位。所以尝试在测试环境复现,但遗憾的测试环境贼快。

没办法只能硬着头皮上了。

中途有抱着侥幸心里让运维查看了 Nginx 里 OpenAPI 的响应时间,想把锅扔给网络。结果果然打脸了;Nginx 里的日志也表明确实响应时间确实有问题。

为了清晰的了解这个问题,我简单梳理了这个调用过程。

 

整个的流程算是比较常见的分层架构:

  • 客户端请求到 Nginx。
  • Nginx 负载了后端的 web 服务。
  • web 服务通过 RPC 调用后端的 Service 服务。

日志大法

我们首先想到的是打日志,在可能会慢的方法或接口处记录处理时间来判断哪里有问题。

但通过刚才的调用链来说,这个请求流程不短。加日志涉及的改动较多而且万一加漏了还有可能定位不到问题。

再一个是改动代码之后还会涉及到发版上线。

工具分析

所以最好的方式就是不改动一行代码把这个问题分析出来。

这时就需要一个 agent 工具了。我们选用了阿里以前开源的 Tprofile 来使用。

只需要在启动参数中加入 -javaagent:/xx/tprofiler.jar 即可监控你想要监控的方法耗时,并且可以给你输出报告,非常方便。对代码没有任何侵入性同时性能影响也较小。

工具使用

如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:854630135,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。

下面来简单展示下如何使用这个工具。

首先第一步自然是 clone 源码然后打包,可以克隆我修改过的源码。

因为这个项目阿里多年没有维护了,还残留一些 bug,我在它原有的基础上修复了个影响使用的 bug,同时做了一些优化。

执行以下脚本即可。

 
git clone https://github.com/crossoverJie/TProfiler mvn assembly:assembly 

到这里之后会在项目的 TProfiler/pkg/TProfiler/lib/tprofiler-1.0.1.jar 中生成好我们要使用的 jar 包。

接下来只需要将这个 jar 包配置到启动参数中,同时再配置一个配置文件路径即可。

这个配置文件我 copy 官方的解释。

 
#log file name logFileName = tprofiler.log methodFileName = tmethod.log samplerFileName = tsampler.log #basic configuration items # 开始取样时间 startProfTime = 1:00:00 # 结束取样时间 endProfTime = 23:00:00 # 取样的时间长度 eachProfUseTime = 10 # 每次取样的时间间隔 eachProfIntervalTime = 1 samplerIntervalTime = 20 # 端口,主要不要冲突了 port = 50000 debugMode = false needNanoTime = false # 是否忽略 get set 方法 ignoreGetSetMethod = true #file paths 日志路径 logFilePath = /data/work/logs/tprofile/${logFileName} methodFilePath =/data/work/logs/tprofile/${methodFileName} samplerFilePath =/data/work/logs/tprofile/${samplerFileName} #include & excludes items excludeClassLoader = org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader # 需要监控的包 includePackageStartsWith = top.crossoverjie.cicada.example.action # 不需要监控的包 excludePackageStartsWith = com.taobao.sketch;org.apache.velocity;com.alibaba;com.taobao.forest.domain.dataobject 

最终的启动参数如下:

 
-javaagent:/TProfiler/lib/tprofiler-1.0.1.jar -Dprofile.properties=/TProfiler/profile.properties 

为了模拟排查接口响应慢的问题,我用 cicada 实现了一个 HTTP 接口。其中调用了两个耗时方法:

 

这样当我启动应用时,Tprofile 就会在我配置的目录记录它所收集的方法信息。

我访问接口 http://127.0.0.1:5688/cicada-example/demoAction?name=test&id=10 几次后它就会把每个方法的明细响应写入 tprofile.log。

 

由左到右每列分别代表为:

线程ID、方法栈深度、方法编号、耗时(毫秒)。

但 tmethod.log 还是空的;

这时我们只需要执行这个命令即可把最新的方法采样信息刷到 tmethod.log 文件中。

 
java -cp /TProfiler/tprofiler.jar com.taobao.profile.client.TProfilerClient 127.0.0.1 50000 flushmethod flushmethod success 

其实就是访问了 Tprofile 暴露出的一个服务,他会读取、解析 tprofile.log 同时写入 tmethod.log.

其中的端口就是配置文件中的 port。

再打开 tmethod.log :

 

其中会记录方法的信息。

  • 第一行数字为方法的编号。可以通过这个编号去 tprofile.log(明细)中查询每次的耗时情况。
  • 行末的数字则是这个方法在源码中最后一行的行号。

其实大部分的性能分析都是统计某个方法的平均耗时。

所以还需要执行下面的命令,通过 tmethod.log tprofile.log来生成每个方法的平均耗时。

 
java -cp /TProfiler/tprofiler.jar com.taobao.profile.analysis.ProfilerLogAnalysis tprofiler.log tmethod.log topmethod.log topobject.log print result success 

打开 topmethod.log 就是所有方法的平均耗时。

 

  • 4 为请求次数。
  • 205 为平均耗时。
  • 818 则为总耗时。

和实际情况是相符的。

方法的明细耗时

这是可能还会有其他需求;比如说我想查询某个方法所有的明细耗时怎么办呢?

官方没有提供,但也是可以的,只是要麻烦一点。

比如我想查看 selectDB() 的耗时明细:

首先得知道这个方法的编号,在 tmethod.log 中可以看查到。

 
2 top/crossoverjie/cicada/example/action/DemoAction:selectDB:84 

编号为 2.

之前我们就知道 tprofile.log 记录的是明细,所以通过下面的命令即可查看。

 
grep 2 tprofiler.log 

 

通过第三列方法编号为 2 的来查看每次执行的明细。

但这样的方式显然不够友好,需要人为来过滤干扰,步骤也多;所以我也准备加上这样一个功能。

只需要传入一个方法名称即可查询采集到的所有方法耗时明细。

总结

回到之前的问题;线上通过这个工具分析我们得到了如下结果。

  • 有些方法确实执行时快时慢,但都是和数据库相关的。由于目前数据库压力较大,准备在接下来进行冷热数据分离,以及分库分表。
  • 在第一步操作还没实施之前将部分写数据库的操作改为异步,减小响应时间。
  • 考虑接入 pinpoint 这样的 APM工具。

类似于 Tprofile 的工具确实挺多的,找到适合自己的就好。

在还没有使用类似于 pinpoint 这样的分布式跟踪工具之前应该会大量依赖于这个工具,所以后续说不定也会做一些定制,比如增加一些可视化界面等,可以提高排查效率。

如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:854630135,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。

Pytorch Unet多类别语义分割实战:数据管线、训练与避坑指南 语义分割是计算机视觉中实现像素级分类的核心技术,其原理是通过编码器-解码器结构对每个像素预测类别标签。在Pytorch下,Unet凭借跳跃连接成为多类别分割的常用方案,技术价值在于能同时捕捉全局上下文与局部细节。典型应用场景包括自动驾驶路面识别、医学影像分析等。然而,工程实践中数据管线构建与训练调优往往比网络结构更关键,例如标注颜色到类别索引的转换、类别不均衡处理以及掩码插值错误等。本文围绕Pytorch Unet多类别语义分割,详细拆解从数据准备到模型训练的全流程,并给出常见翻车点的排查方法。 阅读详情

相关推荐

基于STM32 FOC下桥三电阻采样方式的电机相电流重构方法

如何提高三电阻采样的调制率

wanrenqi的博客 9200

性能测试如何定位瓶颈

服务器性能监控: Nmon介绍 Nmon 工具是 IBM 提供的免费的在AIX与各种Linux操作系统上广泛使用的监控与分析工具。该工具可将服务器的系统资源耗用情况收集起来并输出一个特定的文件,并可利用 excel 分析工具nmonanalyser进行数据的统计分析。并且,nmon运行不会占用过多的系统资源,通常情况下CPU利用率不会超过2%。针对不同的操作 系统版本,nmon有相应版本的

pan-zy的专栏 1万+

ADS 2013安装教程

1.2013和2014安装过程是一样的,运行ads2013_06_shp_windows文件进行安装 2.点击“NEXT”。 3.选择I accept,然后点击“NEXT”。 4.选择“complete”,然后点击“NEXT”。 5.选择安装路径,最好默认安装路径,安装路径不要有中文,然后点击“NEXT”。 6.点击“NEXT”. 7.如下路径默认安装,然后点击“NEXT”。 8.点击“NEXT”。 ...

谢谢关注“小鱼教你模数电”,各平台同号 6009

应用监控预警--Pinpoint介绍

转自:https://skyao.gitbooks.io/learning-pinpoint/content/introduction/data.html Pinpoint 翻译自 Pinpoint 的 github 首页内容 介绍 Pinpoint是一个开源的 APM (Application Performance Management/应用性能管理)工

写个代码 扯个闲淡 4万+

ADS2016子电路封装避坑指南:手把手教你制作可复用的自定义Symbol

本文详细介绍了在ADS2016中制作可复用的自定义Symbol的全流程,重点解析了子电路封装的常见问题与解决方案。从电路模块的标准化处理、Hierarchy创建技巧到Symbol视觉优化和库管理策略,帮助工程师提升射频与微波电路设计效率。特别针对Symbol比例适配和引脚优化等核心问题,提供了实用的避坑指南和工程验证方法。

weixin_30275415的博客 221

PyQt5 使用QSqlDatabase连接Mysql数据库时Driver not loaded Driver not loaded

PyQt5 使用QSqlDatabase连接Mysql数据库时Driver not loaded Driver not loaded

睡觉不打呼噜的博客 1566

老板让我不改一行代码,定位线上性能问题!

文章内容 背景 最近时运不佳,几乎天天被线上问题骚扰,周六又来了一个性能问题。 大致的现象是: 我们提供出去的一个 OpenAPI 反应时快时慢,快的时候几十毫秒,慢的时候几秒钟才响应。 尝试解决 由于这种也不是业务问题,不能直接定位。所以尝试在测试环境复现,但遗憾的测试环境贼快。 没办法只能硬着头皮上了。 中途有抱着侥幸心里让运维查看了 Nginx 里 OpenAPI 的响应时间,想把锅扔给网络...

gt9000的博客 151

【kubeEdge】离线部署

根据k8s的这个规则,可以将节点通过 label 的方式进行分组,比如将某几个节点都打上标签为 name=edge,当调度应用到 edge 节点时,会找到 label 为 edge 的所有节点,根据设置的副本数,将应用启动起来,如果设置的副本数超过了设置 edge 标签的节点数,则多出的将会显示 pending 状态,从而无法启动。清除 keadm init 或 keadm join 造成的影响均可使用 keadm reset,这个操作会删除 /etc/kubeedge 下的文件,如有需要请提前备份。

qq_42944740的博客 1717

不改一行代码定位线上性能问题,可能吗?

最近时运不佳,几乎天天被线上问题骚扰。前几天刚解决了一个HashSet的并发问题,周六又来了一个性能问题。 大致的现象是: 我们提供出去的一个OpenAPI反应时快时慢,快的时候几十毫秒,慢的时候几秒钟才响应。 一、尝试解决 由于这种不是业务问题,不能直接定位。所以尝试在测试环境复现,但遗憾的是测试环境贼快。 没办法,只能硬着头皮上了。 中途有抱着侥幸心里让运维查看了Nginx里OpenAPI的响...

Dinosaur_1117的博客 339

避坑指南:麒麟系统ARM架构下PostGIS离线安装常见问题解析

本文深度解析了在国产麒麟系统ARM64架构下进行PostGIS离线安装的完整路径与核心避坑点。通过对比Docker容器化与源码编译两种部署方式的优劣,详细阐述了离线Docker环境搭建、ARM64镜像获取验证、容器化配置及常见故障排查的全流程,为在特殊环境下稳定部署空间数据库提供了一套可靠的实践指南。

Python的专栏 287

【YOLOv8改进-损失函数】 YOLOv8自带损失函数CIoU / DIoU / GIoU 详解,以及如何切换损失函数

在介绍YOLOv8中的各种Iou之前,我们先来了解了解目标检测中的损失函数。目标检测模型通常包含两类损失函数:类别损失(分类)和位置损失(回归)。这两类损失函数用于检测模型的最后一部分,根据模型的输出(类别和位置)以及实际标注框(类别和位置),分别计算类别损失和位置损失。

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 5191

SIMATIC IOT2000工业网关:边缘采集、协议转换与断网续传落地

工业网关是连接现场设备与云端平台的边缘节点,其核心原理是在靠近数据源的一侧完成协议转换、数据清洗、死区压缩与本地缓存,再通过 MQTT 等标准协议向上传输。相比单纯透传,边缘计算可降低带宽与云端算力开销,并在网络中断时依靠断网续传保障数据连续性。该类方案适用于 PLC、变频器、温控表等老旧设备混杂的产线采集,也适合配电柜内无人值守的协议汇聚场景。围绕 SIMATIC IOT2000/IOT2050 的选型、双网口隔离、Modbus 轮询规划、容器部署与稳定性加固,可形成可复用的工业数据采集落地路径。

weixin_34037515的博客 238

UFSV3.1-RPMB实现与测试

UFS RPMB功能验证与测试指南 本文介绍了UFS(通用闪存存储)中RPMB(重放保护内存块)的功能验证与测试方法。主要内容包括: RPMB基础配置: 在Linux系统中查看RPMB设备节点 读取RPMB单元描述符获取配置信息 配置RPMB区域大小(16MB)和使能状态 RPMB特性验证: 获取单次写最大请求(16KB) 测试未编程认证密钥时的读写操作 验证认证密钥编程过程 测试用例: 包含4个测试用例,验证RPMB在不同状态下的行为 提供了详细的命令行操作和预期结果 本文可作为UFS RPMB功能验证。

小码哥的博客 1256

jni调用耗时吗_不改一行代码定位线上性能问题,可能吗?

最近时运不佳,几乎天天被线上问题骚扰。前几天刚解决了一个HashSet的并发问题,周六又来了一个性能问题。大致的现象是:我们提供出去的一个OpenAPI反应时快时慢,快的时候几十毫秒,慢的时候几秒钟才响应。一、尝试解决由于这种不是业务问题,不能直接定位。所以尝试在测试环境复现,但遗憾的是测试环境贼快。没办法,只能硬着头皮上了。中途有抱着侥幸心里让运维查看了Nginx里OpenAPI的响应...

weixin_39610488的博客 779

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

【好文分享】老板让我不改一行代码,定位线上性能问题

文章概要 背景 最近时运不佳,几乎天天被线上问题骚扰,周六又来了一个性能问题。 大致的现象是: 我们提供出去的一个 OpenAPI 反应时快时慢,快的时候几十毫秒,慢的时候几秒钟才响应。 尝试解决 由于这种也不是业务问题,不能直接定位。所以尝试在测试环境复现,但遗憾的测试环境贼快。 没办法只能硬着头皮上了。 中途有抱着侥幸心里让运维查看了 Nginx 里 OpenAPI 的响应时间,想把锅扔给网络...

gt9000的博客 177

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Arthas神器:在线诊断、性能调优、动态改代码,10 分钟定位线上bug

Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。(阿尔萨斯)是阿里开源的Java诊断工具,主打“

liuhm的博客 1980
上一篇: RabbitMQ如何解决各种情况下丢数据的问题
下一篇: 四种途径提高RabbitMQ传输消息数据的可靠性(一)
javaQQ群 866865133
博客等级 码龄8年 59粉丝 309原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值