菜单
开源

pyroscope.java

pyroscope.java 不断对在本地 Linux OS 上运行的 Java 进程进行性能分析,使用 async-profiler

注意

要使用 pyroscope.java 组件,您必须以 root 身份运行 Alloy 并位于 host PID 命名空间内。

用法

alloy
pyroscope.java "LABEL" {
  targets    = TARGET_LIST
  forward_to = RECEIVER_LIST
}

参数

以下参数被支持

名称类型描述默认必备
targetslist(map(string))要分析的目标 Java 进程的列表。yes
forward_tolist(ProfilesReceiver)要发送收集到的配置文件的目标接收器列表。yes
tmp_dirstring存储 async-profiler 的临时目录。/tmpno

性能分析行为

特殊的标签 __process_pid__ 必须始终存在于 targets 的每个目标中,并对应于要分析的进程的 PID。

组件启动后,pyroscope.javatmp_dir 下创建一个临时目录,并将 glibc 和 musl 的 async-profiler 可执行文件提取到以下布局的目录中。

/tmp/alloy-asprof-glibc-{SHA1}/bin/asprof
/tmp/alloy-asprof-glibc-{SHA1}/lib/libasyncProfiler.so
/tmp/alloy-asprof-musl-{SHA1}/bin/asprof
/tmp/alloy-asprof-musl-{SHA1}/lib/libasyncProfiler.so

在进程性能分析启动后,组件检测到 libc 类型,并将 libAsyncProfiler.so 拷贝到目标进程文件系统中的确切路径。

注意

asprof 二进制文件以 root 权限运行。如果您将 tmp_dir 配置更改为除 /tmp 之外的内容,那么您必须确保目录只能被 root 可写。

targets 参数

特殊的 __process_pid__ 标签必须始终存在,并对应于用于性能分析的进程 PID。

以双下划线(__)开头的标签被视为 内部,在抓取之前将被删除。

特殊的标签 service_name 是必需的,并且必须始终存在。如果未指定,则 pyroscope.scrape 将尝试按以下顺序从中获取,默认顺序为

  1. __meta_kubernetes_pod_annotation_pyroscope_io_service_name,这是一个pyroscope.io/service_name的Pod注解。
  2. __meta_kubernetes_namespace__meta_kubernetes_pod_container_name
  3. __meta_docker_container_name
  4. __meta_dockerswarm_container_label_service_name__meta_dockerswarm_service_name

如果未指定service_name且无法推断,则将其设置为未指定

以下block在pyroscope.java的定义中受到支持

层次描述必备
profiling_configprofiling_config描述Java分析配置。no

profiling_config块

profiling_config块描述了如何调用async-profiler。

以下参数被支持

名称类型描述默认必备
intervalduration从目标收集配置的频率。“60s”no
cpubool启用CPU分析的标志,默认使用itimer异步profiler事件。trueno
sample_rateintCPU分析采样率。它从Hz转换为间隔,并传递给async-profiler的-i参数。100no
allocstring内存分配分析采样配置。它传递给async-profiler的--alloc参数。“512k”no
lockstring锁分析采样配置。它传递给async-profiler的--lock参数。“10ms”no
eventstring设置CPU分析事件。可以是itimercpuwall之一。“itimer”no
per_threadbool设置async-profiler的每个线程模式。它传递给async-profiler的-t参数。falseno

有关async-profiler配置的更多信息,请参阅profiler-options

event参数

设置CPU分析事件

  • itimer - 默认。使用setitimer(ITIMER_PROF)系统调用,每次进程消耗CPU时都会生成一个信号。
  • cpu - 使用PMU-case采样(如Intel PEBS或AMD IBS),可能比itimer更准确,但不是每个平台都可用。
  • wall - 这在每个给定的时间段内按线程状态(运行、睡眠或阻塞)平均采样所有线程:例如,当分析应用启动时间或IO密集型进程时,这可能很有帮助。

per_thread参数

设置async-profiler的每个线程模式。线程分别进行分析,每个堆栈跟踪都以表示单个线程的帧结束。

实时时钟分析器(event=wall)在单线程模式下最有用。

导出字段

pyroscope.java不会导出其他组件可以引用的字段。

组件健康情况

pyroscope.java仅在给定无效配置的情况下报告为不健康。在这些情况下,导出字段保留它们的最后健康值。

调试信息

pyroscope.java不会公开任何特定组件的调试信息。

调试度量

pyroscope.java不会公开任何特定组件的调试度量。

示例

分析当前主机上的每个Java进程

alloy
pyroscope.write "staging" {
  endpoint {
    url = "https://127.0.0.1:4040"
  }
}

discovery.process "all" {
  refresh_interval = "60s"
  discover_config {
    cwd = true
    exe = true
    commandline = true
    username = true
    uid = true
    container_id = true
  }
}

discovery.relabel "java" {
  targets = discovery.process.all.targets
  rule {
    action = "keep"
    regex = ".*/java$"
    source_labels = ["__meta_process_exe"]
  }
}

pyroscope.java "java" {
  targets = discovery.relabel.java.output
  forward_to = [pyroscope.write.staging.receiver]
  profiling_config {
    interval = "60s"
    alloc = "512k"
    cpu = true
    sample_rate = 100
    lock = "1ms"
  }
}

兼容组件

pyroscope.java可以接受以下组件的参数

注意

连接某些组件可能没有意义,或者组件可能需要进一步的配置才能正确连接。有关更多详细信息,请参阅相关文档。