RFR: 7903740: JMH: Perf event validation not working with skid options [v4]
Galder Zamarreño
galder at openjdk.org
Thu Sep 5 16:12:17 UTC 2024
On Thu, 5 Sep 2024 16:04:24 GMT, Galder Zamarreño <galder at openjdk.org> wrote:
>> The thing is that `perf record` does not always fail when it doesn't work. For example in container ([example](https://github.com/galderz/github-actions/actions/runs/10723692355/job/29737549503)):
>>
>>
>> $ perf record --event cycles --output perf-record-validate.data echo 1
>> WARNING: Kernel address maps (/proc/{kallsyms,modules}) are restricted,
>> check /proc/sys/kernel/kptr_restrict and /proc/sys/kernel/perf_event_paranoid.
>>
>> Samples in kernel functions may not be resolved if a suitable vmlinux
>> file is not found in the buildid cache or in the vmlinux path.
>>
>> Samples in kernel modules won't be resolved at all.
>>
>> If some relocation was applied (e.g. kexec) symbols may be misresolved
>> even with a suitable vmlinux or kallsyms file.
>>
>> Couldn't record kernel reference relocation symbol
>> Symbol resolution may be skewed if relocation was used (e.g. kexec).
>> Check /proc/kallsyms permission or run as root.
>> 1
>> [ perf record: Woken up 1 times to write data ]
>> [ perf record: Captured and wrote 0.001 MB perf-record-validate.data (3 samples) ]
>>
>> $ echo $?
>> 0
>>
>> $ perf report -q -i perf-record-validate.data --stdio | grep cycles | wc -l
>> 0
>>
>>
>> A lot of the issues I was having was because I assumed that in container `perf record` would fail but it doesn't, and later on you get errors saying that no events were recorded.
>>
>> And in any case, if `perf record` fails, that's already handled by the current code when it calls `!failMsg.isEmpty()`.
>>
>>> Failing hard when some events cannot be supported is also proper, I'd think. So there is no need to verify them one by one. Keep it as simple as possible?
>>
>> I'll try to craft a command that checks all the events in one go and if any is missing fail hard.
>
> Oh, here's an interesting thing on containers. Some are outright not supported and `perf record` command fails:
>
>
> $ perf record --event cycles,branches --output perf-record-validate.data echo 1
> Error:
> The branches event is not supported.
`cpu-clock` has the same issue as `cycles`. `perf list` in container shows as supported and perf record works exits with 0 (see [example](https://github.com/galderz/github-actions/actions/runs/10724039712/job/29738755327)):
$ perf record --event cycles,cpu-clock --output perf-record-validate.data echo 1
$ echo $?
0
But then no events:
$ perf report -q -i perf-record-validate.data --stdio | grep -E 'cycles|cpu-clock' | wc -l
0
So I'm thinking of check that the `perf report ... | wc -l` returns the count of requested event names, otherwise fail. That way is done with a single command.
-------------
PR Review Comment: https://git.openjdk.org/jmh/pull/132#discussion_r1745822758
More information about the jmh-dev
mailing list