JFR详细介绍与生产问题定位落地 - 3. 各种Event详细说明与调优策略(1)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: JFR详细介绍与生产问题定位落地 - 3. 各种Event详细说明与调优策略(1)

Event 采集详细配置


目前,JDK 11 一共有136个 Event 采集配置。这里会比较详细的去看每一个Event,并说明基本应用,建议配置。如果 default.jfc 中没有打开或者需要修改的配置,会将配置文件代码发出来。


1. JFR 相关 Event


一共4个 Event,但是需要关心的就下面这两个

  • Data Loss:数局丢失 Event,当有数据发生丢失时,会有这个Event 进行记录。包括开始时间,Amount(本次丢失多少事件),Total(一共丢失多少事件)
  • Recording Setting:记录详细配置采集 Event,会在每次产生新的 Data Chunk 的时候采集一次所有的 Event 的详细配置并记录到这个 Event 中。

这些在 default.jfc 中默认打开


2. JAVA 应用相关


2.1. TLAB 相关

众所周知,TLAB (Thread Local Allocation Buffer)目的是为类进行内存快速分配。堆内存所有线程共享访问,所以在堆内存上面分配对象,就会锁定整个堆,这样效率太低。TLAB 是位于堆内存上面的一块内存区域,在为每个线程分配 TLAB 的时候才会锁定堆(G1 是CAS分配)。分配对象的时候,优先从线程的 TLAB 上分配,这样就不用和其他线程同步。当对象比较大的时候,例如对于 G1 来说, HeapRegionSize 配置大小的一半以上的对象就被认为是大对象,大对象的分配不会发生在 TLAB,不在 TLAB 发生的对象分配会涉及到线程同步。

这是比较笼统的看法,针对于 G1,这个算法更加复杂。为了能说明 JFR 相关事件的意义,这里继续深入一下关于 G1 TLAB 相关原理。

创建一个对象时:

  1. 首先尝试从线程现有的TLAB空间分配内存
  2. 如果剩余空间不足,查看是否能分配一个新的TLAB,再分配内存给对象
  3. TLAB 的实现内部,每个线程维护一个 refill_waste 的变量,根据这个变量的值决定是否能分配一个新的TLAB。这个变量会根据一定算法随着线程的运行不断变化
  4. 同时, 每个线程的 TLAB 大小也是随着线程运行不断变化的
  5. 当 TLAB 剩余空间不足时,查看当前 TLAB 的剩余大小,如果小于 refill_waste 当前值,则认为 TLAB 该扩容了,需要分配一个新的TLAB,这时候,JFR 会产生一条 ObjectAllocationInNewTLAB Event 记录;如果不小于,则认为这个 TLAB 还不算满,当前这个对象直接走堆上内存分配,不从 TLAB 分配,这时会产生一条 ObjectAllocationOutsideTLAB Event 记录。

涉及的 Event 以及默认配置:

  • ObjectAllocationInNewTLAB: TLAB 扩容时产生的 Event
  • 在 default.jfc 中默认没有打开,可以通过向导配置 memory-profiling 调为 memory-profiling-enabled-medium 打开
  • 也可以用高级配置配置这个 Event 是否采集,以及堆栈是否采集 -采集内容包括:时间,线程,本次需要分配内存大小,对象类型,当前 TLAB 大小


  • ObjectAllocationOutsideTLAB:
  • 在 default.jfc 中默认没有打开,可以通过向导配置 memory-profiling 调为 memory-profiling-enabled-medium 打开
  • 也可以用高级配置配置这个 Event 是否采集,以及堆栈是否采集
  • 采集内容包括:时间,线程,本次需要分配内存大小,对象类型


这两个的采集,对性能影响比较大,不能长期跑。尤其是在启用堆栈收集后,影响就更大了。一般考虑动态打开。


一般应用:

  1. 对于上一节里面需要确定 HeapRegionSize 大小的时候,可以考虑采集一段时间内的 ObjectAllocationOutsideTLAB Event,查看最大需要的内存大小是多少。
  2. 如果考虑通过减少内存分配,来减少 GC,或者定位大内存分配代码位置,可以打开这两个 Event 的采集,查看造成这些事件的热点堆栈是哪里,以此优化代码。


配置打开示例:

<event name="jdk.ObjectAllocationInNewTLAB">
      <setting name="enabled">true</setting>
      <setting name="stackTrace">true</setting>
    </event>
    <event name="jdk.ObjectAllocationOutsideTLAB">
      <setting name="enabled">true</setting>
      <setting name="stackTrace">true</setting>
    </event>

事件 jmc 查看示例:


微信图片_20220624121853.jpg

微信图片_20220624121856.jpg


2.2. 文件操作相关

主要涉及三个 Event:

  • FileForce:强制写的时候,会产生这个 Event
  • FileRead:文件读的时候,会产生这个 Event
  • FileWrite:文件写的时候,会产生这个 Event

FileChannel举例:

