[PATCH V5 00/17] perf top overwrite mode

From: kan . liang
Date: Thu Jan 18 2018 - 16:28:10 EST


From: Kan Liang <kan.liang@xxxxxxxxx>

------
Changes since V4:
- Added a bug fix patch which recalculate the 'size' in
perf_mmap__push()
- Added a cleanup patch for perf_mmap__push()
- Modified the patch which introduce perf_mmap__read_init()
- Added a patch to change return value logic for perf_mmap__read_init()
- Dropped the unnecessary refcnt check in perf_mmap__read_init()
The check will be done later in perf_mmap__read_event().
- Used warn_lost_event to replace !no_lost_event_warning

Changes since V3:
- Separated patches to add new interface perf_mmap__read_init and
apply to the perf_mmap__push()
- Corrected the comments of perf_mmap__read_done()
- Name the pointer parameter with 'p' postfix
- Add new rules to check per-event overwrite term in comments.
Do the check before perf_evlist__config()
- Add a new patch to disable/enable event lost warning in hists browser.

Changes since V2:
- Move duplicate 'map->prev' out of perf_mmap__read. Modify the
perf_mmap__read_event accordingly.
- Introduce new interface perf_mmap__read_init to calculate the ringbuffer
position
- Check perf_missing_features.write_backward
- Discard stale interfaces perf_mmap__read_backward and
perf_mmap__read_catchup

Changes since V1:
- New patches 4-6
- Support both overwrite mode and non-overwrite mode.
If kernel doesn't support default overwrite mode, fall back to
non-overwrite mode.
------

perf_top__mmap_read has severe performance issue in
Knights Landing/Mill, when monitoring in heavy load system. It costs
several minutes to finish, which is unacceptable.

Currently, perf top is non overwrite mode. For non overwrite mode, it
tries to read everything in the ringbuffer and doesn't pause the
ringbuffer. Once there are lots of samples delivered persistently,
the processing time could be very long. Also, the latest samples could
be lost when the ringbuffer is full.

It's better to change it to overwrite mode, which takes a snapshot for
the system by pausing the ringbuffer and could significantly reducing
the processing time (from several minutes to several seconds).
Also, the overwrite mode always keep the latest samples.

Patch 1-10: Introduce new interfaces for generic code to support
overwrite mode for one by one event read.
Discards stale interfaces.
The patches can be merged separately.
Patch 11-17: Add overwrite support to perf top.
Perf top should only support either overwrite or
non-overwrite mode.
Switch default mode to overwrite mode
If kernel doesn't support overwrite mode, fall back to
non-overwrite mode.

Kan Liang (17):
perf evlist: remove stale mmap read for backward
perf mmap: fix: recalculate size for overwrite mode.
perf mmap: cleanup perf_mmap__push()
perf mmap: introduce perf_mmap__read_init()
perf mmap: add new return value logic for perf_mmap__read_init()
perf mmap: discard 'prev' in perf_mmap__read()
perf mmap: introduce perf_mmap__read_done
perf mmap: introduce perf_mmap__read_event()
perf test: update mmap read functions for backward-ring-buffer test
perf mmap: discard legacy interface for mmap read
perf top: check per-event overwrite term
perf evsel: expose perf_missing_features.write_backward
perf top: add overwrite fall back
perf hists browser: add parameter to disable lost event warning
perf top: remove lost events checking
perf top: switch default mode to overwrite mode
perf top: check the latency of perf_top__mmap_read

tools/perf/builtin-c2c.c | 4 +-
tools/perf/builtin-report.c | 3 +-
tools/perf/builtin-top.c | 150 ++++++++++++++++++++++++++++++--
tools/perf/tests/backward-ring-buffer.c | 7 +-
tools/perf/ui/browsers/hists.c | 38 +++++---
tools/perf/ui/browsers/hists.h | 3 +-
tools/perf/util/evlist.c | 17 ----
tools/perf/util/evlist.h | 4 -
tools/perf/util/evsel.c | 5 ++
tools/perf/util/evsel.h | 2 +
tools/perf/util/hist.h | 6 +-
tools/perf/util/mmap.c | 141 +++++++++++++++++-------------
tools/perf/util/mmap.h | 10 ++-
13 files changed, 277 insertions(+), 113 deletions(-)

--
2.5.5