2022-12-18

Linux Mint で AMD P-State Driver が動いた

 別件で journalctl でログを調べていたところ、見慣れぬ Information メッセージを発見したことがきっかけで、AMD P-State Driver を試してみました。

AMD P-State は ZEN2 以降の Ryzen で利用可能な省電力機構です。ワタシの CPU は Ryzen 3 3100 なので、ギリギリ Zen 2 世代で要件は満たしています。

OS は Linux Mint 21.1 BETA(Ubuntu 22.04 相当) で、 Linux kernel は 5.15(正確には 5.15.0-56) です。

ログから発見した Information メッセージは以下です。 

amd_pstate: This processor supports shared memory solution, you can enable it with amd_pstate.shared_mem=1

なんか Linux kernel の起動オプションに amd_pstate.shared_mem=1 を付け足すだけで P-State が動くよ、と言ってるみたいです。ホント?

念のため、その他の関連パラメーターも確認してみます。

$ cat /boot/config-5.15.0-56-generic | grep -i pstate
CONFIG_X86_INTEL_PSTATE=y
CONFIG_X86_AMD_PSTATE=y

お、CONFIG_X86_AMD_PSTATE=y ですね。信じていいんですか?

ということで PC を再起動し、GRUB の起動メニューから一時的に kernel 起動オプションを変更して amd_pstate.shared_mem=1 を付け足してみました。

Linux Mint の起動は成功し、cpupower コマンドでドライバーを確認してみます。

$ cpupower frequency-info
analyzing CPU 0:
  driver: amd-pstate
  CPUs which run at the same hardware frequency: 0
  CPUs which need to have their frequency coordinated by software: 0
  maximum transition latency: 131 us
  hardware limits: 550 MHz - 3.91 GHz
  available cpufreq governors: conservative ondemand userspace powersave performance schedutil
  current policy: frequency should be within 550 MHz and 3.91 GHz.
                  The governor "schedutil" may decide which speed to use
                  within this range.
  current CPU frequency: Unable to call hardware
  current CPU frequency: 2.87 GHz (asserted by call to kernel)
  boost state support:
    Supported: no
    Active: no

journalctl でログも確認してみると以前とは異なるメッセージが出力されていました。わぉ。

powernow_k8: WTF driver: amd-pstate

ほぇぇ、ホントに amd-pstate で動きましたね。でも、current CPU frequency が 2.87 GHz と acpi-cpufreq ドライバーの時と変わらずですね。

ちなみにこちらは acpi-cpufreq ドライバーの時の frequency-info です。

$ cpupower frequency-info
analyzing CPU 0:
  driver: acpi-cpufreq
  CPUs which run at the same hardware frequency: 0
  CPUs which need to have their frequency coordinated by software: 0
  maximum transition latency:  Cannot determine or is not supported.
  hardware limits: 2.20 GHz - 3.91 GHz
  available frequency steps:  3.60 GHz, 2.80 GHz, 2.20 GHz
  available cpufreq governors: conservative ondemand userspace powersave performance schedutil
  current policy: frequency should be within 2.20 GHz and 3.60 GHz.
                  The governor "schedutil" may decide which speed to use
                  within this range.
  current CPU frequency: Unable to call hardware
  current CPU frequency: 2.79 GHz (asserted by call to kernel)
  boost state support:
    Supported: no
    Active: no

acpi-cpufreq ドライバーではクロックの下限が 2.20 GHz、上限が 3.60 GHz であったものが、amd-pstate ドライバーに変えると下限が 550 MHz、上限が 3.90 GHz へとそれぞれ変わっています。

 

 

なんかもうひとつ設定を付け加えると発動するじゃないかと調べていたら、watch コマンドでリアルタイムに CPU コア毎のクロック周波数を確認できるようなので試してみました。

watch コマンドはこちら。

$ watch grep \"cpu MHz\" /proc/cpuinfo

