加入收藏 | 设为首页 | 会员中心 | 我要投稿 东莞站长网 (https://www.0769zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

Java 性能瓶颈分析工具 你知道几个?

发布时间:2019-05-12 04:23:51 所属栏目:优化 来源:程序猿说
导读:0. Introduction Java 性能优化分为很多个方面,如系统优化、算法优化、代码优化等。代码优化是指开发人员在研发、测试过程中使用性能瓶颈分析工具快速定位出由于编码存在的性能瓶颈问题并持续进行优化。一种很常见的场景是测试同学在对服务进行压测时,无

最近,在升级网关的核心功能模块之后与测试同学一起合作对网关的某些 API 接口进行性能压力测试,利用压测机 Jmeter 模拟多用户并发请求。但不管怎么增加并发数,每分钟的请求总量稳定保持在 4 万/min,TPS 也一直在 650 左右波动,而且所有服务器的 CPU、内存、网络、IO 占用率均不高。

针对这种情况,我们首先排除了业务方的性能问题,因此直接对业务方(2 核 8G)发起并发请求,TPS 都可以达到 800 左右的并发数。其次,我们也排除了接入层 SLB、OpenResty 的问题,因为网关未升级核心功能情况下单台网关的 TPS 很容易达到 4000 左右。

因此,根据以上分析基本可以确定性能瓶颈出在网关处理请求的过程中。

在网关的 JVM 启动参数中增加 JFR 启动参数:

  1. -XX:+UnlockCommercialFeatures -XX:+FlightRecorder 

Java 性能瓶颈分析工具

使用 JFR 的事件视图点击堆栈跟踪,就可以查看到代码调用链,看到自己的业务代码,从而定位到最耗时的代码位置。

下图很清楚展示了来自客户端每个请求主要的事件都耗费在调用 Redis 读取 API 元信息,每一次读取源信息都需要进行序列化与反序列化,导致平均响应时间增加网关处理请求时间加长,因此 TPS 下降并一直稳定在某个值。解决方案 API 元信息尽可能缓存到本地 JVM 内存,优先从本地内存读取数据减少访问 Redis 频次。

当然系统 TPS 上不去的原因也不能仅仅从单一维度分析,要综合起来多维度进行分析,如网络带宽、连接池、Java 内存管理、HTTP 通信机制、业务逻辑、系统架构(缓存、数据库等)等等。

2. Tprofiler

TProfiler 是淘宝开源的一个可以在生产环境长期使用的性能分析工具。它同时支持剖析和采样两种方式,记录方法执行的时间和次数,生成方法热点、对象热点、线程状态分析等数据,为查找系统性能瓶颈提供数据支持。

TProfiler 在 JVM 启动时把时间采集程序注入到字节码中,整个过程无需修改应用源码。运行时会把数据写到日志文件,一般情况下每小时输出的日志小于 50M。目前 TProfiler 已应用于淘宝的核心 Java 前端系统,部署后低峰期对应用响应时间影响 20% 高峰期对吞吐量大约有 30% 的降低。

2.1 配置部署

  • 安装 TProfiler

直接下载完整安装包或者下载源码运行 package.bat 脚本或者执行 mvn assembly:assembly命令生成 tprofiler.jar 即可。

  • 配置 profile.properties

profile.properties 作为 tprofiler.jar 的配置文件,可以根据实际情况进行调整。

  1. #log file name 
  2. logFileName = tprofiler.log 
  3. methodFileName = tmethod.log 
  4. samplerFileName = tsampler.log 
  5. #basic configuration items 
  6. startProfTime = 19:00:00 #开始进行profile的时间 
  7. endProfTime = 23:00:00 #结束profile的时间 
  8. eachProfUseTime = 5 #profile时间长度(单位秒) 
  9. eachProfIntervalTime = 50#两次profile的时间间隔(单位秒) 
  10. samplerIntervalTime = 20 #两次采样的时间间隔 
  11. port = 50000  
  12. debugMode = false  
  13. needNanoTime = false 
  14. ignoreGetSetMethod = true 
  15. #file paths 
  16. logFilePath = /home/admin/tprofiler/logs/${logFileName} 
  17. methodFilePath = /home/admin/tprofiler/logs/${methodFileName} 
  18. samplerFilePath = /home/admin/tprofiler/logs/${samplerFileName} 
  19. #include & excludes items 
  20. excludeClassLoader = org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader 
  21. includePackageStartsWith = com.taobao;com.taobao.common 
  22. excludePackageStartsWith = com.taobao.sketch;org.apache.velocity;com.alibaba;com.taobao.forest.domain.dataobject 
  • 配置 JVM 进程

(编辑:东莞站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!