• Jin Yao's avatar
    perf stat: Show percore counts in per CPU output · 1af62ce6
    Jin Yao authored
    We have supported the event modifier "percore" which sums up the event
    counts for all hardware threads in a core and show the counts per core.
    
    For example,
    
     # perf stat -e cpu/event=cpu-cycles,percore/ -a -A -- sleep 1
    
      Performance counter stats for 'system wide':
    
     S0-D0-C0                395,072      cpu/event=cpu-cycles,percore/
     S0-D0-C1                851,248      cpu/event=cpu-cycles,percore/
     S0-D0-C2                954,226      cpu/event=cpu-cycles,percore/
     S0-D0-C3              1,233,659      cpu/event=cpu-cycles,percore/
    
    This patch provides a new option "--percore-show-thread". It is used
    with event modifier "percore" together to sum up the event counts for
    all hardware threads in a core but show the counts per hardware thread.
    
    This is essentially a replacement for the any bit (which is gone in
    Icelake). Per core counts are useful for some formulas, e.g. CoreIPC.
    The original percore version was inconvenient to post process. This
    variant matches the output of the any bit.
    
    With this patch, for example,
    
     # perf stat -e cpu/event=cpu-cycles,percore/ -a -A --percore-show-thread  -- sleep 1
    
      Performance counter stats for 'system wide':
    
     CPU0               2,453,061      cpu/event=cpu-cycles,percore/
     CPU1               1,823,921      cpu/event=cpu-cycles,percore/
     CPU2               1,383,166      cpu/event=cpu-cycles,percore/
     CPU3               1,102,652      cpu/event=cpu-cycles,percore/
     CPU4               2,453,061      cpu/event=cpu-cycles,percore/
     CPU5               1,823,921      cpu/event=cpu-cycles,percore/
     CPU6               1,383,166      cpu/event=cpu-cycles,percore/
     CPU7               1,102,652      cpu/event=cpu-cycles,percore/
    
    We can see counts are duplicated in CPU pairs (CPU0/CPU4, CPU1/CPU5,
    CPU2/CPU6, CPU3/CPU7).
    
    The interval mode also works. For example,
    
     # perf stat -e cpu/event=cpu-cycles,percore/ -a -A --percore-show-thread  -I 1000
     #           time CPU                    counts unit events
          1.000425421 CPU0                 925,032      cpu/event=cpu-cycles,percore/
          1.000425421 CPU1                 430,202      cpu/event=cpu-cycles,percore/
          1.000425421 CPU2                 436,843      cpu/event=cpu-cycles,percore/
          1.000425421 CPU3               1,192,504      cpu/event=cpu-cycles,percore/
          1.000425421 CPU4                 925,032      cpu/event=cpu-cycles,percore/
          1.000425421 CPU5                 430,202      cpu/event=cpu-cycles,percore/
          1.000425421 CPU6                 436,843      cpu/event=cpu-cycles,percore/
          1.000425421 CPU7               1,192,504      cpu/event=cpu-cycles,percore/
    
    If we offline CPU5, the result is:
    
     # perf stat -e cpu/event=cpu-cycles,percore/ -a -A --percore-show-thread -- sleep 1
    
      Performance counter stats for 'system wide':
    
     CPU0               2,752,148      cpu/event=cpu-cycles,percore/
     CPU1               1,009,312      cpu/event=cpu-cycles,percore/
     CPU2               2,784,072      cpu/event=cpu-cycles,percore/
     CPU3               2,427,922      cpu/event=cpu-cycles,percore/
     CPU4               2,752,148      cpu/event=cpu-cycles,percore/
     CPU6               2,784,072      cpu/event=cpu-cycles,percore/
     CPU7               2,427,922      cpu/event=cpu-cycles,percore/
    
            1.001416041 seconds time elapsed
    
     v4:
     ---
     Ravi Bangoria reports an issue in v3. Once we offline a CPU,
     the output is not correct. The issue is we should use the cpu
     idx in print_percore_thread rather than using the cpu value.
    
     v3:
     ---
     1. Fix the interval mode output error
     2. Use cpu value (not cpu index) in config->aggr_get_id().
     3. Refine the code according to Jiri's comments.
    
     v2:
     ---
     Add the explanation in change log. This is essentially a replacement
     for the any bit. No code change.
    Signed-off-by: default avatarJin Yao <yao.jin@linux.intel.com>
    Tested-by: default avatarRavi Bangoria <ravi.bangoria@linux.ibm.com>
    Acked-by: default avatarJiri Olsa <jolsa@kernel.org>
    Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    Cc: Andi Kleen <ak@linux.intel.com>
    Cc: Kan Liang <kan.liang@linux.intel.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Link: http://lore.kernel.org/lkml/20200214080452.26402-1-yao.jin@linux.intel.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    1af62ce6
stat.h 5.48 KB