• L
    tools turbostat: reduce measurement overhead due to IPIs · 88c3281f
    Len Brown 提交于
    turbostat uses /dev/cpu/*/msr interface to read MSRs.
    For modern systems, it reads 10 MSR/CPU.  This can
    be observed as 10 "Function Call Interrupts"
    per CPU per sample added to /proc/interrupts.
    
    This overhead is measurable on large idle systems,
    and as Yoquan Song pointed out, it can even trick
    cpuidle into thinking the system is busy.
    
    Here turbostat re-schedules itself in-turn to each
    CPU so that its MSR reads will always be local.
    This replaces the 10 "Function Call Interrupts"
    with a single "Rescheduling interrupt" per sample
    per CPU.
    
    On an idle 32-CPU system, this shifts some residency from
    the shallow c1 state to the deeper c7 state:
    
     # ./turbostat.old -s
       %c0  GHz  TSC    %c1    %c3    %c6    %c7   %pc2   %pc3   %pc6   %pc7
      0.27 1.29 2.29   0.95   0.02   0.00  98.77  20.23   0.00  77.41   0.00
      0.25 1.24 2.29   0.98   0.02   0.00  98.75  20.34   0.03  77.74   0.00
      0.27 1.22 2.29   0.54   0.00   0.00  99.18  20.64   0.00  77.70   0.00
      0.26 1.22 2.29   1.22   0.00   0.00  98.52  20.22   0.00  77.74   0.00
      0.26 1.38 2.29   0.78   0.02   0.00  98.95  20.51   0.05  77.56   0.00
    ^C
     i# ./turbostat.new -s
       %c0  GHz  TSC    %c1    %c3    %c6    %c7   %pc2   %pc3   %pc6   %pc7
      0.27 1.20 2.29   0.24   0.01   0.00  99.49  20.58   0.00  78.20   0.00
      0.27 1.22 2.29   0.25   0.00   0.00  99.48  20.79   0.00  77.85   0.00
      0.27 1.20 2.29   0.25   0.02   0.00  99.46  20.71   0.03  77.89   0.00
      0.28 1.26 2.29   0.25   0.01   0.00  99.46  20.89   0.02  77.67   0.00
      0.27 1.20 2.29   0.24   0.01   0.00  99.48  20.65   0.00  78.04   0.00
    
    cc: Youquan Song <youquan.song@intel.com>
    Signed-off-by: NLen Brown <len.brown@intel.com>
    88c3281f
turbostat.c 25.9 KB