xmobarにCPUコア別の周波数の最大値を表示させる
問題
CPUの周波数のうち複数のコアの最大値を取っているものを常に確認したいです。
結構前からある程度のグレード以上のCPUについては、シングルスレッドで負荷がかかるだけの処理を行う時に、一つのコアだけの周波数を発熱と消費電力が許す限り上げる機能があります。マルチスレッドでは発熱と消費電力の関係で全コア5.7GHzとは行かない場合でも、シングルスレッドならば余裕があるというわけですね。実際はもう少し条件などが複雑らしいですが簡略化するとこのようなものです。
IntelにもAMDにも同様の機能はありますが、 AMD RyzenだとPrecision Boostと名付けられてます。
さて、
glances
などで見れるCPU周波数はどうも平均値か何かのようで、マルチスレッドでの処理が高周波数で行われてるか確認する分には使えるのですが、シングルスレッドのみの処理が正常に高周波数で行われていて、冷却が十分かどうかなどを確認するには心もとないです。
xmobarのCpuFreqを使う
xmobarには CpuFreq があります。これがコアの周波数のmax, min, avgが取れるため、これを使えば良さそうです。
しかしExampleをそのまま適応したら一つ問題があります。整数値でしか表示してくれないので、表示が2GHz
とか6GHz
とかになります。さすがに未だ現代ではGHz単位は大雑把すぎますね。
解決策がよく分からなくなったのでソースコードを読んで動きを追ってみたところ、ジェネラルなオプション-d
, --ddigits
で小数点以下の値をどれだけ表示するか決めていることが分かりました。
よって2.98GHz
みたいに表示して欲しい時は以下のようになります。
Run CpuFreq ["-t", "Freq: <max>GHz", "--ddigits", "2"] 100
これでRyzen 7950Xがシングルスレッドならば5.8GHzの周波数を普通に出すことが分かり、最新版のLinuxカーネルのAMD P-Stateがちゃんと制御を行えていることがいつでも確認できて安心ですね。
と思ったら、
最大ブースト・クロック 最大 5.7GHz
なので普通に超えてます。クソデカラジエーターによる冷却力の強さのおかげでしょうか。