• Jiri Olsa's avatar
    perf stat record: Add record command · 4979d0c7
    Jiri Olsa authored
    Add 'perf stat record' command support. It creates simple (header only)
    perf.data file ATM.
    
    The record command could be specified anywhere among stat options. All
    stat command options are valid for stat record command with '-o' option
    exception. If specified for record command it denotes the perf data file
    name.
    
    Committer note:
    
    Set sample_type to PERF_SAMPLE_IDENTIFIER, which should be harmless
    while avoiding that older tools show confusing messages, for instance,
    with sample_type = 0, we get:
    
      $ perf stat record usleep 1
    
       Performance counter stats for 'usleep 1':
    
              0.630237      task-clock (msec)         #    0.528 CPUs utilized
                     1      context-switches          #    0.002 M/sec
                     0      cpu-migrations            #    0.000 K/sec
                    52      page-faults               #    0.083 M/sec
               978,312      cycles                    #    1.552 GHz
               671,931      stalled-cycles-frontend   #   68.68% frontend cycles idle
       <not supported>      stalled-cycles-backend
               646,379      instructions              #    0.66  insns per cycle
                                                      #    1.04  stalled cycles per insn
               131,046      branches                  #  207.931 M/sec
                 7,073      branch-misses             #    5.40% of all branches
    
           0.001193240 seconds time elapsed
    
      $ oldperf evlist
      WARNING: The perf.data file's data size field is 0 which is unexpected.
      Was the 'perf record' command properly terminated?
      non matching sample_type
      $
    
    While with sample_type set to PERF_SAMPLE_IDENTIFIER, after we re-run 'perf
    stat record usleep' we get:
    
      $ oldperf evlist
      WARNING: The perf.data file's data size field is 0 which is unexpected.
      Was the 'perf record' command properly terminated?
      task-clock
      context-switches
      cpu-migrations
      page-faults
      cycles
      stalled-cycles-frontend
      stalled-cycles-backend
      instructions
      branches
      branch-misses
      $
    
    Which at least shows the names of the events in the perf.data file.
    
    Additionally, such files, when passed to 'perf report' will produce:
    
      $ oldperf report --stdio
      WARNING: The perf.data file's data size field is 0 which is unexpected.
      Was the 'perf record' command properly terminated?
      Warning:
      Kernel address maps (/proc/{kallsyms,modules}) were restricted.
    
      Check /proc/sys/kernel/kptr_restrict before running 'perf record'.
    
      As no suitable kallsyms nor vmlinux was found, kernel samples
      can't be resolved.
    
      Samples in kernel modules can't be resolved as well.
    
      Error:
      The perf.data file has no samples!
      # To display the perf.data header info, please use --header/--header-only options.
      #
      $
    
    Which is confusing and can be solved by just adding the kernel mmap record,
    which will also remove that warning about the data size field being equal to
    zero, after generating the mmap record:
    
      $ perf stat record usleep 1
    
       Performance counter stats for 'usleep 1':
    
              0.600796      task-clock (msec)         #    0.478 CPUs utilized
                     1      context-switches          #    0.002 M/sec
                     0      cpu-migrations            #    0.000 K/sec
                    54      page-faults               #    0.090 M/sec
               886,844      cycles                    #    1.476 GHz
               582,169      stalled-cycles-frontend   #   65.65% frontend cycles idle
       <not supported>      stalled-cycles-backend
               638,344      instructions              #    0.72  insns per cycle
                                                      #    0.91  stalled cycles per insn
               130,204      branches                  #  216.719 M/sec
                 7,500      branch-misses             #    5.76% of all branches
    
           0.001255897 seconds time elapsed
    
      $ oldperf evlist
      task-clock
      context-switches
      cpu-migrations
      page-faults
      cycles
      stalled-cycles-frontend
      stalled-cycles-backend
      instructions
      branches
      branch-misses
      $ oldperf report --stdio
      Error:
      The perf.data file has no samples!
      # To display the perf.data header info, please use --header/--header-only options.
      #
      [acme@zoo linux]$
    
    No warnings, sensible output about what are the events in the perf.data file and also
    a "file has no samples" message, which indeed it doesn't.
    Signed-off-by: default avatarJiri Olsa <jolsa@kernel.org>
    Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    Tested-by: default avatarKan Liang <kan.liang@intel.com>
    Cc: David Ahern <dsahern@gmail.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Link: htp://lkml.kernel.org/r/1446734469-11352-3-git-send-email-jolsa@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    4979d0c7
builtin-stat.c 39.2 KB