Hi,

By default, the userspace perf tool opens per-cpu task-bound events
when sampling, so for N logical events requested by the user, the tool
will open N * NR_CPUS events.

In the kernel, we mux events with a hrtimer, periodically rotating the
flexible group list and trying to schedule each group in turn. We skip 
groups whose cpu filter doesn't match. So when we get unlucky, we can 
walk N * (NR_CPUS - 1) groups pointlessly for each hrtimer invocation.

This has been observed to result in significant overhead when running
the STREAM benchmark on 272 core Xeon Phi systems.

One way to avoid this is to place our events into an rb tree sorted by
CPU, so that our hrtimer can skip to the current CPU's list and ignore
everything else. 

This patch set moves event groups into rb trees and implements 
skipping to the current CPU's list on hrtimer interrupt.

The patch set was tested on Xeon Phi using perf_fuzzer and tests 
from here: https://github.com/deater/perf_event_tests

Patches in the set are expected to be applied one after another in 
the mentioned order and they are logically split here into three parts 
to simplify the review process.

Thanks,
Alexey

---
 Alexey Budankov (3):
        perf/core: use rb trees for pinned/flexible groups
        perf/core: use context tstamp_data for skipped events on mux interrupt
        perf/core: add mux switch to skip to the current CPU's events list on 
mux interrupt

 include/linux/perf_event.h |  54 +++--
 kernel/events/core.c       | 584 +++++++++++++++++++++++++++++++++------------
 2 files changed, 473 insertions(+), 165 deletions(-)


Reply via email to