Linux: パフォーマンス ガバナーを使用すると CPU 周波数が変動するのはなぜですか?

Linux: パフォーマンス ガバナーを使用すると CPU 周波数が変動するのはなぜですか?

ベンチマークには Debian 8 amd64 マシンを使用しています。実験中は、CPU を固定周波数 (できれば最大周波数) で動作させたいと思います。これにより、CPU クロック速度が結果の変動の原因となることがなくなります。

performanceいろいろ読んでみると、CPUガバナーを次のように変更するのが正しいようです。Linuxカーネルのドキュメントはこちら:

CPUfreq ガバナー「パフォーマンス」は、scaling_min_freq と scaling_max_freq の境界内で CPU を最高周波数に静的に設定します。

scaling_min_freq残念ながら、とに関する詳細はscaling_max_freq提供されていません。使用される CPU 周波数が間隔の最大値であるため、問題にならないことを願っています。

そこで、cpufreq-set を使用してこのガバナーを有効にしました。

$ cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
パフォーマンス
パフォーマンス
パフォーマンス
パフォーマンス

念のため、BIOS でターボ ブースト モードも無効にしました。

$ cat /sys/devices/system/cpu/intel_pstate/no_turbo
1

パフォーマンス ガバナーの上記の説明に基づくと、CPU クロック速度に変動はないと考えられます。しかし、繰り返し実行するとcpufreq-info、クロック速度が変動していることがわかります。

$ cpufreq-info | grep '現在のCPU周波数'
  現在のCPU周波数は4.00GHzです。
  現在のCPU周波数は3.99GHzです。
  現在のCPU周波数は4.00GHzです。
  現在のCPU周波数は4.00GHzです。
$ cpufreq-info | grep '現在のCPU周波数'
  現在のCPU周波数は4.00GHzです。
  現在のCPU周波数は4.00GHzです。
  現在のCPU周波数は4.00GHzです。
  現在のCPU周波数は3.96GHzです。
$ cpufreq-info | grep '現在のCPU周波数'
  現在のCPU周波数は4.00GHzです。
  現在のCPU周波数は4.00GHzです。
  現在のCPU周波数は4.00GHzです。
  現在のCPU周波数は3.94GHzです。
$ cpufreq-info | grep '現在のCPU周波数'
  現在のCPU周波数は4.01GHzです。
  現在のCPU周波数は4.00GHzです。
  現在のCPU周波数は4.00GHzです。
  現在のCPU周波数は3.98GHzです。

この変動はハードウェア、BIOS、カーネル、またはその他の要因によるものでしょうか? CPU 周波数をまったく変動しないように設定する方法はありますか?

答え1

いくつか実験してみると、自分の質問に答えられると思います。

述べたようにこのスレッドで一部の Intel ハードウェアでは、CPU 周波数を管理する方法が 2 つあります。

  • pstate を使用します。
  • 通常の ACPI を使用します。

pstate が使用される場合、BIOS はクロック速度に対して何らかの影響を与えるため、これが変動の原因となるようです。

intel_pstate=disableカーネル引数に を追加することで、pstate を強制的にオフにすることができます( を編集し/etc/default/grubて arg を追加しますGRUB_CMDLINE_LINUX_DEFAULT。最後に を実行しますsudo update-grub)。

これを実行すると、 の出力がcpufreq-info大きく変わり、異なる CPU ガバナー セットが使用可能になることにも気付きます (例:ondemandが使用可能になりました)。

最も重要なのは、ガバナーを に設定した後performance、クロック速度が固定されるようになったことです (私の場合は 4.00GHz)。

/sys/devices/system/cpu/cpu*/cpufreq/scaling_driverを調べると、CPU のスケーリングに pstate または ACPI が使用されているかどうかを確認できます。これらのファイルは、値acpi-cpufreqまたはを想定していますintel_pstate

答え2

最新の Intel プロセッサの場合、周波数はプロセッサ自体によって制御され、ソフトウェアに公開される P 状態はパフォーマンス レベルに関連しています。 周波数を単一に設定できるという考え 周波数はIntel Coreプロセッサでは架空のものですスケーリングドライバが単一のP状態を選択した場合でも、プロセッサが実際に実行される周波数はプロセッサ自体によって選択されます。[1]

[1]https://www.kernel.org/doc/Documentation/cpu-freq/intel-pstate.txt

答え3

このスレッドを読んだのは、ファンが動かなくなったので CPU に固定周波数を設定したいと思っていたからです (もちろん、ダイビング レジャーで海外の無人島にいると、そういうことは起こります!)。私の言いたいことは、最低周波数 (800Mhz) を設定することです。最終的に、構成の各 CPU の /sys/devices/system/cpu/cpu*/cpufreq/ にある scaling_max_freq を変更することに成功しました。これで、周波数が 800Mhz から ....800Mhz に変動するはずです。これでうまくいき、私が経験した過熱の問題も解決しました (周波数は現在 799Mhz で変動しないため、CPU は 50°C 前後に留まります)。

PS: ターボモードも無効にします (3.1Ghz)

関連情報