これはドライバーが acpi-cpufreq の結果です。忙しいコアは 3.6 GHz で動き、暇なコアは下限の 2.2GHz でした。 

なるほど、これらの各コアの平均値が frequency-info が言うところの 2.8 GHz なんですね。

Every 2.0s: grep "cpu MHz" /proc/cpuinfo

cpu MHz         : 3600.000
cpu MHz         : 2200.000
cpu MHz         : 2200.000
cpu MHz         : 3600.000
cpu MHz         : 2800.000
cpu MHz         : 2777.743
cpu MHz         : 2200.000
cpu MHz         : 2200.000

そして、こちらはドライバーが amd-pstate の結果です。下限は 550 MHz に変わり、上限も 3.9 GHz に変わっています。 

平均すると 1.8 GHz くらいですが、frequency-info では 2.8 GHz と表示されます。cpupower コマンドが何か処理をしているので 3.9GHz で動いているコアがもうちょっとあったんだと思います。

Every 2.0s: grep "cpu MHz" /proc/cpuinfo

cpu MHz         : 3905.000
cpu MHz         : 3905.000
cpu MHz         : 550.000
cpu MHz         : 550.000
cpu MHz         : 1853.349
cpu MHz         : 550.000
cpu MHz         : 2420.224
cpu MHz         : 550.000

amd-pstate にすると、随分と極端な使い方になりましたね。Ryzen 3 3100 は基本クロックが 3.6 GHz で、ブーストクロックが 3.9 GHz なのですが、ブーストクロックを使ってますね。BIOS では使用不可にしてたはずなんですが。

ということで、cpupower コマンドでクロック周波数の最大値を 3000 MHz に制限してみました。

$ sudo cpupower frequency-set -u 3000MHz

 

 

ここで governor を schedutil から ondemand に変えてみました。

というのも、amd-pstate について調べてみると「最近に追加された schedutil の方が以前から存在している ondemand よりも優れている」という情報が多かったので、試しに ondemand に変えて差を見たかったのです。

$ sudo cpupower frequency-set -g ondemand

するとどうでしょう?ondemand の方が current CPU frequency が下がっています。ん?どういうことだ?と思い、再び watch コマンドでコア毎のクロック周波数を確認してみると、なんか ondemand の方が理想的な使い方に見えました。

こちらは frequency-info の結果です。current policy の部分に "ondemand" と表示されています。また、current CPU frequency は 864 MHz と表示されています。

$ cpupower frequency-info
analyzing CPU 0:
  driver: amd-pstate
  CPUs which run at the same hardware frequency: 0
  CPUs which need to have their frequency coordinated by software: 0
  maximum transition latency: 131 us
  hardware limits: 550 MHz - 3.91 GHz
  available cpufreq governors: conservative ondemand userspace powersave performance schedutil
  current policy: frequency should be within 550 MHz and 3.60 GHz.
                  The governor "ondemand" may decide which speed to use
                  within this range.
  current CPU frequency: Unable to call hardware
  current CPU frequency: 864 MHz (asserted by call to kernel)
  boost state support:
    Supported: no
    Active: no

そして、こちらは watch コマンド

Every 2.0s: grep "cpu MHz" /proc/cpuinfo

cpu MHz         : 617.100
cpu MHz         : 617.100
cpu MHz         : 1288.100
cpu MHz         : 684.200
cpu MHz         : 851.950
cpu MHz         : 744.775
cpu MHz         : 2261.050
cpu MHz         : 1321.650

というわけで、クロック周波数の最大値は 3600 MHz に再設定し、governor は ondemand という構成でしばらく使ってみようと思います。

しかし、governor は ondemand と schedutil のどちらが良いのでしょうかね?下限に張り付かないけど、上限にも張り付かない ondemand、下限と上限に張り付く schedutil で CPU 温度とか消費電力的に効率がいいのは。

 

そして、こちらは(結局)いつもお世話にある非常に有益なサイトです。今回もだいぶ参考にさせていただきました。

CPU 周波数スケーリング