使用BPF监视JVM应用程序
参考文章: Fast and secure JVM application monitoring with BPF magic and JVM-BPF
一、Linux跟踪工具的概况
X轴为信息详细程度,Y轴为易于使用情况
ftrace
是一种内置机制,其已包含在Linux中。它是一种跟踪性能问题等的工具。但是,它并非设计用于Java。它不能用于跟踪许多有趣的Java事件,例如垃圾回收,类加载等SystemTap
是一种非常底层的工具,可以跟踪用户空间中的内核事件和用户事件 (包括Java事件)。其主要问题是,要使用此工具,需要在其执行期间编译内核模块并将其加载到内核中SysDig
关注于跟踪容器中的性能,但是它只能与系统调用一起使用,提供的功能较少
二、JVM中的监视点
在运行的Java应用程序中,除了由操作系统执行的操作 (系统调用,网络事件) 之外,在大多数最新的Java版本中,OpenJDK还配备了许多USDT探针。它们中的大多数都是开箱即用的。
1. 探针
要探索其中的一些探针,请导航至$JAVA_HOME
并查看tapset目录, 或者查看在线文件.
这些.stp
文件包含一堆探针的描述和声明,包括其参数。例如,尝试查找gc_collect_tenured_begin
和gc_collect_tenured_end
探针描述
# 可选, 通过yum安装1.8.0版本openjdk
$ yum install java-1.8.0-openjdk* -y
# 路径
$ cd /etc/alternatives/java_sdk
$ ls tapset/
hotspot-1.8.0.242.b08-0.el7_7.x86_64.stp
hotspot_jni-1.8.0.242.b08-0.el7_7.x86_64.stp
hotspot_gc-1.8.0.242.b08-0.el7_7.x86_64.stp
jstack-1.8.0.242.b08-0.el7_7.x86_64.stp
现在,让我们来看一个更实际的例子。现在,通过使用class_loaded
探针来跟踪正在运行的Java应用程序,并查看正在加载哪些类。首先,通过运行以下命令: 看起来有四个参数,并且正在加载的类名作为第一个参数给出
$ grep -A 10 'probe.*class_loaded' tapset/*.stp
tapset/hotspot-1.8.0.242.b08-0.el7_7.x86_64.stp:probe hotspot.class_loaded =
tapset/hotspot-1.8.0.242.b08-0.el7_7.x86_64.stp- process("/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7.x86_64/jre/lib/amd64/server/libjvm.so").mark("class__loaded")
tapset/hotspot-1.8.0.242.b08-0.el7_7.x86_64.stp-{
tapset/hotspot-1.8.0.242.b08-0.el7_7.x86_64.stp- name = "class_loaded";
tapset/hotspot-1.8.0.242.b08-0.el7_7.x86_64.stp- class = user_string_n($arg1, $arg2);
tapset/hotspot-1.8.0.242.b08-0.el7_7.x86_64.stp- classloader_id = $arg3;
tapset/hotspot-1.8.0.242.b08-0.el7_7.x86_64.stp- is_shared = $arg4;
tapset/hotspot-1.8.0.242.b08-0.el7_7.x86_64.stp- probestr = sprintf("%s(