lkml.org 
[lkml]   [2016]   [Dec]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 17/19] perf report: Add option to specify time window of interest
    Date
    From: David Ahern <dsa@cumulusnetworks.com>

    Add option to allow user to control analysis window. e.g., collect data
    for time window and analyze a segment of interest within that window.

    Committer notes:

    Testing it:

    Using the perf.data file captured via 'perf kmem record':

    # perf report --header-only
    # ========
    # captured on: Tue Nov 29 16:01:53 2016
    # hostname : jouet
    # os release : 4.8.8-300.fc25.x86_64
    # perf version : 4.9.rc6.g5a6aca
    # arch : x86_64
    # nrcpus online : 4
    # nrcpus avail : 4
    # cpudesc : Intel(R) Core(TM) i7-5600U CPU @ 2.60GHz
    # cpuid : GenuineIntel,6,61,4
    # total memory : 20254660 kB
    # cmdline : /home/acme/bin/perf kmem record usleep 1
    # event : name = kmem:kmalloc, , id = { 931980, 931981, 931982, 931983 }, type = 2, size = 112, config = 0x1b9, { sample_period, sample_freq } = 1, sample_typ
    # event : name = kmem:kmalloc_node, , id = { 931984, 931985, 931986, 931987 }, type = 2, size = 112, config = 0x1b7, { sample_period, sample_freq } = 1, sampl
    # event : name = kmem:kfree, , id = { 931988, 931989, 931990, 931991 }, type = 2, size = 112, config = 0x1b5, { sample_period, sample_freq } = 1, sample_type
    # event : name = kmem:kmem_cache_alloc, , id = { 931992, 931993, 931994, 931995 }, type = 2, size = 112, config = 0x1b8, { sample_period, sample_freq } = 1, s
    # event : name = kmem:kmem_cache_alloc_node, , id = { 931996, 931997, 931998, 931999 }, type = 2, size = 112, config = 0x1b6, { sample_period, sample_freq } =
    # event : name = kmem:kmem_cache_free, , id = { 932000, 932001, 932002, 932003 }, type = 2, size = 112, config = 0x1b4, { sample_period, sample_freq } = 1, sa
    # HEADER_CPU_TOPOLOGY info available, use -I to display
    # HEADER_NUMA_TOPOLOGY info available, use -I to display
    # pmu mappings: cpu = 4, intel_pt = 7, intel_bts = 6, uncore_arb = 13, cstate_pkg = 15, breakpoint = 5, uncore_cbox_1 = 12, power = 9, software = 1, uncore_im
    # HEADER_CACHE info available, use -I to display
    # missing features: HEADER_BRANCH_STACK HEADER_GROUP_DESC HEADER_AUXTRACE HEADER_STAT
    # ========
    #
    # # Looking at just the histogram entries for the first event:
    #
    # perf report | head -33
    # To display the perf.data header info, please use --header/--header-only options.
    #
    #
    # Total Lost Samples: 0
    #
    # Samples: 40 of event 'kmem:kmalloc'
    # Event count (approx.): 40
    #
    # Overhead Trace output
    # ........ ...............................................................................................................
    #
    37.50% call_site=ffffffffb91ad3c7 ptr=0xffff88895fc05000 bytes_req=4096 bytes_alloc=4096 gfp_flags=GFP_KERNEL
    10.00% call_site=ffffffffb9258416 ptr=0xffff888a1dc61f00 bytes_req=240 bytes_alloc=256 gfp_flags=GFP_KERNEL|__GFP_ZERO
    7.50% call_site=ffffffffb9258416 ptr=0xffff888a2640ac00 bytes_req=240 bytes_alloc=256 gfp_flags=GFP_KERNEL|__GFP_ZERO
    2.50% call_site=ffffffffb92759ba ptr=0xffff888a26776000 bytes_req=4096 bytes_alloc=4096 gfp_flags=GFP_KERNEL
    2.50% call_site=ffffffffb9276864 ptr=0xffff8886f6b82600 bytes_req=136 bytes_alloc=192 gfp_flags=GFP_KERNEL|__GFP_ZERO
    2.50% call_site=ffffffffb9276903 ptr=0xffff888aefcf0460 bytes_req=32 bytes_alloc=32 gfp_flags=GFP_KERNEL
    2.50% call_site=ffffffffb92ad0ce ptr=0xffff888756c98a00 bytes_req=392 bytes_alloc=512 gfp_flags=GFP_KERNEL
    2.50% call_site=ffffffffb92ad0ce ptr=0xffff888756c9ba00 bytes_req=504 bytes_alloc=512 gfp_flags=GFP_KERNEL
    2.50% call_site=ffffffffb92ad301 ptr=0xffff888a31747600 bytes_req=128 bytes_alloc=128 gfp_flags=GFP_KERNEL
    2.50% call_site=ffffffffb92ad511 ptr=0xffff888a9d26a2a0 bytes_req=28 bytes_alloc=32 gfp_flags=GFP_KERNEL
    2.50% call_site=ffffffffb936a7fb ptr=0xffff88873e8c11a0 bytes_req=24 bytes_alloc=32 gfp_flags=GFP_KERNEL
    2.50% call_site=ffffffffb936a7fb ptr=0xffff88873e8c12c0 bytes_req=24 bytes_alloc=32 gfp_flags=GFP_KERNEL
    2.50% call_site=ffffffffb936a7fb ptr=0xffff88873e8c1540 bytes_req=24 bytes_alloc=32 gfp_flags=GFP_KERNEL
    2.50% call_site=ffffffffb936a7fb ptr=0xffff88873e8c15a0 bytes_req=24 bytes_alloc=32 gfp_flags=GFP_KERNEL
    2.50% call_site=ffffffffb936a7fb ptr=0xffff88873e8c15e0 bytes_req=24 bytes_alloc=32 gfp_flags=GFP_KERNEL
    2.50% call_site=ffffffffb936a7fb ptr=0xffff88873e8c16e0 bytes_req=24 bytes_alloc=32 gfp_flags=GFP_KERNEL
    2.50% call_site=ffffffffb936a7fb ptr=0xffff88873e8c1c20 bytes_req=24 bytes_alloc=32 gfp_flags=GFP_KERNEL
    2.50% call_site=ffffffffb936a7fb ptr=0xffff888a9d26a2a0 bytes_req=24 bytes_alloc=32 gfp_flags=GFP_KERNEL
    2.50% call_site=ffffffffb9373e66 ptr=0xffff8889f1931240 bytes_req=64 bytes_alloc=64 gfp_flags=GFP_ATOMIC|__GFP_ZERO
    2.50% call_site=ffffffffb9373e66 ptr=0xffff8889f1931980 bytes_req=64 bytes_alloc=64 gfp_flags=GFP_ATOMIC|__GFP_ZERO
    2.50% call_site=ffffffffb9373e66 ptr=0xffff8889f1931a00 bytes_req=64 bytes_alloc=64 gfp_flags=GFP_ATOMIC|__GFP_ZERO

    #
    # # And then limiting using the example for 'perf kmem stat --time' used
    # # in the previous changeset committer note we see that there were no
    # # kmem:kmalloc in that last part of the file, but there were some
    # # kmem:kmem_cache_alloc ones:
    #
    # perf report --time 20119.782088, --stdio
    #
    # Total Lost Samples: 0
    #
    # Samples: 0 of event 'kmem:kmalloc'
    # Event count (approx.): 0
    #
    # Overhead Trace output
    # ........ ............
    #

    # Samples: 0 of event 'kmem:kmalloc_node'
    # Event count (approx.): 0
    #
    # Overhead Trace output
    # ........ ............
    #

    # Samples: 0 of event 'kmem:kfree'
    # Event count (approx.): 0
    #
    # Overhead Trace output
    # ........ ............
    #

    # Samples: 8 of event 'kmem:kmem_cache_alloc'
    # Event count (approx.): 8
    #
    # Overhead Trace output
    # ........ ..................................................................................................................
    #
    75.00% call_site=ffffffffb9333b42 ptr=0xffff888bdf1a39c0 bytes_req=48 bytes_alloc=48 gfp_flags=GFP_NOFS|__GFP_ZERO
    12.50% call_site=ffffffffb90ad33a ptr=0xffff8889f071f6e0 bytes_req=160 bytes_alloc=160 gfp_flags=GFP_ATOMIC|__GFP_NOTRACK
    12.50% call_site=ffffffffb9287cc1 ptr=0xffff8889b12722d8 bytes_req=104 bytes_alloc=104 gfp_flags=GFP_NOFS|__GFP_ZERO
    #

    Signed-off-by: David Ahern <dsahern@gmail.com>
    Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    Acked-by: Namhyung Kim <namhyung@kernel.org>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Link: http://lkml.kernel.org/r/1480439746-42695-7-git-send-email-dsahern@gmail.com
    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    ---
    tools/perf/Documentation/perf-report.txt | 7 +++++++
    tools/perf/builtin-report.c | 14 +++++++++++++-
    2 files changed, 20 insertions(+), 1 deletion(-)

    diff --git a/tools/perf/Documentation/perf-report.txt b/tools/perf/Documentation/perf-report.txt
    index 2d1746295abf..3a166ae4a4d3 100644
    --- a/tools/perf/Documentation/perf-report.txt
    +++ b/tools/perf/Documentation/perf-report.txt
    @@ -382,6 +382,13 @@ OPTIONS
    --header-only::
    Show only perf.data header (forces --stdio).

    +--time::
    + Only analyze samples within given time window: <start>,<stop>. Times
    + have the format seconds.microseconds. If start is not given (i.e., time
    + string is ',x.y') then analysis starts at the beginning of the file. If
    + stop time is not given (i.e, time string is 'x.y,') then analysis goes
    + to end of file.
    +
    --itrace::
    Options for decoding instruction tracing data. The options are:

    diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
    index 3dfbfffe2ecd..d2afbe4a240d 100644
    --- a/tools/perf/builtin-report.c
    +++ b/tools/perf/builtin-report.c
    @@ -36,7 +36,7 @@
    #include "util/hist.h"
    #include "util/data.h"
    #include "arch/common.h"
    -
    +#include "util/time-utils.h"
    #include "util/auxtrace.h"

    #include <dlfcn.h>
    @@ -59,6 +59,8 @@ struct report {
    const char *pretty_printing_style;
    const char *cpu_list;
    const char *symbol_filter_str;
    + const char *time_str;
    + struct perf_time_interval ptime;
    float min_percent;
    u64 nr_entries;
    u64 queue_size;
    @@ -158,6 +160,9 @@ static int process_sample_event(struct perf_tool *tool,
    };
    int ret = 0;

    + if (perf_time__skip_sample(&rep->ptime, sample->time))
    + return 0;
    +
    if (machine__resolve(machine, &al, sample) < 0) {
    pr_debug("problem processing %d event, skipping it.\n",
    event->header.type);
    @@ -830,6 +835,8 @@ int cmd_report(int argc, const char **argv, const char *prefix __maybe_unused)
    OPT_CALLBACK_DEFAULT(0, "stdio-color", NULL, "mode",
    "'always' (default), 'never' or 'auto' only applicable to --stdio mode",
    stdio__config_color, "always"),
    + OPT_STRING(0, "time", &report.time_str, "str",
    + "Time span of interest (start,stop)"),
    OPT_END()
    };
    struct perf_data_file file = {
    @@ -1015,6 +1022,11 @@ int cmd_report(int argc, const char **argv, const char *prefix __maybe_unused)
    if (symbol__init(&session->header.env) < 0)
    goto error;

    + if (perf_time__parse_str(&report.ptime, report.time_str) != 0) {
    + pr_err("Invalid time string\n");
    + return -EINVAL;
    + }
    +
    sort__setup_elide(stdout);

    ret = __cmd_report(&report);
    --
    2.9.3
    \
     
     \ /
      Last update: 2016-12-01 19:06    [W:2.585 / U:0.092 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site