try (RandomAccessFile reader = new RandomAccessFile("src/test/resources/test_read.in", "rw");
    FileChannel channel = reader.getChannel();
    ByteArrayOutputStream out = new ByteArrayOutputStream()) {
    int bufferSize = 1024;
    ByteBuffer buff = ByteBuffer.allocate(bufferSize);
    channel.read(buff); //产生 FileRead
    channel.write(buff); // 产生 FileWrite
    channel.force(true); // 强制不写入高速缓存,直接写入磁盘文件
    channel.write(buff); // 产生 FileForce
}

这三个事件配置可以采集堆栈,设置采集时间阈值。在 default.jfc 中,这三个事件默认都是采集的,堆栈采集打开,并且阈值是20ms。如果你的应用只是打日志用到了文件,那个这个默认配置就很足够了。尤其是对于 Log4j2 的异步日志,这个阈值是够用的。如果你的应用需要高频操作文件,例如 RocketMQ 的 日志文件(基于 mmap)的,则这个阈值最好改成10ms,因为对文件写入读取速度要求更高。

2.3. 异常与错误相关

主要涉及两个 Event:

  • Java Error Event:当有 Error 被 throw 时,会产生这个event, default.jfc 中默认开启这个采集,并且包括堆栈(配置项是 JavaErrorThrow)
  • Java Exception Event:当有 Exception 被 throw 时,会产生这个event,default.jfc 中默认不开启这个采集,并且包括堆栈(配置项是 JavaExceptionThrow)

我建议不用开启这两个 EVent 的采集,因为 Exception 我们可以通过日志分析, Error 一般框架都会有一些,一般与为我们的业务无关。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
6月前
|
存储 监控 Java
【深度挖掘Java性能调优】「底层技术原理体系」深入探索Java服务器性能监控Metrics框架的实现原理分析(Counter篇)
【深度挖掘Java性能调优】「底层技术原理体系」深入探索Java服务器性能监控Metrics框架的实现原理分析(Counter篇)
164 0
|
存储 数据采集 人工智能
以Trace为核心的根因分析概述
近期一直在学习和复现“根因分析”领域的相关文章,在这里跟大家一起分享下相关内容。这里不在赘述关于“可观测性”和“AIOps”的重要性和必要性,也不过多的陈述在“复杂系统”中进行快速根因诊断的必要性,直接进入到相关算法和系统设计部分。
1546 0
以Trace为核心的根因分析概述
|
28天前
|
运维 Prometheus 监控
持续监控和反馈:优化反馈机制与改进流程
持续监控和反馈:优化反馈机制与改进流程
42 1
|
6月前
|
消息中间件 SQL 运维
AIOps 智能运维:比专家经验更优雅的错/慢调用分析工具
本文主要介绍ARMS 错/慢 Trace 分析功能基本原理; 该功能能够覆盖哪些异常 Trace 根因; 最后会介绍一些最佳实践案例。
49930 26
|
Arthas 监控 Java
慢调用链诊断利器-ARMS 代码热点
慢调用链诊断利器-ARMS 代码热点
|
存储 安全 Java
深度探索JFR - JFR定位线上问题实例 - JFR导致的雪崩问题定位与解决
深度探索JFR - JFR定位线上问题实例 - JFR导致的雪崩问题定位与解决
深度探索JFR - JFR定位线上问题实例 - JFR导致的雪崩问题定位与解决
|
SQL 运维 大数据
【大数据开发运维解决方案】GoldenGate replicat进程延迟分析步骤
GoldenGate几乎支持市面上流行的所有主流的操作系统平台和数据库。 博主所在单位目前使用Oracle GoldenGate将各个业务生产库汇聚到一起做数仓***实时ODS平台***, 我们采用异构同步,即源端同步过来的表在ODS新增了一个etltime字段,用来记录当前数据变更时间。 为了记录数据的事务变更历史记录,我们将数据的变更记录映射同步到一张tab_name_audit表中。为了防止源端业务库误删数据,我们将被删除的数据映射同步到一张tab_name_his表中。原表映射到ods后还是正常的映射同步dml操作。
【大数据开发运维解决方案】GoldenGate replicat进程延迟分析步骤
|
运维 资源调度 监控
Dataphin运行诊断,提升运行异常分析效率的利器
Dataphin V3.5版本上线了自动化的实例运行诊断的能力,从上游依赖、定时时间、限流规则、调度资源及实例执行 5 个阶段分析实例运行过程中可能产生的问题,从此运维人员再也不怕异常分析啦!
Dataphin运行诊断,提升运行异常分析效率的利器
|
存储 SQL 监控
Java线程池必备知识:核心参数、工作流、监控、调优手段
① 合理使用线程池的好处 ② 线程池的工作流程 ③ 线程池的创建(7个参数) ④ 向线程池提交任务 ⑤ 线程池的五种运行状态 ⑥ 线程池的关闭(shutdown或者shutdownNow方法) java线程池的调优以及监控 Java线程池的常见问题
100413 12
Java线程池必备知识:核心参数、工作流、监控、调优手段
|
运维 监控 Java
一次生产 CPU 100% 排查优化实践
收到了运维报警:表示有些服务器负载非常高,让我们定位问题。
下一篇
无影云桌面