# CPU Frequency Scaling (日本語)

関連記事

- Power saving
- Laptop Mode Tools
- pm-utils
- PHC

CPU 周波数スケーリングを使うことで電力を節約するためにオペレーティングシステムが CPU の周波数を調整することが出来るようになります。CPU の周波数はユーザースペースのプログラムを使って手動で変更したり、システムの負担や、ACPI イベントにあわせて自動的に調整することが可能です。

CPU 周波数スケーリングは Linux カーネル内に実装されており、そのインフラストラクチャは cpufreq と呼ばれています。カーネル 3.4 から必要なモジュールが自動でロードされるようになり推奨の ondemand governor がデフォルトで有効になっています。しかしながら、cpupower, acpid, Laptop Mode Tools などのユーザースペースツールや、デスクトップ環境から提供されている GUI ツールを使って高度な設定をすることも可能です。

## ユーザースペースツール

### cpupower

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

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

### GNOME Shell 拡張

GNOME Shell のフロントエンドがいくつか AUR で利用できます:

- gnome-shell-cpufreq-git (最新更新 gnome 3.6)

### Granola

Granola (AUR から利用できます) は cpu の使用量を監視して userspace governor を使ってパフォーマンスに影響を与えずに電力使用量を減らすデーモンです。ほとんどの環境ではデフォルトの設定で動作します。

動作するかテストするには、次を実行してください:

    $ cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq

そして CPU の周波数が最大値を下回っているか確認してください。

## CPU 周波数ドライバー

Note:

- カーネル 3.4 から、ネイティブ CPU モジュールは自動的にロードされます。
- カーネル 3.9 から、新しい Intel の CPU には下に書かれているドライバーの代わりに新しい `pstate` パワースケーリングドライバーが自動的に使われます。このドライバーは他のドライバーよりも優先され、モジュールではなく初めから備えられています。現在 Sandy Bridge や Ivy Bridge などの CPU でこのドライバーが自動的に使用されます。このドライバーを使っていて問題が生じた際は、kernel 行に `intel_pstate=disable` を追加してください。同じユーザースペースユーティリティを使うこともできますがコントロールはできません。
- 上記の P State の挙動は `/sys/devices/system/cpu/intel_pstate` で変えることができます。例えば、CPU の温度を低く保つために `# echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo` で Intel Turbo Boost を無効にすることが可能です。
- 新しい Intel の CPU は Linux Thermal Daemon (AUR の thermald から使えます) でコントロールでき P-states, T-states, Intel power clamp ドライバーを使って熱を積極的にコントロールします。

cpupower はネイティブ CPU の制限を知るためにモジュールを必要とします:

モジュール | 説明
--- | ---
acpi-cpufreq | ACPI Processor Performance States を利用する CPUFreq ドライバー。このドライバーは Intel Enhanced SpeedStep もサポートしています (以前は speedstep-centrino モジュールによってサポートされていました)。
speedstep-lib | Intel speedstep が有効になっているプロセッサ (ほとんどの atom と古い pentium (< 3)) の CPUFreq ドライバー。
powernow-k8 | K8/K10 Athlon64/Opteron/Phenom プロセッサの CPUFreq ドライバー。linux 3.7 からは廃止されているので、acpi_cpufreq を使って下さい。
pcc-cpufreq | このドライバーは Proliant サーバーで使われている Hewlett-Packard と Microsoft Corporation による Processor Clocking Control インターフェイスをサポートしています。
p4-clockmod | Intel Pentium 4 / Xeon / Celeron プロセッサの CPUFreq ドライバー。有効にするとクロックをスキップして CPU の温度を下げます。 基本的には Speedstep ドライバーを使って下さい。

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

    $ ls /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

Note:

- 単一の CPU コアだけを調整するには、`-c core_number` を加えて下さい。
- governor, 最大・最小周波数は `/etc/default/cpupower` で設定できます。

## スケーリング governor

Governors (see table below) are power schemes for the cpu. Only one may be active at a time. For details, see the kernel documentation in the kernel source.

Governor | 説明
--- | ---
ondemand | cpu の負担が 95% の時に CPU を動的に切り替えます
performance | 最大周波数で cpu を動作させます
conservative | 負担が 75% の時に CPU を動的に切り替えます
powersave | 最小周波数で cpu を動作させます
userspace | ユーザーが指定した周波数で cpu を動作させます

スケーリングドライバーによって、以上の governor の一つがデフォルトでロードされます:

- AMD と古い Intel の CPU では `ondemand`。
- Intel Sandybridge 以降の CPU では `powersave`。

特定の governor を有効にするには、次を実行してください:

    # cpupower frequency-set -g governor

Note:

- 単一の CPU コアだけを調整するには、上のコマンドに `-c core_number` を加えて下さい。
- governor を有効にするには特定のカーネルモジュール (`cpufreq_governor`) がロードされることを必要とします。カーネル 3.4 から、これらのモジュールは自動的にロードされます。

