pyroscope.java
pyroscope.java
不断对在本地 Linux OS 上运行的 Java 进程进行性能分析,使用 async-profiler。
注意
要使用pyroscope.java
组件,您必须以 root 身份运行 Alloy 并位于 host PID 命名空间内。
用法
pyroscope.java "LABEL" {
targets = TARGET_LIST
forward_to = RECEIVER_LIST
}
参数
以下参数被支持
名称 | 类型 | 描述 | 默认 | 必备 |
---|---|---|---|---|
targets | list(map(string)) | 要分析的目标 Java 进程的列表。 | yes | |
forward_to | list(ProfilesReceiver) | 要发送收集到的配置文件的目标接收器列表。 | yes | |
tmp_dir | string | 存储 async-profiler 的临时目录。 | /tmp | no |
性能分析行为
特殊的标签 __process_pid__
必须始终存在于 targets
的每个目标中,并对应于要分析的进程的 PID。
组件启动后,pyroscope.java
在 tmp_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
将尝试按以下顺序从中获取,默认顺序为
__meta_kubernetes_pod_annotation_pyroscope_io_service_name
,这是一个pyroscope.io/service_name
的Pod注解。__meta_kubernetes_namespace
和__meta_kubernetes_pod_container_name
__meta_docker_container_name
__meta_dockerswarm_container_label_service_name
或__meta_dockerswarm_service_name
如果未指定service_name
且无法推断,则将其设置为未指定
。
块
以下block在pyroscope.java
的定义中受到支持
层次 | 块 | 描述 | 必备 |
---|---|---|---|
profiling_config | profiling_config | 描述Java分析配置。 | no |
profiling_config块
profiling_config
块描述了如何调用async-profiler。
以下参数被支持
名称 | 类型 | 描述 | 默认 | 必备 |
---|---|---|---|---|
interval | duration | 从目标收集配置的频率。 | “60s” | no |
cpu | bool | 启用CPU分析的标志,默认使用itimer 异步profiler事件。 | true | no |
sample_rate | int | CPU分析采样率。它从Hz转换为间隔,并传递给async-profiler的-i 参数。 | 100 | no |
alloc | string | 内存分配分析采样配置。它传递给async-profiler的--alloc 参数。 | “512k” | no |
lock | string | 锁分析采样配置。它传递给async-profiler的--lock 参数。 | “10ms” | no |
event | string | 设置CPU分析事件。可以是itimer 、cpu 或wall 之一。 | “itimer” | no |
per_thread | bool | 设置async-profiler的每个线程模式。它传递给async-profiler的-t 参数。 | false | no |
有关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进程
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
可以接受以下组件的参数
- 导出目标的组件
- 导出Pyroscope
ProfilesReceiver
的组件
注意
连接某些组件可能没有意义,或者组件可能需要进一步的配置才能正确连接。有关更多详细信息,请参阅相关文档。