「perf stat -a」が私のCPUクラスより低いクロック(Ghz)を表示するのはなぜですか?

「perf stat -a」が私のCPUクラスより低いクロック(Ghz)を表示するのはなぜですか?

perf stat -aクロック速度が表示されるのはなぜですか?三回私のCPUクラスより低いですか?

CPU周波数が最大になるようにテストが1秒間実行されたことを確認したため、電源管理が問題ではないと思います。

# time perf stat -a -r 500  mount --make-rprivate /mnt/a

 Performance counter stats for 'system wide' (500 runs):

          6.217301      cpu-clock (msec)          #    3.782 CPUs utilized            ( +-  0.63% )
                 6      context-switches          #    0.998 K/sec                    ( +-  1.31% )
                 0      cpu-migrations            #    0.018 K/sec                    ( +- 15.14% )
               122      page-faults               #    0.020 M/sec                    ( +-  0.04% )
         4,719,129      cycles                    #    0.759 GHz                      ( +-  1.93% )
         3,998,374      instructions              #    0.85  insn per cycle           ( +-  0.44% )
           805,593      branches                  #  129.573 M/sec                    ( +-  0.44% )
            22,548      branch-misses             #    2.80% of all branches          ( +-  0.26% )

       0.001644054 seconds time elapsed                                          ( +-  0.62% )


real    0m1.152s
user    0m0.386s
sys 0m0.824s

# rpm -q perf
perf-4.14.16-300.fc27.x86_64

答え1

Ghz 値は、perf stat -a1 秒あたりのサイクル数を表示しません。 4,719,000サイクルを0.0016秒で割った値は0.76Ghzではなく2.9Ghzです。

perf示されているのは毎秒平均サイクルのようです。各CPUコアに。 2.9Ghzを0.76Ghzで割ると3.8になります。これはCPUの整数ではありませんが、ほぼ似ています。上記の奇妙な「CPU使用量」の数値と正確に一致することがわかりました。


perf stat以下なしの比較-a

# time perf stat -r 500  mount --make-rprivate /mnt/a

 Performance counter stats for 'mount --make-rprivate /mnt/a' (500 runs):
      1.323450      task-clock (msec)         #    0.812 CPUs utilized            ( +-  0.84% )
             0      context-switches          #    0.008 K/sec                    ( +- 44.54% )
             0      cpu-migrations            #    0.000 K/sec                  
           122      page-faults               #    0.092 M/sec                    ( +-  0.04% )
     2,668,696      cycles                    #    2.016 GHz                      ( +-  0.28% )
     3,090,908      instructions              #    1.16  insn per cycle           ( +-  0.04% )
       611,827      branches                  #  462.297 M/sec                    ( +-  0.03% )
        20,252      branch-misses             #    3.31% of all branches          ( +-  0.09% )

   0.001630517 seconds time elapsed                                          ( +-  0.82% )


real    0m1.089s
user    0m0.378s
sys 0m0.715s

さらに、報告された期間はperf stat -a生産性計算を完全に表していません。 perf record -a次に、perf report最も人気のあるホットスポットが次のように表示されます。

# perf record -a sh -c "for i in {1..500}; do mount --make-rprivate /mnt/a; done"
...
# perf report
...
  19.40%  swapper          [kernel.kallsyms]           [k] intel_idle
...

つまり、CPUは頻度アイドルコアから下げると、パフォーマンスカウントサイクルには、コアがCPUを停止し、CPUアイドル状態に入ったときに多数の「使用済み」サイクルが含まれているように見えます。

(または少なくともカーネルは努力するCPUを低電力アイドル状態に設定します。perfCPUを頻繁に停止することはアイドル状態をまったく妨げているかどうかわかりません.)

関連情報