RFR: 8254723: add diagnostic command to write Linux perf map file

Aleksey Shipilev shade at openjdk.java.net
Tue Oct 20 10:55:09 UTC 2020


On Tue, 20 Oct 2020 09:27:45 GMT, Nick Gasson <ngasson at openjdk.org> wrote:

> When using the Linux "perf" tool to do system profiling, symbol names of
> running Java methods cannot be decoded, resulting in unhelpful output
> such as:
> 
>   10.52% [JIT] tid 236748 [.] 0x00007f6fdb75d223
> 
> Perf can read a simple text file format describing the mapping between
> address ranges and symbol names for a particular process [1].
> 
> It's possible to generate this already for Java processes using a JVMTI
> plugin such as perf-map-agent [2]. However this requires compiling
> third-party code and then loading the agent into your Java process. It
> would be more convenient if Hotspot could write this file directly using
> a diagnostic command. The information required is almost identical to
> that of the existing Compiler.codelist command.
> 
> This patch adds a Compiler.perfmap diagnostic command on Linux only. To
> use, first run "jcmd <pid> Compiler.perfmap" and then "perf top" or
> "perf record" and the report should show decoded Java symbol names for
> that process.
> 
> As this just writes a snapshot of the code cache when the command is
> run, it will become stale if methods are compiled later or unloaded.
> However this shouldn't be a big problem in practice if the map file is
> generated after the application has warmed up.
> 
> [1] https://github.com/torvalds/linux/blob/master/tools/perf/Documentation/jit-interface.txt
> [2] https://github.com/jvm-profiling-tools/perf-map-agent

That's a nifty idea! (Kicks himself for not coming up with it myself.)

I do wonder the UX would be better to dump the map file at VM shutdown (guarded by flag, sigh). Because it seems that
for the short jobs, we would like to just do "perf record java -XX:+WhatEver", followed by "perf report", without
requiring user to invoke the diagnostic command while JVM is still running?

test/hotspot/jtreg/serviceability/dcmd/compiler/PerfMapTest.java line 60:

> 58:     static Pattern outputPattern =
> 59:         Pattern.compile("Written to (/tmp/perf-\\p{Digit}*\\.map)");
> 60:     static Pattern linePattern =

`static final Pattern OUTPUT_PATTERN` and `static final Pattern LINE_PATTERN` here?

test/hotspot/jtreg/serviceability/dcmd/compiler/PerfMapTest.java line 79:

> 77:         } catch (FileNotFoundException e) {
> 78:             Assert.fail(e.toString());
> 79:         }

Sounds like a lot of this scaffolding could be replaced by `for (String line : Files.readAllLines(m.group(1))) { ... }`?

-------------

PR: https://git.openjdk.java.net/jdk/pull/760


More information about the serviceability-dev mailing list