Alternatively, you can activate a governor on every available CPU manually:

    # echo governor | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor >/dev/null

Tip: cpu の速度をリアルタイムで表示するには、次を実行してください:

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

### ondemand governor を調整する

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

#### threshold を切り替える

To set the threshold for stepping up to another frequency:

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

To set the threshold for stepping down to another frequency:

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

#### サンプリングレート

The sampling rate determines how frequently the governor checks to tune the CPU. Setting `sampling_down_factor` greater than 1 improves performance by reducing the overhead of load evaluation and keeping the CPU at its highest clock frequency due to high load. This tunable has no effect on behavior at lower CPU frequencies/loads.

To read the value (default = 1), run:

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

To set the value, run:

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

## ACPI イベントとの対話

Users may configure scaling governors to switch automatically based on different ACPI events such as connecting the AC adapter or closing a laptop lid. A quick example is given below, however it may be worth reading full article on acpid.

Events are defined in `/etc/acpi/handler.sh`. If the acpid package is installed, the file should already exist and be executable. For example, to change the scaling governor from `performance` to `conservative` when the AC adapter is disconnected and change it back if reconnected:

    /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
    ;;

    [...]

## GNOME での特権取得

Note: systemd introduced logind which handles consolekit and policykit actions. The following code below does not work. With logind, simply edit in the file `/usr/share/polkit-1/actions/org.gnome.cpufreqselector.policy` the <defaults> elements according to your needs and the polkit manual [1].

GNOME has a nice applet to change the governor on the fly. To use it without the need to enter the root password, simply create following file:

    /var/lib/polkit-1/localauthority/50-local.d/org.gnome.cpufreqselector.pkla

    [org.gnome.cpufreqselector]
    Identity=unix-user:user
    Action=org.gnome.cpufreqselector
    ResultAny=no
    ResultInactive=no
    ResultActive=yes

Where the word user is replaced with the username of interest.

The desktop-privileges package in the AUR contains a similar `.pkla` file for authorizing all users of the `power` group to change the governor.

## トラブルシューティング

- Some applications, like ntop, do not respond well to automatic frequency scaling. In the case of ntop it can result in segmentation faults and lots of lost information as even the `on-demand` governor cannot change the frequency quickly enough when a lot of packets suddenly arrive at the monitored network interface that cannot be handled by the current processor speed.

- Some CPU's may suffer from poor performance with the default settings of the `on-demand` governor (e.g. flash videos not playing smoothly or stuttering window animations). Instead of completely disabling frequency scaling to resolve these issues, the aggressiveness of frequency scaling can be increased by lowering the up_threshold sysctl variable for each CPU. See how to change the on-demand governor's threshold.

- Sometimes the on-demand governor may not throttle to the maximum frequency but one step below. This can be solved by setting max_freq value slightly higher than the real maximum. For example, if frequency range of the CPU is from 2.00 GHz to 3.00 GHz, setting max_freq to 3.01 GHz can be a good idea.

- Some combinations of ALSA drivers and sound chips may cause audio skipping as the governor changes between frequencies, switching back to a non-changing governor seems to stop the audio skipping.

### BIOS 周波数の制限

Some CPU/BIOS configurations may have difficulties to scale to the maximum frequency or scale to higher frequencies at all. This is most likely caused by BIOS events telling the OS to limit the frequency resulting in `/sys/devices/system/cpu/cpu0/cpufreq/bios_limit` set to a lower value.

Either you just made a specific Setting in the BIOS Setup Utility, (Frequency, Thermal Management, etc.) you can blame a buggy/outdated BIOS or the BIOS might have a serious reason for throttling the CPU on it's own.

Reasons like that can be (assuming your machine's a notebook) that the battery is removed (or near death) so you're on AC-power only. In this case a weak AC-source might not supply enough electricity to fulfill extreme peak demands by the overall system and as there is no battery to assist this could lead to data loss, data corruption or in worst case even hardware damage!

Not all BIOS'es limit the CPU-Frequency in this case, but for example most IBM/Lenovo Thinkpads do. Refer to thinkwiki for more thinkpad related info on this topic.

If you checked there's not just an odd BIOS setting and you know what you're doing you can make the Kernel ignore these BIOS-limitations.

Warning: Make sure you read and understood the section above. CPU frequency limitation is a safety feature of your BIOS and you should not need to work around it.

A special parameter has to be passed to the processor module.

For trying this temporarily change the value in `/sys/module/processor/parameters/ignore_ppc` from `0` to `1`.

For setting it permanent refer to Kernel modules or just read on. Add `processor.ignore_ppc=1` to your kernel boot line or create

    /etc/modprobe.d/ignore_ppc.conf

    # If the frequency of your machine gets wrongly limited by BIOS, this should help
    options processor ignore_ppc=1

## 参照

- Linux CPUFreq - カーネルドキュメント
- Comprehensive explanation of pstate

Categories:

- Power management (日本語)
- CPU (日本語)