「CPU 周波数スケーリング」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
("Collaborative processor performance control" を追加)
(→‎power-profiles-daemon: 翻訳を修正)
 
(2人の利用者による、間の10版が非表示)
29行目: 29行目:
 
デフォルトでは、このデーモンは利用可能な CPU デジタル温度センサーを使って CPU 温度を監視し、ハードウェアが積極的な補正動作を行う前に CPU 温度を制御下に維持します。thermal sysfs に皮膚温度センサーがある場合、皮膚温度を 45C 以下に保とうと試みます (訳注: ここでの皮膚温度 (skin temperature) とは、ユーザがデバイスを持ったときに感じる温度のことです)。
 
デフォルトでは、このデーモンは利用可能な CPU デジタル温度センサーを使って CPU 温度を監視し、ハードウェアが積極的な補正動作を行う前に CPU 温度を制御下に維持します。thermal sysfs に皮膚温度センサーがある場合、皮膚温度を 45C 以下に保とうと試みます (訳注: ここでの皮膚温度 (skin temperature) とは、ユーザがデバイスを持ったときに感じる温度のことです)。
   
Tiger Lake ラップトップ (例: [[Dell Latitude 3420]]) では、このデーモンは、他の方法で利用できるものよりも[https://www.phoronix.com/review/intel-thermald-tgl 多くのパフォーマンスを解放する]と報告されています。
+
Tiger Lake ラップトップ (例: [https://wiki.archlinux.org/title/Dell_Latitude_3420 Dell Latitude 3420]) では、このデーモンは、他の方法で利用できるものよりも [https://www.phoronix.com/review/intel-thermald-tgl 多くのパフォーマンスを解放する] と報告されています。
   
関連する systemd ユニットは {{ic|thermald.service}} です。このサービスは[[起動]]され、かつ[[有効化]]されている必要があります。
+
関連する systemd ユニットは {{ic|thermald.service}} です。このサービスは [[起動]] され、かつ [[有効化]] されている必要があります。
   
 
=== i7z ===
 
=== i7z ===
61行目: 61行目:
 
=== power-profiles-daemon ===
 
=== power-profiles-daemon ===
   
{{Pkg|power-profiles-daemon}} の ''powerprofilesctl'' コマンドラインツールは {{ic|power-profiles-daemon}} サービスを通して電源プロファイル (バランス、パワーセーバー、パフォーマンスなど) を扱います。GNOME と KDE もプロファイル切り替えのための [https://gitlab.freedesktop.org/hadess/power-profiles-daemon#how-to-use グラフィカルインターフェイス] を提供しています。以下を参照してください:
+
{{Pkg|power-profiles-daemon}} の ''powerprofilesctl'' コマンドラインツールは {{ic|power-profiles-daemon}} サービスを通して電源プロファイル (省電力、バランス、パフォーマンスなど) を扱います。GNOME と KDE もプロファイル切り替えのための [https://gitlab.freedesktop.org/hadess/power-profiles-daemon#how-to-use グラフィカルインターフェイス] を提供しています。以下を参照してください:
   
 
* [[GNOME#電源モード]]
 
* [[GNOME#電源モード]]
68行目: 68行目:
 
使い方や使用例、類似プロジェクトとの比較などについては、[https://gitlab.freedesktop.org/hadess/power-profiles-daemon#power-profiles-daemon プロジェクトの README] を参照してください。
 
使い方や使用例、類似プロジェクトとの比較などについては、[https://gitlab.freedesktop.org/hadess/power-profiles-daemon#power-profiles-daemon プロジェクトの README] を参照してください。
   
{{ic|power-profiles-daemon}} サービスを[[起動/有効化]]してください。''powerprofilesctl'' が起動されると、サービスも起動しようとすることに注意してください ({{ic|dbus.service}} の[[ユニットステータス]]を見てください)
+
{{ic|power-profiles-daemon}} サービスを [[起動/有効化]] してください。''powerprofilesctl'' が起動されると、サービスも起動しようとすることに注意してください ({{ic|dbus.service}} の [[ユニットステータス]] を見てください。)
   
{{Note|''power-profiles-daemon'' は、[[TLP]] や {{AUR|tuned}}、{{AUR|system76-power}} といった他の電源管理サービスと[https://gitlab.freedesktop.org/hadess/power-profiles-daemon/-/blob/main/data/power-profiles-daemon.service.in#L3 衝突]します。(潜在的に依存関係にあるため) ''power-profiles-daemon'' を[[アンインストール]]せずに前述のサービスのどれかを代わりに使用するには、{{ic|power-profiles-daemon}} サービスを[[マスク]]して無効化してください ([https://github.com/linrunner/TLP/issues/564]、[https://linrunner.de/tlp/installation/arch.html#service-units] も参照)。}}
+
{{Note|''power-profiles-daemon'' は、[[TLP]] や {{AUR|tuned}}、{{AUR|system76-power}} といった他の電源管理サービスと[https://gitlab.freedesktop.org/hadess/power-profiles-daemon/-/blob/main/data/power-profiles-daemon.service.in#L3 衝突]します。(潜在的に依存関係にあるため) ''power-profiles-daemon'' を [[アンインストール]] せずに前述のサービスのどれかを代わりに使用するには、{{ic|power-profiles-daemon}} サービスを [[マスク]] して無効化してください ([https://github.com/linrunner/TLP/issues/564]、[https://linrunner.de/tlp/installation/arch.html#service-units] も参照。)}}
   
 
== スケーリングドライバ ==
 
== スケーリングドライバ ==
  +
  +
スケーリングドライバは、ガバナーによって指定された周波数を設定する CPU 固有の詳細を実装します。厳密に言えば、ACPI 標準は、P0 で始まって徐々に低パフォーマンスになる [[wikipedia:Advanced Configuration and Power Interface#Performance state|power-performance states (P-states)]] を要求しています。この機能は、Intel では SpeedStep と、AMD では PowerNow! と呼ばれています。
  +
  +
とはいえ実際には、プロセッサは固定の P-state に制限するどころか、特定の周波数を指定する方法を提供しています。スケーリングドライバは周波数の指定を処理します。
   
 
{{Note|
 
{{Note|
* カーネル 3.4 から、ネイティブ CPU モジュールは自動的にロードされます。
+
* ネイティブ CPU モジュールは自動的にロードされます。
* カーネル 3.9 から、新しい Intel CPU には下に書かれているドライバの代わりに新しい {{ic|pstate}} パワースケーリングドライバが自動的に使れます。このドライバは他のドライバよりも優先され、モジュールではなく初めから備えられています。現在 Sandy Bridge や Ivy Bridge 以降の新しい CPU でこのドライバーが自動的に使用されます。このドライバを使ていて問題が生じた際は、kernel に {{ic|intel_pstate=disable}} を追加してください。同じユーザースペースユーティリティを使うこともできますがコントロールはできません
+
* 最近の Intel CPU において記の他のドライバの代わりに {{ic|intel_pstate}} CPU パワースケーリングドライバが自動的に使用されます。このドライバは他のドライバよりも優先され、モジュールではなく、組み込まれています。現在、このドライバは Sandy Bridge 及びそれ以降の CPU において自動的に使用されます。{{ic|intel_pstate}} は BIOS の P-State 設定を無視する場合があります。古い CPU においては {{ic|intel_pstate}} は {{ic|intel_cpufreq}} ドライバによって "passive mode" で動作する場合があります。このドライバを使用していて問題がする場合は、{{ic|acpi_cpufreq}} ドライバを使用するようにするために {{ic|1=intel_pstate=disable}} をカーネルラインに追加してください。
  +
* {{ic|amd_pstate}} CPU パワースケーリングドライバはデフォルトで非アクティブです。しかし、サポートされている CPU (Zen 2 及びそれ以降) を使用している場合は、{{ic|1=amd_pstate=passive}}、{{ic|1=amd_pstate=active}}、そして {{ic|1=amd_pstate=guided}} のうちどれかを[[カーネルパラメータ]]に追加することでこのドライバを手動で有効化することができます。一部のマザーボードは、必要な設定をファームウェア内で有効化しない場合があり、その結果 {{ic|the _CPC object is not present in SBIOS or ACPI disabled}} エラーが発生します。UEFI で ''Enable CPPC'' やこれと似たような設定を ''Auto'' から ''Enabled'' に変更してください。この設定が UEFI に存在しない場合は、ベンダーのウェブサイトでアップデートがないか調べてください。
* 上記の P State の挙動は {{ic|/sys/devices/system/cpu/intel_pstate}} で変えることができます。例えば、CPU の温度を低く保つために {{ic|# echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo}} で Intel Turbo Boost を無効にすることが可能です。
 
* 新しい Intel の CPU は [https://01.org/linux-thermal-daemon Linux Thermal Daemon] ({{Pkg|thermald}} から使えます) でコントロールでき P-states, T-states, Intel power clamp ドライバーを使って熱を積極的にコントロールします。thermald は古い Intel CPU でも使うことができます。最新のドライバーが存在しない場合、デーモンは x86 モデルのレジスタにリバートして Linux の ‘cpufreq サブシステム’ で冷却システムを制御します。
 
 
}}
 
}}
   
''cpupower'' はネイティブ CPU の制限をるためにモジュールを必要とします:
+
''cpupower'' はネイティブ CPU の制限を調べるためにドライバを必要とします:
   
{| class="wikitable sortable"
+
{| class="wikitable"
!モジュール!!説明
+
! ドライバ !! 説明
  +
|-
  +
| intel_pstate || このドライバは、Intel Core (Sandy Bridge 及びそれ以降) プロセッサの内部ガバナーでスケーリングドライバを実装しています。
  +
|-
  +
| amd_pstate_epp || この "active" ドライバは、AMD Ryzen (一部の Zen 2 及びそれ以降) プロセッサの内部ガバナーでスケーリングドライバを実装しています。
  +
|-
  +
| acpi_cpufreq || ACPI Processor Performance States を使用する CPUFreq ドライバ。このドライバは Intel Enhanced SpeedStep もサポートします (以前は、非推奨の speedstep-centrino モジュールによってサポートされていました)。AMD Ryzen においては、このドライバは 3 つの周波数状態のみを提供します。
  +
|-
  +
| intel_cpufreq || カーネル 5.7 から、intel_pstate スケーリングドライバは、hardware-managed P-states (HWP) をサポートしない CPU (つまり、Intel Core i の第5世代及びそれ以前) においては "passive mode" (別名 intel_cpufreq) を選択します。このドライバは、Intel CPU で ACPI ドライバと似たように動作します。ただし、ACPI の 16-pstate の制限は存在しません。
 
|-
 
|-
| intel_pstate || このドライバIntel Core (SandyBridge 以降) プロセッサ内部 governor でスケーリングドライバー実装ています。
+
| amd_pstate || このドライバは AMD Ryzen において acpi_cpufreq よりも遥かに多くP-state公開します。ただし、governing は引き継ぎません
 
|-
 
|-
| acpi-cpufreq || ACPI Processor Performance States利用する CPUFreq ドライバドライバーは Intel Enhanced SpeedStepサポートています (以前は speedstep-centrino モジュルによってサポートされていました)
+
| cppc_cpufreq || ACPI CPPC システム (以下を参照)ベースとした CPUFreq ドライバ。AArch64 システムにおいては共通のデフォルトです。最近x86 において動作しますが、上記 2 つのベンダ固有の選択肢の方が優れていま
 
|-
 
|-
| speedstep-lib || Intel SpeedStep が有効になっているプロセッサ (ほとんどの Atom と古い Pentium (< 3)) の CPUFreq ドライバ
+
| speedstep_lib || Intel SpeedStep 対応プロセッサ (主に Atom と古い Pentium) の CPUFreq ドライバ。
 
|-
 
|-
| powernow-k8 || K8/K10 Athlon64/Opteron/Phenom プロセッサの CPUFreq ドライバ。Linux 3.7 からファミリーの新しい CPU は 'acpi-cpufreq' が自動的に使れます。
+
| powernow_k8 || K8/K10 Athlon 64/Opteron/Phenom プロセッサの CPUFreq ドライバ。Linux 3.7 から、より最近 AMD CPU においては 'acpi_cpufreq' が自動的に使用されます。
 
|-
 
|-
| pcc-cpufreq || このドライバ ProLiant サーバーで使われている Hewlett-Packard と Microsoft Corporation による Processor Clocking Control インターフェイスをサポートしす。
+
| pcc_cpufreq || このドライバはHewlett-Packard と Microsoft Corporation による Processor Clocking Control インターフェイスをサポートします。一部の ProLiant サーバにおて便利です。
 
|-
 
|-
| p4-clockmod || Intel Pentium 4 / Xeon / Celeron プロセッサの CPUFreq ドライバ有効にするとクロックをスキップして CPU 温度を下げます。<br>基本的 SpeedStep ドライバーを使って下さい。
+
| p4_clockmod || Intel Pentium 4/Xeon/Celeron プロセッサの CPUFreq ドライバ。クロックをスキップすることで CPU 温度を下げます。(代わり{{ic|speedstep_lib}} を使用したほうが良かもしれません)
 
|}
 
|}
   
 
利用可能なモジュールの完全なリストを表示するには、次を実行してください:
 
利用可能なモジュールの完全なリストを表示するには、次を実行してください:
   
$ ls /lib/modules/$(uname -r)/kernel/drivers/cpufreq/
+
$ ls /usr/lib/modules/$(uname -r)/kernel/drivers/cpufreq/
   
適切なモジュールをロードしてください (詳しくは[[カーネルモジュール]]を見て下さい)。cpufreq ドライバーが正しくロードされていれば、次のコマンドで CPU の詳細が表示されます:
+
適切なモジュールをロードしてください (詳しくは[[カーネルモジュール]]を見て下さい)。適切な cpufreq ドライバーがロードされていれば、次のコマンドで CPU の詳細が表示されます:
   
 
$ cpupower frequency-info
 
$ cpupower frequency-info
109行目: 120行目:
 
=== 最大・最小周波数を設定する ===
 
=== 最大・最小周波数を設定する ===
   
ごく稀に、手動で最大・最小周波数を設定しなくてはならないことがあります。
+
一部のケース最大・最小周波数を手動で設定する必要があることがあります。
   
最大クロック周波数を設定するには (''clock_freq'' は単位けて下さい: GHz, MHz):
+
最大クロック周波数を設定するには ({{ic|''clock_freq''}} は単位付きのクロック周波数です: GHzMHz):
   
 
# cpupower frequency-set -u ''clock_freq''
 
# cpupower frequency-set -u ''clock_freq''
119行目: 130行目:
 
# cpupower frequency-set -d ''clock_freq''
 
# cpupower frequency-set -d ''clock_freq''
   
CPU を特定の周波数で動作するように設定するには:
+
特定の周波数で動作するように CPU を設定するには:
   
 
# cpupower frequency-set -f ''clock_freq''
 
# cpupower frequency-set -f ''clock_freq''
   
 
{{Note|
 
{{Note|
* 単一の CPU コアだけを調整するには、{{ic|-c ''core_number''}} を加えてさい。
+
* 単一の CPU コアだけを調整するには、{{ic|-c ''core_number''}} をコマンドに加えてください。
* governor, 最大最小周波数は {{ic|/etc/default/cpupower}} で設定できます。
+
* ガバナーの最大周波数と最小周波数は {{ic|/etc/default/cpupower}} で設定できます。
 
}}
 
}}
   
  +
あるいは、手動で周波数を設定することもできます:
=== Turbo Boost の無効化 ===
 
   
  +
# echo ''value'' | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_max_freq
==== intel_pstate ====
 
  +
  +
利用可能な値は {{ic|/sys/devices/system/cpu/cpu*/cpufreq/scaling_available_frequencies}} などで調べられます。[https://web.archive.org/web/20201029114421/https://software.intel.com/sites/default/files/comment/1716807/how-to-change-frequency-on-linux-pub.txt]
  +
  +
=== 周波数ブーストを設定する ===
  +
  +
一部のプロセッサでは、適切な温度条件下で短時間、周波数を通常の最大値以上に上げることができます。これは、Intel プロセッサでは [[Wikipedia:ja:インテル ターボ・ブースト・テクノロジー|Turbo Boost]] と、AMD プロセッサでは [[Wikipedia:AMD Turbo Core|Turbo-Core]] と呼ばれています。
  +
  +
==== sysfs から設定する (intel_pstate) ====
  +
  +
intel_pstate には、プロセッサがターボ P-State に入ることを禁止するための、ドライバ固有のインターフェイスが存在します:
   
 
# echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo
 
# echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo
   
  +
==== sysfs から設定する (古いスケーリングドライバ) ====
==== acpi-cpufreq ====
 
  +
  +
{{ic|intel_pstate}} より古いスケーリングドライバにおいては、ドライバがブーストをサポートしている場合、{{ic|/sys/devices/system/cpu/cpufreq/boost}} 属性が存在し、これを使ってブーストを無効化/有効化することができます:
   
 
# echo 0 > /sys/devices/system/cpu/cpufreq/boost
 
# echo 0 > /sys/devices/system/cpu/cpufreq/boost
   
==== x86_energy_perf_policy ====
+
==== x86_energy_perf_policy から設定する ====
   
{{Pkg|x86_energy_perf_policy}} を使用します
+
Intel プロセッサにおいては、{{Pkg|x86_energy_perf_policy}} を使ってターボブーストを設定することもできます:
   
 
# x86_energy_perf_policy --turbo-enable 0
 
# x86_energy_perf_policy --turbo-enable 0
   
  +
=== amd_pstate ===
この変更は一時的なものです。
 
  +
  +
{{ic|amd_pstate}} には 3 つのオペレーションモードが存在します: CPPC autonomous (active) モード、CPPC non-autonomous (passive) モード、CPPC guided autonomous (guided) モード。active/passive/guided モードは、それぞれカーネルパラメータ {{ic|1=amd_pstate=active}}、{{ic|1=amd_pstate=passive}}、{{ic|1=amd_pstate=guided}} で選択できます。
  +
  +
; Active モード
  +
: {{ic|active}} モードは {{ic|amd_pstate_epp}} (Energy Performance Preference) ドライバによって実装されており、カーネル 6.3 及びそれ以降で利用可能です。このモードでは、ソフトウェアが CPPC ファームウェアにパフォーマンス (0x0) または電力効率 (0xff) にバイアスをかけることを要求した場合、{{ic|amd_pstate_epp}} ドライバはハードウェアにヒントを提供します。
  +
; Passive モード
  +
: {{ic|passive}} モードは {{ic|amd_pstate}} ドライバによって実装されています。このモードでは、ドライバは現在の負荷に基づいて望ましいパフォーマンス (特に、ユーザエクスペリエンスに影響を与えずにどれだけパフォーマンスの低下を許容できるか) を定義します。
  +
; Guided モード
  +
: {{ic|guided}} モードは {{ic|amd_pstate}} ドライバによって実装されており、カーネル 6.4 及びそれ以降で利用可能です。このモードでは、{{ic|amd_pstate}} ドライバはパフォーマンスレベルの最大と最小をリクエストし、プラットフォームは、現在の負荷において適切なパフォーマンスレベルをその範囲内で自動的に選択します。
   
 
== スケーリングガバナー ==
 
== スケーリングガバナー ==
   
  +
スケーリングガバナーとは、望ましい CPU 周波数を決定するパワースキームです。固定の周波数をリクエストするガバナーもありますし、システムの負荷に応じて動的に調節するアルゴリズムを実装しているものもあります。カーネルに含まれているガバナーは以下のとおりです:
Governor (下の表を参照) は cpu の電源設定です。一度に有効にできるのはどれか一つだけになります。詳しくは、カーネルソースに含まれている[https://www.kernel.org/doc/Documentation/cpu-freq/governors.txt カーネルドキュメント]を見て下さい。
 
  +
  +
{{Note|1=各ガバナーは任意のスケーリングドライバと互換性があります。ただし、active モードでの {{ic|intel_pstate}} と {{ic|amd_pstate}} は例外です。これらは、{{ic|powersave}} と {{ic|performance}} という形で疑似ガバナーを提供します。下の [[#自律的な周波数スケーリング]] を参照してください。}}
   
 
{| class="wikitable"
 
{| class="wikitable"
! Governor !! 説明
+
! ガバナー !! 説明
 
|-
 
|-
| performance || 最大周波数で CPU を動作させます。
+
| performance || 最大周波数で CPU を動作させます。最大周波数は {{ic|/sys/devices/system/cpu/cpu''X''/cpufreq/scaling_max_freq}} で得ることができます。
 
|-
 
|-
| powersave || 最小周波数で CPU を動作させます。
+
| powersave || 最小周波数で CPU を動作させます。最小周波数は {{ic|/sys/devices/system/cpu/cpu''X''/cpufreq/scaling_min_freq}} で得ることができます。
 
|-
 
|-
| userspace || ユーザーが指定した周波数で CPU を動作させます。
+
| userspace || ユーザーが指定した周波数で CPU を動作させます。{{ic|/sys/devices/system/cpu/cpu''X''/cpufreq/scaling_setspeed}} で設定可能です。
 
|-
 
|-
| ondemand || 負にあわせて周波数を動的に切り替えます。負担が高まると周波数が高くなり、アイドル時間が増えると元の周波数に戻ります。
+
| ondemand || 現在のにあわせて周波数を動的に切り替えます。最大周波数に一気に切替えたあと、アイドル時間が増えるにつれて周波数がもとに戻る可能性があります。
 
|-
 
|-
| conservative || 負にあわせて周波数を動的に切り替えます。ondemand と違って段階的に周波数を切り替えます。
+
| conservative || 現在のにあわせて周波数を動的に切り替えます。ondemand よりも段階的に周波数を切り替えます。
 
|-
 
|-
| schedutil || スケジューラによって CPU の周波数が選択されます [https://lwn.net/Articles/682391/], [https://lkml.org/lkml/2016/3/17/420]。
+
| schedutil || スケジューラによって CPU の周波数が選択されます [https://lwn.net/Articles/682391/][https://lore.kernel.org/lkml/1614814.usHvZ58O6A@vostro.rjw.lan/]。
 
|}
 
|}
   
スケーリングドライバによって、以 governor のどれかがデフォルトでロードされます:
+
スケーリングドライバによって、以ガバナーうちどれかがデフォルトでロードされます:
* AMD と古い Intel の CPU では {{ic|ondemand}}。
 
* {{ic|intel_pstate}} ドライバーを使用する Sandybridge 以降の Intel CPU では {{ic|powersave}}。
 
   
  +
* [https://gitlab.archlinux.org/archlinux/packaging/packages/linux/-/commit/83345a2f829af62ce6fd4b4fa3a875b8f6560f43 Linux 4.9.5] 以降 では {{ic|schedutil}}
{{Note|{{ic|intel_pstate}} ドライバーでは performance と powersave ガバナーしかサポートされていません。どちらも動的に周波数を切り替えます。performance ガバナーを利用することで[https://www.phoronix.com/scan.php?page&#61;news_item&px&#61;MTM3NDQ 旧 ondemand ガバナーよりも高度な省電力機能を使うことができます]。}}
 
  +
* Intel CPU で {{ic|intel_pstate}} ドライバを使用する場合、内部の {{ic|powersave}} ガバナー (上記のノートを参照、{{ic|schedutil}} と等価です)。
   
特定 governor 有効にするは、以下のコマンド実行してください:
+
{{Warning|デフォルトガバナー変更する場合は、CPU 監視ツール使用してください (温度や電圧など)。}}
  +
  +
特定のガバナーをアクティブ化するには、以下のコマンドを実行してください:
   
 
# cpupower frequency-set -g ''governor''
 
# cpupower frequency-set -g ''governor''
178行目: 213行目:
 
{{Note|
 
{{Note|
 
* 単一の CPU コアだけを調整するには、上のコマンドに {{ic|-c ''core_number''}} を加えて下さい。
 
* 単一の CPU コアだけを調整するには、上のコマンドに {{ic|-c ''core_number''}} を加えて下さい。
* governor を有効にするには特定の[[カーネルモジュール]] ({{ic|cpufreq_''governor''}}) がロードされることを必要とします。カーネル 3.4 から、これらのモジュールは自動的にロードされます。
+
* ガバナーを有効にするには特定の[[カーネルモジュール]] ({{ic|cpufreq_''governor''}}) がロードされている必要があります。カーネル 3.4 現在、これらのモジュールは自動的にロードされます。
 
}}
 
}}
   
もしくは、CPU ごとに governor を手動で有効にすることもできます:
+
もしくは、CPU ごとにガバナーを手動で有効にすることもできます:
  +
# echo ''governor'' > /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
 
  +
# echo ''governor'' | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
   
{{Tip|cpu の速度をリアルタイムで表示するには、次を実行してください:
+
{{Tip|CPU の速度をリアルタイムで表示するには、次を実行してください:
  +
$ watch cat /sys/devices/system/cpu/cpu[0-9]*/cpufreq/scaling_cur_freq
$ watch grep \"cpu MHz\" /proc/cpuinfo
 
 
}}
 
}}
   
=== ondemand governor を調整する ===
+
=== ondemand ガバナーを調整する ===
   
詳細は [https://www.kernel.org/doc/Documentation/cpu-freq/governors.txt カーネルドキュメント] を見てさい。
+
詳細は[https://docs.kernel.org/admin-guide/pm/cpufreq.html#ondemand カーネルドキュメント]を見てください。
   
 
==== 閾値を切り替える ====
 
==== 閾値を切り替える ====
196行目: 232行目:
 
周波数を上げるときの閾値を設定するには:
 
周波数を上げるときの閾値を設定するには:
   
# echo -n ''percent'' > /sys/devices/system/cpu/cpufreq/<governor>/up_threshold
+
# echo -n ''percent'' > /sys/devices/system/cpu/cpufreq/''governor''/up_threshold
   
 
周波数を下げるときの閾値を設定するには:
 
周波数を下げるときの閾値を設定するには:
   
# echo -n ''percent'' > /sys/devices/system/cpu/cpufreq/<governor>/down_threshold
+
# echo -n ''percent'' > /sys/devices/system/cpu/cpufreq/''governor''/down_threshold
   
 
==== サンプリングレート ====
 
==== サンプリングレート ====
   
サンプリングレートは CPU の周波数を変化させるのに governor が確認する頻度を決めます。1 より大きく {{ic|sampling_down_factor}} を設定すると負担評価のオーバーヘッドが減って、負担が高い時に CPU がずっと最高周波数で動作しパフォーマンスが向上します。{{ic|sampling_down_factor}} に設定できる値は 1 から 100000 です。CPU 周波数や負担が低いときの挙動には影響がありません。
+
サンプリングレートはCPU の周波数を変化させるのにガバナーが確認する頻度を決めます。1 より大きく {{ic|sampling_down_factor}} を設定すると負担評価のオーバーヘッドが減って、負担が高い時に CPU がずっと最高周波数で動作しパフォーマンスが向上します。{{ic|sampling_down_factor}} に設定できる値は 1 から 100000 です。CPU 周波数や負担が低いときの挙動には影響がありません。
   
 
値を読み取るには (デフォルト = 1)、次を実行:
 
値を読み取るには (デフォルト = 1)、次を実行:
216行目: 252行目:
 
==== 変更を永続化させる ====
 
==== 変更を永続化させる ====
   
  +
Linux 5.9 から、{{ic|cpufreq.default_governor}} カーネルオプションを設定することが可能になりました。[https://kernelnewbies.org/Linux_5.9#CPU_Frequency_scaling] スケーリングパラメータをブート時に設定するには、[[#cpupower|cpupower]] ユーティリティを設定して、cpupower の systemd サービスを有効化してください。あるいは、[[systemd-tmpfiles]] や [[udev]] ルールを使用することもできます。
[[カーネルモジュール#/etc/modprobe.d/ 内のファイルを使う]]あるいは [[systemd]] で永続的に設定する方法がありますが、場合によっては競合状態になることがあります。[[systemd#一時ファイル]]を参照してください。[[udev]] のほうが上手く処理します。
 
 
例えば、スケーリングガバナーが {{ic|acpi_cpufreq}} の場合で CPU コア {{ic|0}} のスケーリングガバナーを performance に設定するには、以下の udev ルールを作成してください:
 
 
{{hc|/etc/udev/rules.d/50-scaling-governor.rules|<nowiki>
 
SUBSYSTEM=="module", ACTION=="add", KERNEL=="acpi_cpufreq", RUN+=" /bin/sh -c ' echo performance > /sys/devices/system/cpu/cpufreq/policy0/scaling_governor ' "
 
</nowiki>}}
 
 
起動後に変更を永続化させるには、initramfs を使用している場合、[[udev#デバッグ出力]]の例に従ってください。
 
 
{{Tip|もしくは、[[#cpupower|cpupower]] ユーティリティを設定して systemd サービスを有効にしてください。}}
 
   
 
== 自律的な周波数スケーリング ==
 
== 自律的な周波数スケーリング ==
257行目: 283行目:
   
 
{{ic|cppc_cpufreq}} は汎用の CPPC スケーリングドライバです。{{ic|amd_pstate}} も、Zen 3 MSR が利用できない場合に、ACPI CPPC を使用して CPU の周波数を管理します。この方法 ("共有メモリ" とも呼ばれる) は、MSR よりも高レイテンシです。
 
{{ic|cppc_cpufreq}} は汎用の CPPC スケーリングドライバです。{{ic|amd_pstate}} も、Zen 3 MSR が利用できない場合に、ACPI CPPC を使用して CPU の周波数を管理します。この方法 ("共有メモリ" とも呼ばれる) は、MSR よりも高レイテンシです。
  +
  +
== Intel performance and energy bias hint ==
  +
  +
[https://docs.kernel.org/admin-guide/pm/intel_epb.html Intel performance and energy bias hint (EPB)] は、ユーザスペースが電力とパフォーマンスのトレードオフを自由に指定できるようにするための Intel CPU によって提供されているインターフェイスです。0 (最高のパフォーマンス) から 15 (最高の省電力) のスケールで指定できます。FPB レジスタは、周波数スケーリングとは独立して機能する、パフォーマンス管理のもう一つのレイヤーです。P-state と C-state の選択がどの程度積極的に行われるかに関与し、エネルギー消費量に影響を与える内部のモデル固有の決定に影響を与えます。
  +
  +
以下は一般的な値とそれぞれのエイリアスです (sysfs と x86_energy_perf_policy によって認識されます):
  +
  +
{| class="wikitable"
  +
! EPB 値
  +
! 文字列
  +
|-
  +
| 0
  +
| performance
  +
|-
  +
| 4
  +
| balance-performance
  +
|-
  +
| 6
  +
| normal, default
  +
|-
  +
| 8
  +
| balance-power
  +
|-
  +
| 15
  +
| power
  +
|}
  +
  +
=== sysfs から設定する ===
  +
  +
EPB は sysfs 属性を用いて設定できます:
  +
  +
# echo ''epb'' | tee /sys/devices/system/cpu/cpu*/power/energy_perf_bias
  +
  +
=== x86_energy_perf_policy から設定する ===
  +
  +
{{Pkg|x86_energy_perf_policy}} を使って:
  +
  +
# x86_energy_perf_policy --epb ''epb''
  +
  +
=== cpupower から設定する ===
  +
  +
{{Pkg|cpupower}} を使って:
  +
  +
# cpupower set -b ''epb_value''
  +
  +
{{Warning|cpupower は文字列エイリアスをサポートしていません。文字列が与えられた場合、何も言わずに EPB を 0 (最高パフォーマンス) に設定してしまいます。}}
  +
  +
== 他の x86 エネルギーフラグ ==
  +
  +
{{Pkg|x86_energy_perf_policy}} でハードウェア P-State を有効化する:
  +
  +
# x86_energy_perf_policy -H 1
  +
# x86_energy_perf_policy -U 1
  +
  +
"default" ポリシーを設定する:
  +
  +
変更は一時的です。詳細は {{man|8|x86_energy_perf_policy}} を参照してください。
   
 
== CPU idle ドライバ ==
 
== CPU idle ドライバ ==
   
{{ic|intel_idle}} を使用します。 CPU idle ドライバは、最近の Intel CPU では {{ic|acpi_idle}} ドライバの代わりに自動的に使用されます。このドライバは現在 Sandy Bridge およびそれ以降の CPU で自動的に使用されます。{{ic|intel_idle}} は BIOS の C-State 設定を無視する場合があります。このドライバを使用中に問題が発生した場合、カーネルラインに {{ic|1=intel_idle.max_cstate=0}} を追加してください。
+
{{ic|intel_idle}} CPU idle ドライバは、最近の Intel CPU では {{ic|acpi_idle}} ドライバの代わりに自動的に使用されます。このドライバは現在 Sandy Bridge およびそれ以降の CPU で自動的に使用されます。{{ic|intel_idle}} は BIOS の C-State 設定を無視する場合があります。このドライバを使用中に問題が発生した場合、カーネルラインに {{ic|1=intel_idle.max_cstate=0}} を追加してください。
   
== ACPI イベントによる動作 ==
+
== ACPI イベントとの対話 ==
   
AC アダプタを接続したときやノートパソコンのフタを閉じたときなど様々な ACPI イベントによって governor を自動的に切り替えるように設定することができます。簡単なサンプルは下にありますが、[[acpid]] の記事は全部読む価値があります。
+
AC アダプタを接続したときやノートパソコンのフタを閉じたときなど様々な ACPI イベントによってガバナーを自動的に切り替えるように設定することができます。簡単なサンプルは下にありますが、[[acpid]] の記事は全部読む価値があります。
   
 
イベントは {{ic|/etc/acpi/handler.sh}} で定義します。{{Pkg|acpid}} パッケージがインストールされていれば、ファイルは既に存在し実行可能になっているはずです。例えば、AC アダプタが切断されたときにスケーリング governor を {{ic|performance}} から {{ic|conservative}} に変更して、またアダプタが接続されたときは戻したい場合:
 
イベントは {{ic|/etc/acpi/handler.sh}} で定義します。{{Pkg|acpid}} パッケージがインストールされていれば、ファイルは既に存在し実行可能になっているはずです。例えば、AC アダプタが切断されたときにスケーリング governor を {{ic|performance}} から {{ic|conservative}} に変更して、またアダプタが接続されたときは戻したい場合:
296行目: 379行目:
 
== トラブルシューティング ==
 
== トラブルシューティング ==
   
  +
=== BIOS の周波数制限 ===
* [[ntop]] などのアプリケーションは自動的な周波数スケーリングに上手く応じられません。ntop の場合、現在のプロセッサ速度では対処できないような大量のパケットが突然ネットワークインターフェイスに押し寄せてきたときに {{ic|on-demand}} governor が周波数を素早く変更できずにセグメンテーションフォルトが発生したり情報が失われることがあります。
 
 
* CPU によっては {{ic|on-demand}} governor のデフォルトの設定でパフォーマンスが出ないことがあります (例: flash 動画がスムーズに再生されなかったりウィンドウアニメーションがガタガタになる)。周波数スケーリングを完全に無効化することで問題を解決する代わりに、それぞれの CPU の ''up_threshold'' [[sysctl]] 変数を低くすることで周波数スケーリングを積極的にすることができます。[[#閾値を切り替える|on-demand governor の閾値を変更する方法]]を見て下さい。
 
 
* ときどき on-demand governor は最大周波数までスロットルを上げないで、その一段階下で抑えることがあります。max_freq の値を本当の最大値よりも少しだけ多目に設定することでこれを解決できます。例えば、CPU の周波数のレンジが 2.00 GHz から 3.00 GHz ならば、max_freq を 3.01 GHz に設定すると良いかもしれません。
 
 
* [[ALSA]] ドライバーとサウンドチップの組み合わせによっては周波数が変化する governor で音飛びが発生することがあります。周波数が変化しない governor に切り替えることで音飛びをなくすことができます。
 
 
=== BIOS 周波数の制限 ===
 
   
 
CPU/BIOS 設定によっては最大周波数までスケールすることができなかったり周波数を上げることが全くできなかったりすることがあります。これは大抵 BIOS イベントが OS に周波数を制限するよう通知しているのが原因であり、結果的に {{ic|/sys/devices/system/cpu/cpu0/cpufreq/bios_limit}} が低い値に設定されます。
 
CPU/BIOS 設定によっては最大周波数までスケールすることができなかったり周波数を上げることが全くできなかったりすることがあります。これは大抵 BIOS イベントが OS に周波数を制限するよう通知しているのが原因であり、結果的に {{ic|/sys/devices/system/cpu/cpu0/cpufreq/bios_limit}} が低い値に設定されます。
   
BIOS のセットアップユーティリティで設定 (Frequency, Thermal Management など) をしたのに変更できない場合、BIOS にバグが存在したり、BIOS 自体のバージョンが古いのかもしれません。または BIOS に何か理由があって CPU の周波数を制限しているということもあります。
+
BIOS のセットアップユーティリティで特定の設定 (FrequencyThermal Management など) をしたのに変更できない場合、BIOS にバグが存在したり、BIOS 自体のバージョンが古いのかもしれません。または BIOS に何か理由があって CPU の周波数を制限しているということもあります。
   
 
そのような理由として、バッテリーが取り除かれた (またはほとんど死んでいる) ことで AC 電源しか使えないようになっているのが原因だということがあります (使用しているマシンがノートパソコンの場合)。この場合、電力が弱い AC 電源だけではピーク性能を発揮するのに十分な電力が供給されておらず、バッテリーの補助がないとデータを喪失したり、破損したり、または最悪の場合ハードウェアに深刻なダメージを与える可能性があります。
 
そのような理由として、バッテリーが取り除かれた (またはほとんど死んでいる) ことで AC 電源しか使えないようになっているのが原因だということがあります (使用しているマシンがノートパソコンの場合)。この場合、電力が弱い AC 電源だけではピーク性能を発揮するのに十分な電力が供給されておらず、バッテリーの補助がないとデータを喪失したり、破損したり、または最悪の場合ハードウェアに深刻なダメージを与える可能性があります。
   
全ての BIOS が CPU 周波数を制限するわけではありませんが、例えば IBM/Lenovo のほとんどの Thinkpad は制限を加えます。詳しくは thinkwiki の[https://www.thinkwiki.org/wiki/Problem_with_CPU_frequency_scaling トピック] を参照して下さい。
+
全ての BIOS が CPU 周波数を制限するわけではありませんが、例えば IBM/Lenovo のほとんどの Thinkpad は制限を加えます。詳しくは thinkwiki の[https://www.thinkwiki.org/wiki/Problem_with_CPU_frequency_scaling トピック]を参照して下さい。
   
 
変な BIOS の設定がないことを確認して、何をするのかちゃんと理解できているのなら、BIOS の制限を無視するようにカーネルを設定することができます。
 
変な BIOS の設定がないことを確認して、何をするのかちゃんと理解できているのなら、BIOS の制限を無視するようにカーネルを設定することができます。
322行目: 397行目:
 
一時的に変更してみたいときは {{ic|/sys/module/processor/parameters/ignore_ppc}} の値を {{ic|0}} から {{ic|1}} に変更してください。
 
一時的に変更してみたいときは {{ic|/sys/module/processor/parameters/ignore_ppc}} の値を {{ic|0}} から {{ic|1}} に変更してください。
   
設定を永続的にするには[[カーネルモジュール#設定|カーネルモジュール]]参照するか {{ic|1=processor.ignore_ppc=1}} をカーネルブート行に追加するたは以下のファイルを作成してください。
+
設定を永続する方法ついて[[カーネルモジュール#モジュールオプション設定する]] でいくつ方法が説明されています。例えば、カーネルブートラインに {{ic|1=processor.ignore_ppc=1}} を追加することもできすし、以下のようなファイルを作成することもできます:
  +
{{hc|/etc/modprobe.d/ignore_ppc.conf|2=# If the frequency of your machine gets wrongly limited by BIOS, this should help
 
options processor ignore_ppc=1}}
+
{{hc|/etc/modprobe.d/ignore_ppc.conf|2=
  +
# マシンの周波数が BIOS によって間違って制限されている場合、これが役に立つはずです
  +
options processor ignore_ppc=1
  +
}}
   
 
== 参照 ==
 
== 参照 ==
334行目: 412行目:
 
* [https://docs.kernel.org/admin-guide/pm/amd-pstate.html amd-pstate カーネルドキュメント]
 
* [https://docs.kernel.org/admin-guide/pm/amd-pstate.html amd-pstate カーネルドキュメント]
 
* [https://linrunner.de/tlp/settings/processor.html intel_pstate/intel_cpufreq ドキュメント kernel 5.7+]
 
* [https://linrunner.de/tlp/settings/processor.html intel_pstate/intel_cpufreq ドキュメント kernel 5.7+]
  +
  +
{{TranslationStatus|CPU frequency scaling|2023-07-18|782443}}

2023年10月1日 (日) 23:28時点における最新版

関連記事

CPU パフォーマンススケーリングにより、オペレーティングシステムは消費電力の削減やパフォーマンスの向上のために CPU の周波数を上げ下げすることができるようになります。スケーリングは、システムの負荷に応じて自動的に行ったり、ACPI イベントに応じて調整したり、ユーザスペースのプログラムで手動で変更したりできます。

Linux カーネルは CPUFreq サブシステムを通して CPU パフォーマンススケーリングを提供します。このサブシステムには2つの抽象化レイヤが定義されています:

  • スケーリングガバナーは、望ましい CPU 周波数を計算するアルゴリズムを実装します。システムのニーズに基づいている可能性があります。
  • スケーリングドライバは、直接 CPU と対話し、現在のガバナーの要求する望ましい周波数に変更します。

デフォルトのスケーリングドライバとスケーリングガバナーは自動的に選択されますが、cpupoweracpidLaptop Mode Tools、デスクトップ環境によって提供されている GUI ツールなどのユーザスペースのツールでも高度な設定をすることができます。

ユーザースペースツール

thermald

thermald は、Intel CPU のオーバーヒートを防止するために使用される Linux デーモンです。このデーモンは P-state、T-state、および Intel power clamp ドライバを使用してサーマルパラメータを積極的に制御します。最新のドライバが利用できない場合、デーモンはシステムの冷却を制御するために x86 モデル固有のレジスタと Linux の "cpufreq サブシステム" に戻り、システムの冷却を制御します。

デフォルトでは、このデーモンは利用可能な CPU デジタル温度センサーを使って CPU 温度を監視し、ハードウェアが積極的な補正動作を行う前に CPU 温度を制御下に維持します。thermal sysfs に皮膚温度センサーがある場合、皮膚温度を 45C 以下に保とうと試みます (訳注: ここでの皮膚温度 (skin temperature) とは、ユーザがデバイスを持ったときに感じる温度のことです)。

Tiger Lake ラップトップ (例: Dell Latitude 3420) では、このデーモンは、他の方法で利用できるものよりも 多くのパフォーマンスを解放する と報告されています。

関連する systemd ユニットは thermald.service です。このサービスは 起動 され、かつ 有効化 されている必要があります。

i7z

i7z は Linux 向けの i7 (現在は、i3、i5、i7、i9) CPU レポートツールです。i7z コマンドでターミナルから実行することができ、GUI は i7z-gui で起動できます。

turbostat

turbostat は最近の Intel と AMD の CPU の周波数、消費電力、アイドル状態、その他の統計情報を表示することができます。

cpupower

cpupower は CPU 周波数スケーリングを補助するように作られたユーザースペースのユーティリティの集まりです。このパッケージがなくてもスケーリングを使うことはできますが、便利なコマンドラインユーティリティや起動時にガバナーを変えるための systemd のサービスが入っているためインストールすることが推奨されています。

cpupower の設定ファイルは /etc/default/cpupower です。この設定ファイルは /usr/lib/systemd/scripts/cpupower 内の bash スクリプトによって読み込まれます。bash スクリプトは cpupower.servicesystemd によって有効にされます。ブート時に起動するには cpupower.service有効化してください。

cpupower-gui

cpupower-guiAUR は CPU 周波数のスケーリングを支援するために設計されたグラフィカルなユーティリティです。GUI は GTK をベースにしており、cpupower と同じオプションを提供することを意図しています。 cpupower-gui は各コアの最大/最小の CPU 周波数とガバナーを変更することができます。このアプリケーションは polkit を通して特権付与を行い、wheel ユーザグループのログイン済みユーザであれば誰でも周波数とガバナーを変更することができます。

gnome-shell-extension-cpupower

gnome-shell-extension-cpupower-gitAUR は、CPU 周波数の最大値と最小値を変更し、周波数ブーストを有効化/無効化することのできる GNOME シェル拡張です。

auto-cpufreq

auto-cpufreqAUR は、Linux 用の CPU 速度と電源の自動オプティマイザです。ノート PC のバッテリー状態、CPU 使用率、CPU 温度、そしてシステムの負荷をアクティブに監視します。

power-profiles-daemon

power-profiles-daemonpowerprofilesctl コマンドラインツールは power-profiles-daemon サービスを通して電源プロファイル (省電力、バランス、パフォーマンスなど) を扱います。GNOME と KDE もプロファイル切り替えのための グラフィカルインターフェイス を提供しています。以下を参照してください:

使い方や使用例、類似プロジェクトとの比較などについては、プロジェクトの README を参照してください。

power-profiles-daemon サービスを 起動/有効化 してください。powerprofilesctl が起動されると、サービスも起動しようとすることに注意してください (dbus.serviceユニットステータス を見てください。)

ノート: power-profiles-daemon は、TLPtunedAURsystem76-powerAUR といった他の電源管理サービスと衝突します。(潜在的に依存関係にあるため) power-profiles-daemonアンインストール せずに前述のサービスのどれかを代わりに使用するには、power-profiles-daemon サービスを マスク して無効化してください ([1][2] も参照。)

スケーリングドライバ

スケーリングドライバは、ガバナーによって指定された周波数を設定する CPU 固有の詳細を実装します。厳密に言えば、ACPI 標準は、P0 で始まって徐々に低パフォーマンスになる power-performance states (P-states) を要求しています。この機能は、Intel では SpeedStep と、AMD では PowerNow! と呼ばれています。

とはいえ実際には、プロセッサは固定の P-state に制限するどころか、特定の周波数を指定する方法を提供しています。スケーリングドライバは周波数の指定を処理します。

ノート:
  • ネイティブな CPU モジュールは自動的にロードされます。
  • 最近の Intel CPU においては、下記の他のドライバの代わりに intel_pstate CPU パワースケーリングドライバが自動的に使用されます。このドライバは他のドライバよりも優先され、モジュールではなく、組み込まれています。現在、このドライバは Sandy Bridge 及びそれ以降の CPU において自動的に使用されます。intel_pstate は BIOS の P-State 設定を無視する場合があります。古い CPU においては intel_pstateintel_cpufreq ドライバによって "passive mode" で動作する場合があります。このドライバを使用していて問題が発生する場合は、acpi_cpufreq ドライバを使用するようにするために intel_pstate=disable をカーネルラインに追加してください。
  • amd_pstate CPU パワースケーリングドライバはデフォルトで非アクティブです。しかし、サポートされている CPU (Zen 2 及びそれ以降) を使用している場合は、amd_pstate=passiveamd_pstate=active、そして amd_pstate=guided のうちどれかをカーネルパラメータに追加することでこのドライバを手動で有効化することができます。一部のマザーボードは、必要な設定をファームウェア内で有効化しない場合があり、その結果 the _CPC object is not present in SBIOS or ACPI disabled エラーが発生します。UEFI で Enable CPPC やこれと似たような設定を Auto から Enabled に変更してください。この設定が UEFI に存在しない場合は、ベンダーのウェブサイトでアップデートがないか調べてください。

cpupower は、ネイティブな CPU の制限を調べるためにドライバを必要とします:

ドライバ 説明
intel_pstate このドライバは、Intel Core (Sandy Bridge 及びそれ以降) プロセッサの内部ガバナーでスケーリングドライバを実装しています。
amd_pstate_epp この "active" ドライバは、AMD Ryzen (一部の Zen 2 及びそれ以降) プロセッサの内部ガバナーでスケーリングドライバを実装しています。
acpi_cpufreq ACPI Processor Performance States を使用する CPUFreq ドライバ。このドライバは Intel Enhanced SpeedStep もサポートします (以前は、非推奨の speedstep-centrino モジュールによってサポートされていました)。AMD Ryzen においては、このドライバは 3 つの周波数状態のみを提供します。
intel_cpufreq カーネル 5.7 から、intel_pstate スケーリングドライバは、hardware-managed P-states (HWP) をサポートしない CPU (つまり、Intel Core i の第5世代及びそれ以前) においては "passive mode" (別名 intel_cpufreq) を選択します。このドライバは、Intel CPU で ACPI ドライバと似たように動作します。ただし、ACPI の 16-pstate の制限は存在しません。
amd_pstate このドライバは AMD Ryzen において acpi_cpufreq よりも遥かに多くの P-state を公開します。ただし、governing は引き継ぎません。
cppc_cpufreq ACPI CPPC システム (以下を参照) をベースとした CPUFreq ドライバ。AArch64 システムにおいては共通のデフォルトです。最近の x86 においても動作しますが、上記 2 つのベンダー固有の選択肢の方が優れています。
speedstep_lib Intel SpeedStep 対応プロセッサ (主に Atom と古い Pentium) 用の CPUFreq ドライバ。
powernow_k8 K8/K10 Athlon 64/Opteron/Phenom プロセッサ用の CPUFreq ドライバ。Linux 3.7 から、より最近の AMD CPU においては 'acpi_cpufreq' が自動的に使用されます。
pcc_cpufreq このドライバは、Hewlett-Packard と Microsoft Corporation による Processor Clocking Control インターフェイスをサポートします。一部の ProLiant サーバにおいて便利です。
p4_clockmod Intel Pentium 4/Xeon/Celeron プロセッサ用の CPUFreq ドライバ。クロックをスキップすることで CPU 温度を下げます。(代わりに speedstep_lib を使用したほうが良いかもしれません。)

利用可能なモジュールの完全なリストを表示するには、次を実行してください:

$ ls /usr/lib/modules/$(uname -r)/kernel/drivers/cpufreq/

適切なモジュールをロードしてください (詳しくはカーネルモジュールを見て下さい)。適切な cpufreq ドライバーがロードされていれば、次のコマンドで CPU の詳細が表示されます:

$ cpupower frequency-info

最大・最小周波数を設定する

一部のケースで、最大・最小周波数を手動で設定する必要があることがあります。

最大クロック周波数を設定するには (clock_freq は単位付きのクロック周波数です: GHz、MHz):

# cpupower frequency-set -u clock_freq

最小クロック周波数を設定するには:

# cpupower frequency-set -d clock_freq

特定の周波数で動作するように CPU を設定するには:

# cpupower frequency-set -f clock_freq
ノート:
  • 単一の CPU コアだけを調整するには、-c core_number をコマンドに加えてください。
  • ガバナーの最大周波数と最小周波数は /etc/default/cpupower で設定できます。

あるいは、手動で周波数を設定することもできます:

# echo value | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_max_freq

利用可能な値は /sys/devices/system/cpu/cpu*/cpufreq/scaling_available_frequencies などで調べられます。[3]

周波数ブーストを設定する

一部のプロセッサでは、適切な温度条件下で短時間、周波数を通常の最大値以上に上げることができます。これは、Intel プロセッサでは Turbo Boost と、AMD プロセッサでは Turbo-Core と呼ばれています。

sysfs から設定する (intel_pstate)

intel_pstate には、プロセッサがターボ P-State に入ることを禁止するための、ドライバ固有のインターフェイスが存在します:

# echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo

sysfs から設定する (古いスケーリングドライバ)

intel_pstate より古いスケーリングドライバにおいては、ドライバがブーストをサポートしている場合、/sys/devices/system/cpu/cpufreq/boost 属性が存在し、これを使ってブーストを無効化/有効化することができます:

# echo 0 > /sys/devices/system/cpu/cpufreq/boost

x86_energy_perf_policy から設定する

Intel プロセッサにおいては、x86_energy_perf_policy を使ってターボブーストを設定することもできます:

# x86_energy_perf_policy --turbo-enable 0

amd_pstate

amd_pstate には 3 つのオペレーションモードが存在します: CPPC autonomous (active) モード、CPPC non-autonomous (passive) モード、CPPC guided autonomous (guided) モード。active/passive/guided モードは、それぞれカーネルパラメータ amd_pstate=activeamd_pstate=passiveamd_pstate=guided で選択できます。

Active モード
active モードは amd_pstate_epp (Energy Performance Preference) ドライバによって実装されており、カーネル 6.3 及びそれ以降で利用可能です。このモードでは、ソフトウェアが CPPC ファームウェアにパフォーマンス (0x0) または電力効率 (0xff) にバイアスをかけることを要求した場合、amd_pstate_epp ドライバはハードウェアにヒントを提供します。
Passive モード
passive モードは amd_pstate ドライバによって実装されています。このモードでは、ドライバは現在の負荷に基づいて望ましいパフォーマンス (特に、ユーザエクスペリエンスに影響を与えずにどれだけパフォーマンスの低下を許容できるか) を定義します。
Guided モード
guided モードは amd_pstate ドライバによって実装されており、カーネル 6.4 及びそれ以降で利用可能です。このモードでは、amd_pstate ドライバはパフォーマンスレベルの最大と最小をリクエストし、プラットフォームは、現在の負荷において適切なパフォーマンスレベルをその範囲内で自動的に選択します。

スケーリングガバナー

スケーリングガバナーとは、望ましい CPU 周波数を決定するパワースキームです。固定の周波数をリクエストするガバナーもありますし、システムの負荷に応じて動的に調節するアルゴリズムを実装しているものもあります。カーネルに含まれているガバナーは以下のとおりです:

ノート: 各ガバナーは任意のスケーリングドライバと互換性があります。ただし、active モードでの intel_pstateamd_pstate は例外です。これらは、powersaveperformance という形で疑似ガバナーを提供します。下の #自律的な周波数スケーリング を参照してください。
ガバナー 説明
performance 最大周波数で CPU を動作させます。最大周波数は /sys/devices/system/cpu/cpuX/cpufreq/scaling_max_freq で得ることができます。
powersave 最小周波数で CPU を動作させます。最小周波数は /sys/devices/system/cpu/cpuX/cpufreq/scaling_min_freq で得ることができます。
userspace ユーザーが指定した周波数で CPU を動作させます。/sys/devices/system/cpu/cpuX/cpufreq/scaling_setspeed で設定可能です。
ondemand 現在の負荷にあわせて周波数を動的に切り替えます。最大周波数に一気に切り替えたあと、アイドル時間が増えるにつれて周波数がもとに戻る可能性があります。
conservative 現在の負荷にあわせて周波数を動的に切り替えます。ondemand よりも段階的に周波数を切り替えます。
schedutil スケジューラによって CPU の周波数が選択されます [4][5]

スケーリングドライバによっては、以下のガバナーのうちどれかがデフォルトでロードされます:

  • Linux 4.9.5 以降 では schedutil
  • Intel CPU で intel_pstate ドライバを使用する場合、内部の powersave ガバナー (上記のノートを参照、schedutil と等価です)。
警告: デフォルトのガバナーを変更する場合は、CPU 監視ツールを使用してください (温度や電圧など)。

特定のガバナーをアクティブ化するには、以下のコマンドを実行してください:

# cpupower frequency-set -g governor
ノート:
  • 単一の CPU コアだけを調整するには、上のコマンドに -c core_number を加えて下さい。
  • ガバナーを有効にするには、特定のカーネルモジュール (cpufreq_governor) がロードされている必要があります。カーネル 3.4 現在、これらのモジュールは自動的にロードされます。

もしくは、CPU ごとにガバナーを手動で有効にすることもできます:

# echo governor | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
ヒント: CPU の速度をリアルタイムで表示するには、次を実行してください:
$ watch cat /sys/devices/system/cpu/cpu[0-9]*/cpufreq/scaling_cur_freq

ondemand ガバナーを調整する

詳細はカーネルドキュメントを見てください。

閾値を切り替える

周波数を上げるときの閾値を設定するには:

# echo -n percent > /sys/devices/system/cpu/cpufreq/governor/up_threshold

周波数を下げるときの閾値を設定するには:

# echo -n percent > /sys/devices/system/cpu/cpufreq/governor/down_threshold

サンプリングレート

サンプリングレートは、CPU の周波数を変化させるのにガバナーが確認する頻度を決めます。1 より大きく sampling_down_factor を設定すると負担評価のオーバーヘッドが減って、負担が高い時に CPU がずっと最高周波数で動作しパフォーマンスが向上します。sampling_down_factor に設定できる値は 1 から 100000 です。CPU 周波数や負担が低いときの挙動には影響がありません。

値を読み取るには (デフォルト = 1)、次を実行:

$ cat /sys/devices/system/cpu/cpufreq/ondemand/sampling_down_factor

値を設定するには、次を実行:

# echo -n value > /sys/devices/system/cpu/cpufreq/ondemand/sampling_down_factor

変更を永続化させる

Linux 5.9 から、cpufreq.default_governor カーネルオプションを設定することが可能になりました。[6] スケーリングパラメータをブート時に設定するには、cpupower ユーティリティを設定して、cpupower の systemd サービスを有効化してください。あるいは、systemd-tmpfilesudev ルールを使用することもできます。

自律的な周波数スケーリング

Intel と AMD は両方とも、(1) システムのパフォーマンスの範囲と、(2) プリファレンスを指定するパフォーマンス/電力のヒントに基づいて CPU に自身の速度を決定させる方法を定義しています。以下の場合に完全自律モードがアクティブ化されます:

  • amd-pstate が "active" に設定された場合。手動による設定と、CPU と BIOS の両方に CPPC サポートが必要です。
  • intel-pstate が "active" に設定され、かつ、ハードウェア P-state (HWP) が利用可能である (つまり、Sandy Bridge 以降) 場合。設定無しで動作します。

能動的な governing の最も重要な特徴は、2つのガバナー (powersaveperformance) のみが利用可能であるように見えることです。これらは通常のガバナーのようには動作しません。これらのレベルは、CPU の内部ガバナーの Energy Performance Preference ヒントに変換されます。結果として、これらは両方、動的スケーリングを提供します。schedutilondemand に似ていますが、主にレイテンシが異なります。performance アルゴリズムは、Intel HWP に古い ondemand ガバナーよりも優れた省電力機能を提供するはずです

Intel active、非 HWP

紛らわしいことに、intel-pstate ドライバには、CPU の能動的な決定を必要としない "active" モードがあります。カーネルコマンドラインによって "active" モードが強制されたが、HWP が利用できないか無効化されている場合に、このモードはオンになります。powersaveperformance しか提供しませんが、ドライバ自体は schedutilperformance に似た方法で governing を行います (つまり、最大の P-state のままになります)。能動的な intel-pstate に比べて、このモードに実際の利点はありません。

EPP を設定する

sysfs インターフェイスが利用可能である場合、中間的なヒントを選択することができます。インターフェイスは AMD と Intel で同じです。/sys/devices/system/cpu/cpu*/power/energy_performance_preference ファイルは現在のプリファレンスを記述し、/sys/devices/system/cpu/cpu*/power/energy_performance_available_preferences は利用可能なプリファレンスのリストを提供します。また、0 (パフォーマンス優先) から 255 (省電力優先) までの間の数値を渡すことができます。EPP がない Intel CPU にはフォールバック実装が提供されています。文字列 を EPB レベル (次のセクションで説明) に変換しますが、数値では失敗します。

x86_energy_perf_policy は、Intel CPU に対してのみ--hwp-epp スイッチによる EPP ヒントの設定をサポートしています。これは、Intel と AMD で異なるマシン固有のレジスタ (MSR) への直接アクセスにより機能します。このプログラムは、周波数乗数の範囲を使って HWP 周波数の範囲を制限することもできます。

Collaborative processor performance control

最近の CPU の電力消費量は、もはや単純に周波数や電圧設定に依存していません。必要に応じて切り替え可能なモジュールが存在しているからです。Collaborative Processor Performance Control (CPPC) は、ACPI 5.0 で提供されている P-state の置き換えです。静的な周波数レベルのテーブルを定義する代わりに、プロセッサは多くの抽象的なパフォーマンスレベルを提供し、オペレーティングシステムはこれらのレベルの中から選択します。これには2つの長所があります:

  • 16個の P-state エントリという制限がない。典型的な CPU では数百ものレベルの中から選ぶことができます。
  • CPU は、特定の部品 (例えば、ベクトル FPU) が使用されていない時に、より高い周波数を提供できます。

一方、柔軟な周波数は、schedutil による高速な周波数変更において重要な周波数不変の使用率追跡を破壊します。CPPC において周波数を静的にするために多くのベンダ固有の方法が取られてきましたが、ほとんどの成功例は arm64 におけるものです。

cppc_cpufreq は汎用の CPPC スケーリングドライバです。amd_pstate も、Zen 3 MSR が利用できない場合に、ACPI CPPC を使用して CPU の周波数を管理します。この方法 ("共有メモリ" とも呼ばれる) は、MSR よりも高レイテンシです。

Intel performance and energy bias hint

Intel performance and energy bias hint (EPB) は、ユーザスペースが電力とパフォーマンスのトレードオフを自由に指定できるようにするための Intel CPU によって提供されているインターフェイスです。0 (最高のパフォーマンス) から 15 (最高の省電力) のスケールで指定できます。FPB レジスタは、周波数スケーリングとは独立して機能する、パフォーマンス管理のもう一つのレイヤーです。P-state と C-state の選択がどの程度積極的に行われるかに関与し、エネルギー消費量に影響を与える内部のモデル固有の決定に影響を与えます。

以下は一般的な値とそれぞれのエイリアスです (sysfs と x86_energy_perf_policy によって認識されます):

EPB 値 文字列
0 performance
4 balance-performance
6 normal, default
8 balance-power
15 power

sysfs から設定する

EPB は sysfs 属性を用いて設定できます:

# echo epb | tee /sys/devices/system/cpu/cpu*/power/energy_perf_bias

x86_energy_perf_policy から設定する

x86_energy_perf_policy を使って:

# x86_energy_perf_policy --epb epb

cpupower から設定する

cpupower を使って:

# cpupower set -b epb_value
警告: cpupower は文字列エイリアスをサポートしていません。文字列が与えられた場合、何も言わずに EPB を 0 (最高パフォーマンス) に設定してしまいます。

他の x86 エネルギーフラグ

x86_energy_perf_policy でハードウェア P-State を有効化する:

# x86_energy_perf_policy -H 1
# x86_energy_perf_policy -U 1

"default" ポリシーを設定する:

変更は一時的です。詳細は x86_energy_perf_policy(8) を参照してください。

CPU idle ドライバ

intel_idle CPU idle ドライバは、最近の Intel CPU では acpi_idle ドライバの代わりに自動的に使用されます。このドライバは現在 Sandy Bridge およびそれ以降の CPU で自動的に使用されます。intel_idle は BIOS の C-State 設定を無視する場合があります。このドライバを使用中に問題が発生した場合、カーネルラインに intel_idle.max_cstate=0 を追加してください。

ACPI イベントとの対話

AC アダプタを接続したときやノートパソコンのフタを閉じたときなど様々な ACPI イベントによってガバナーを自動的に切り替えるように設定することができます。簡単なサンプルは下にありますが、acpid の記事は全部読む価値があります。

イベントは /etc/acpi/handler.sh で定義します。acpid パッケージがインストールされていれば、ファイルは既に存在し実行可能になっているはずです。例えば、AC アダプタが切断されたときにスケーリング governor を performance から conservative に変更して、またアダプタが接続されたときは戻したい場合:

/etc/acpi/handler.sh
[...]

ac_adapter)
    case "$2" in
        AC*)
            case "$4" in
                00000000)
                    echo "conservative" >/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor    
                    echo -n $minspeed >$setspeed
                    #/etc/laptop-mode/laptop-mode start
                ;;
                00000001)
                    echo "performance" >/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
                    echo -n $maxspeed >$setspeed
                    #/etc/laptop-mode/laptop-mode stop
                ;;
            esac
        ;;
        *) logger "ACPI action undefined: $2" ;;
    esac
;;

[...]

トラブルシューティング

BIOS の周波数制限

CPU/BIOS 設定によっては最大周波数までスケールすることができなかったり周波数を上げることが全くできなかったりすることがあります。これは大抵 BIOS イベントが OS に周波数を制限するよう通知しているのが原因であり、結果的に /sys/devices/system/cpu/cpu0/cpufreq/bios_limit が低い値に設定されます。

BIOS のセットアップユーティリティで特定の設定 (Frequency、Thermal Management など) をしたのに変更できない場合、BIOS にバグが存在したり、BIOS 自体のバージョンが古いのかもしれません。または BIOS に何か理由があって CPU の周波数を制限しているということもあります。

そのような理由として、バッテリーが取り除かれた (またはほとんど死んでいる) ことで AC 電源しか使えないようになっているのが原因だということがあります (使用しているマシンがノートパソコンの場合)。この場合、電力が弱い AC 電源だけではピーク性能を発揮するのに十分な電力が供給されておらず、バッテリーの補助がないとデータを喪失したり、破損したり、または最悪の場合ハードウェアに深刻なダメージを与える可能性があります。

全ての BIOS が CPU 周波数を制限するわけではありませんが、例えば IBM/Lenovo のほとんどの Thinkpad は制限を加えます。詳しくは thinkwiki のトピックを参照して下さい。

変な BIOS の設定がないことを確認して、何をするのかちゃんと理解できているのなら、BIOS の制限を無視するようにカーネルを設定することができます。

警告: このセクションをよく読んで理解してください。CPU 周波数の制限は BIOS のセーフティ機能であり、それを回避する必要は絶対ではありません。

特殊なパラメータをプロセッサのモジュールに渡す必要があります。

一時的に変更してみたいときは /sys/module/processor/parameters/ignore_ppc の値を 0 から 1 に変更してください。

設定を永続化する方法については、カーネルモジュール#モジュールオプションを設定する でいくつか方法が説明されています。例えば、カーネルブートラインに processor.ignore_ppc=1 を追加することもできますし、以下のようなファイルを作成することもできます:

/etc/modprobe.d/ignore_ppc.conf
# マシンの周波数が BIOS によって間違って制限されている場合、これが役に立つはずです
options processor ignore_ppc=1

参照

翻訳ステータス: このページは en:CPU frequency scaling の翻訳バージョンです。最後の翻訳日は 2023-07-18 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。