別件で 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 温度とか消費電力的に効率がいいのは。
そして、こちらは(結局)いつもお世話にある非常に有益なサイトです。今回もだいぶ参考にさせていただきました。