c56e94630e
This CL makes it possible for the Dart VM to start or stop `perf` while
doing GC, which gives a significantly more stable output.
Example usage:
Bash script that creates the correct file handles and calls dart under
`perf stat` based on the arguments given to the script:
```
DART=$1
shift
AOTSNAPSHOT=$1
shift
ctl_dir=/tmp/
ctl_fifo=${ctl_dir}perf_ctl.fifo
test -p ${ctl_fifo} && unlink ${ctl_fifo}
mkfifo ${ctl_fifo}
exec {ctl_fd}<>${ctl_fifo}
ctl_ack_fifo=${ctl_dir}perf_ctl_ack.fifo
test -p ${ctl_ack_fifo} && unlink ${ctl_ack_fifo}
mkfifo ${ctl_ack_fifo}
exec {ctl_fd_ack}<>${ctl_ack_fifo}
perf_ctl_fd=$ctl_fd perf_ctl_fd_ack=$ctl_fd_ack perf stat --delay=-1 --control fd:${ctl_fd},${ctl_fd_ack} -B -e "task-clock:u,context-switches:u,cpu-migrations:u,page-faults:u,cycles:u,instructions:u,branch-misses:u" $DART --perf_ctl_fd=${ctl_fd} --perf_ctl_fd_ack=${ctl_fd_ack} --perf_ctl_usage=1 --deterministic $AOTSNAPSHOT $@
exec {ctl_fd_ack}>&-
unlink ${ctl_ack_fifo}
exec {ctl_fd}>&-
unlink ${ctl_fifo}
```
This will start `perf stat` paused (which would require the run dart
aot-compiled script to start it when it wants to) and where the VM
pauses `perf` while doing GC.
In practise, looking at instruction counts reported by `perf stat`, I've
seen the difference between runs go from 2+ mio (and in some instances
23+ mio) to around 30,000 (!) on runs of the analyzer (tool
"stable_analysis").
TEST=manually
Change-Id: Iab955a5dd35e47f22c4f693ae50effc8ee633897
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/468260
Reviewed-by: Slava Egorov <vegorov@google.com>
Commit-Queue: Jens Johansen <jensj@google.com>
36 lines
1.4 KiB
Markdown
36 lines
1.4 KiB
Markdown
# Dart support for perf
|
|
|
|
## Pause `perf stat` recording while GC is running (or vice versa)
|
|
|
|
`perf stat` supports starting and stopping the recording via `--control` and the
|
|
Dart VM can be instructed to either stop the recording while GC is running, or
|
|
specifically start while GC is running (and stop when GC is finished) with
|
|
`--perf_ctl_fd`, `--perf_ctl_fd_ack` (for file handles) and `--perf_ctl_usage`
|
|
(1 or 2) to specify if it should be paused while GCing (1) or started (and
|
|
stoped) while GCing (2).
|
|
|
|
These options can for instance be useful for testing performance changes in AOT
|
|
compiled dart together with `--deterministic`.
|
|
|
|
As an example one could run a script like this:
|
|
|
|
```
|
|
DART=$1
|
|
shift
|
|
AOTSNAPSHOT=$1
|
|
shift
|
|
|
|
[...]
|
|
|
|
perf_ctl_fd=$ctl_fd perf_ctl_fd_ack=$ctl_fd_ack perf stat --delay=-1 --control fd:${ctl_fd},${ctl_fd_ack} -B -e "task-clock:u,context-switches:u,cpu-migrations:u,page-faults:u,cycles:u,instructions:u,branch-misses:u" $DART --perf_ctl_fd=${ctl_fd} --perf_ctl_fd_ack=${ctl_fd_ack} --perf_ctl_usage=1 --deterministic $AOTSNAPSHOT $@
|
|
|
|
[...]
|
|
```
|
|
|
|
(the missing pieces can be found in the perf stat man page).
|
|
|
|
This will start `perf stat` paused (which would require the run dart
|
|
aot-compiled script to start it when it wants to) and where the VM pauses `perf`
|
|
while doing GC. Note that the recording will be started when GC is done, even if
|
|
it wasn't started before.
|