]> git.proxmox.com Git - mirror_qemu.git/commit
qsp: QEMU's Synchronization Profiler
authorEmilio G. Cota <cota@braap.org>
Tue, 8 Aug 2017 17:53:15 +0000 (13:53 -0400)
committerPaolo Bonzini <pbonzini@redhat.com>
Thu, 23 Aug 2018 16:46:25 +0000 (18:46 +0200)
commitfe9959a275fc7b4744e49201a390627b3adda597
treeb6d4d8e7b58866e9fa1ffd3a76ec1a1581065cc0
parentc04649eeeaf5f84ba9e43d0c4ffbe1719b0d940c
qsp: QEMU's Synchronization Profiler

The goal of this module is to profile synchronization primitives (i.e.
mutexes, recursive mutexes and condition variables) so that scalability
issues can be quickly diagnosed.

Sync primitives are profiled by QSP based on the vaddr of the object accessed
as well as the call site (file:line_nr). That means the same object called
from two different call sites will be tracked in separate entries, which
might be reported together or separately (see subsequent commit on
call site coalescing).

Some perf numbers:

Host: Intel(R) Core(TM) i7-6700K CPU @ 4.00GHz
Command: taskset -c 0 tests/atomic_add-bench -d 5 -m

- Before: 54.80 Mops/s
- After:  54.75 Mops/s

That is, a negligible slowdown due to the now indirect call to
qemu_mutex_lock. Note that using a branch instead of an indirect
call introduces a more severe slowdown (53.65 Mops/s, i.e. 2% slowdown).

Enabling the profiler (with -p, added in this series) is more interesting:

- No profiling: 54.75 Mops/s
- W/ profiling: 12.53 Mops/s

That is, a 4.36X slowdown.

We can break down this slowdown by removing the get_clock calls or
the entry lookup:

- No profiling:     54.75 Mops/s
- W/o get_clock:    25.37 Mops/s
- W/o entry lookup: 19.30 Mops/s
- W/ profiling:     12.53 Mops/s

Signed-off-by: Emilio G. Cota <cota@braap.org>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
include/qemu/qht.h
include/qemu/qsp.h [new file with mode: 0644]
include/qemu/thread-posix.h
include/qemu/thread-win32.h
include/qemu/thread.h
util/Makefile.objs
util/qemu-thread-win32.c
util/qht.c
util/qsp.c [new file with mode: 0644]