Power saving (日本語) - ArchWiki

# Power saving (日本語)

Related articles

- 電源管理
- CPU 周波数スケーリング
- ハイブリッドグラフィック
- カーネルモジュール
- sysctl
- udev

この記事では省電力機能を使用するのに必要な設定を扱います。コンピュータが AC 電源またはバッテリーで動作しているかに関わらず、ここに記載されているほとんど全ての機能には使用する価値があります。パフォーマンスへの影響は軽微ですが、大抵壊れているハードウェアやドライバーのためにデフォルトでは有効になっていません。電力の使用量を減らすことは熱を減らすことでもあり、動的なオーバークロックによって、最近の Intel や AMD の CPU ではパフォーマンスの向上につながることもあります。

## 設定

udev ルールなどを使ってスクリプトや省電力設定を自分で作成したい場合は以下の設定を参考にすることができます。

Note: 以下で記述しているルールのほとんどは TLP などのツールで管理することもでき、ツールを使いながら自分でも管理するのは不得策です。

### オーディオ

デフォルトでは、オーディオの省電力機能はほとんどのドライバーで無効になっています。`power_save` パラメータを設定することで有効にすることができます。アイドルモードに移行するまでの時間を秒数で指定します。1秒後にサウンドカードをアイドル状態にするには、Intel の場合、以下を作成:

    /etc/modprobe.d/audio_powersave.conf

    options snd_hda_intel power_save=1

ac97 の場合は以下を使って下さい:

    options snd_ac97_codec power_save=1

Note: サウンドカードの電源状態を変更すると壊れたハードウェアでポップノイズがまじったり著しい遅延が発生することがあります。

### バックライト

バックライトを見て下さい。

### Bluetooth

Bluetooth を完全に無効化するには、`btusb` と `bluetooth` モジュールをブラックリストに入れてください。

一時的にだけ bluetooth をオフにするには、rfkill を使用します:

    # rfkill block bluetooth

もしくは udev ルールを使って:

    /etc/udev/rules.d/50-bluetooth.rules

    # disable bluetooth
    SUBSYSTEM=="rfkill", ATTR{type}=="bluetooth", ATTR{state}="0"

または rfkill パッケージに入っている `rfkill-block@bluetooth.service` を有効化してください。

### ウェブカメラ

内蔵のウェブカメラを使わない場合、`uvcvideo` モジュールをブラックリストに入れてください。

### カーネルパラメータ

このセクションでは `/etc/sysctl.d/` の設定を使います。このディレクトリはカーネルの sysctl パラメータと対応するディレクトリです。詳しくは The New Configuration Files や、より正確な systemd の sysctl.d man ページ を見て下さい。

#### NMI watchdog の無効化

NMI watchdog はカーネルパニックを引き起こすハードウェアのハングアップをキャッチするデバッグ機能です。システムによっては大量の割り込みが発生するため、消費電力の増加につながっていることがあります:

    /etc/sysctl.d/disable_watchdog.conf

    kernel.nmi_watchdog = 0

もしくは起動の初期で完全に無効化するにはカーネル行に `nmi_watchdog=0` を追加してください。

#### ライトバック時間

仮想メモリのダーティなライトバック時間を増やすことでディスク I/O がまとめられて、断続的なディスクの書き込みが減って、消費電力が抑えられます。この値を60秒に設定するには (デフォルトは5秒です):

    /etc/sysctl.d/dirty.conf

    vm.dirty_writeback_centisecs = 6000

ジャーナルをサポートしているファイルシステム (ext4 や btrfs など) でジャーナルコミットでも同じことをするには、fstab でオプションとして `commit=60` を使用します。

I/O パフォーマンスや省電力に影響する他のパラメータは sysctl (日本語)#仮想メモリ を参照。

#### Laptop Mode

ラップトップモードの'ノブ'についてはカーネルドキュメントを見て下さい。"このノブの適切な値は5秒です。"

    /etc/sysctl.d/laptop.conf

    vm.laptop_mode = 5

### ネットワークインターフェイス

Wake-on-LAN は便利な機能ですが、利用しない場合はサスペンド中にマジックパケットが来るのを待つのに無駄な電力を消耗するだけです。全ての Ethernet インターフェイスで Wake-on-LAN を無効化:

    /etc/udev/rules.d/70-disable_wol.rules

    ACTION=="add", SUBSYSTEM=="net", KERNEL=="eth*", RUN+="/usr/bin/ethtool -s %k wol d"

全ての無線インターフェイスで省電力機能を有効にするには:

    /etc/udev/rules.d/70-wifi-powersave.rules

    ACTION=="add", SUBSYSTEM=="net", KERNEL=="wlan*", RUN+="/usr/bin/iw dev %k set power_save on"

上記の例では、`%k` がマッチするデバイスのカーネル名を示します。例えば、ルールが `wlan0` に適用可能とわかった場合、`%k` は `wlan0` に置き換えられます。特定のインターフェイスにだけルールを適用するには、パターン `eth*` と修飾子 `%k` を適当なインターフェイスの名前に置き換えて下さい。詳しくは、Writing udev rules を参照。

ここで、設定ファイルの名前は重要です。systemd v197 から `80-net-name-slot.rules` によって永続的なデバイス名が導入されたため、デバイスに `enp2s0` というような名前で呼ばれるように前に適用されるように、ネットワークの powersave ファイルは辞書順で `80-net-name-slot.rules` よりも前に来る名前を付けなくてはなりません。

### バスパワーの管理

#### Active State Power Management

コンピュータが ASPM をサポートしているという信頼が得られなかった場合、起動時に無効化されます:

    $ lspci -vv | grep ASPM.*abled\;

ASPM は BIOS によって扱われるため、ASPM が無効化される理由は以下の通りです [1]:

1. BIOS が何らかの理由で ASPM を無効化した (コンフリクトが起こるから？)。
2. PCIE が L0s 以外の ASPM を必要とする (L0s は無効化され L1 だけが有効化される)。
3. ASPM について BIOS がプログラムされていない。
4. BIOS にバグが存在する。

コンピュータが ASPM をサポートしていると信じられる場合は、`pcie_aspm=force` カーネルパラメータを使うことで強制的にオンにすることができます。

Warning:

- ASPM を強制するとフリーズやパニックが発生することがあります。ASPM が動作しなかったときにオプションを戻す手段があるか確認してください。
- ASPM をサポートしていないシステムで強制させると消費電力が逆に上昇することがあります。

`powersave` に調整するには次を実行 (以下のコマンドは ASPM が有効になっていないと機能しません):

    echo powersave | tee /sys/module/pcie_aspm/parameters/policy

デフォルトでは以下のようになります:

    $ cat /sys/module/pcie_aspm/parameters/policy

    [default] performance powersave

#### PCI Runtime Power Management

    /etc/udev/rules.d/pci_pm.rules

    ACTION=="add", SUBSYSTEM=="pci", ATTR{power/control}="auto"

#### デバイスの電源管理

USB を含む、(ほぼ) 全てのデバイスの電源管理を有効化:

    /etc/udev/rules.d/dev_power_save.rules

    # Various subsystems runtime power management (by bus or class)
    ACTION=="add", SUBSYSTEMS=="*", TEST=="power/control", ATTR{power/control}="auto"

    # Various subsystems power saving (by module)
    ACTION=="add", SUBSYSTEMS=="*", TEST=="parameters/power_save", ATTR{parameters/power_save}="1"

影響を受けるデバイスを表示するには:

    ls /sys/bus/*/devices/*/power/control
    ls /sys/class/*/*/power/control
    ls /sys/module/*/parameters/power_save

USB を除く全てのシステムで電源管理を有効にするには、最初のルールをサブシステムごとのルールに置き換えます (/sys/bus/some_subsystem, /sys/class/some_subsystem):

    ACTION=="add", SUBSYSTEM=="some_subsystem", TEST=="power/control", ATTR{power/control}="auto"

#### USB の自動サスペンド

Linux カーネルは USB デバイスが使用されていないときに USB デバイスを自動的にサスペンドさせることができます。これによって電力を相当カットできるときもありますが、USB の省電力機能に対応していない USB デバイスではおかしな挙動が起こる可能性もあります (特に USB マウスやキーボード)。ホワイトリストとブラックリストでフィルタリングする udev ルールを使うことで問題は軽減されます。

最も単純であまり役に立たない、全ての USB デバイスで自動サスペンドを有効にする例:

    /etc/udev/rules.d/50-usb_power_save.rules

    ACTION=="add", SUBSYSTEM=="usb", TEST=="power/control", ATTR{power/control}="auto"

自動サスペンドが動作するデバイスにだけ自動サスペンドを有効にするには、ベンダーとプロダクト ID でマッチングを行います (lsusb を使って値を取得):

    /etc/udev/rules.d/50-usb_power_save.rules

    # whitelist for usb autosuspend
    ACTION=="add", SUBSYSTEM=="usb", TEST=="power/control", ATTR{idVendor}=="05c6", ATTR{idProduct}=="9205", ATTR{power/control}="auto"

もしくは、USB 自動サスペンドが使えないデバイスをブラックリストに入れて、他の全てのデバイスで自動サスペンドを有効にするには:

    /etc/udev/rules.d/50-usb_power_save.rules

    # blacklist for usb autosuspend
    ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="05c6", ATTR{idProduct}=="9205", GOTO="power_usb_rules_end"

    ACTION=="add", SUBSYSTEM=="usb", TEST=="power/control", ATTR{power/control}="auto"
    LABEL="power_usb_rules_end"

自動サスペンドに入るデフォルトのアイドル遅延時間は `usbcore` カーネルモジュールの `autosuspend` パラメータによって制御されています。遅延時間をデフォルトの2秒から5秒に設定するには:

    /etc/modprobe.d/usb-autosuspend.conf

    options usbcore autosuspend=5

`power/control` と同じように、`power/autosuspend` 属性を設定することで遅延時間はデバイスごとに細かく設定することができます。

USB の電源管理に関する詳細は Linux カーネルドキュメントを見て下さい。

#### SATA Active Link Power Management

Note: This adds latency when accessing a drive that has been idle, so it is one of the few settings that may be worth toggling based on whether you are on AC power.

    /etc/udev/rules.d/hd_power_save.rules

    ACTION=="add", SUBSYSTEM=="scsi_host", KERNEL=="host*", ATTR{link_power_management_policy}="min_power"

Warning: デバイスによっては SATA Active Link Power Management でデータが消失する可能性があります (例: Lenovo T440s はこの問題を抱えていることが知られています 。

### ハードディスクドライブ

設定できるドライブのパラメータについては hdparm を見て下さい。

多数のプログラムがディスクに頻繁に書き込みをおこなう場合は省電力は効率的ではありません。全てのプログラムを調査して、いつどのようにプログラムがディスクに書き込むを行うのか調べるのがディスクの使用量を減らす道です。iotop を使えばどのプログラムがディスクに頻繁に書き込みしているかわかります。他のヒントは Solid State Drives (日本語)#SSD の読み書きを最小化するヒント を見て下さい、ほとんどのヒントは SSD に限ったものではありません。

noatime オプションを設定するなどの小さなことも馬鹿にできません。十分な RAM がある場合、swappiness を無効化したり制限することでディスクへの書き込みが減る可能性があります。

### CD/DVD のスピンダウン

udisks を使用してしばらくしてから CD/DVD ロムをスピンダウンさせるには:

    # udisks --inhibit-polling /dev/sr0

## ツールとスクリプト

### パッケージ

以下のツールを使うことで手動で多数の設定を行うかわりになります。どのツールも多かれ少なかれ同じような動作をするので、衝突をさけるためにツールはどれか一つだけを実行してください。電源管理カテゴリを見ることで Archlinux にどんな電源管理の選択肢が存在するかわかります。

以下は省電力設定をするために作られた人気のあるスクリプトやツールです:

- acpid — ACPI の電源管理イベントを届けるデーモン。netlink をサポート。

  http://sourceforge.net/projects/acpid2/ || acpid

- ftw — 節電のための udev ルールを設定するスクリプト。

  https://github.com/supplantr/ftw || ftw-git

- Laptop Mode Tools — ノートパソコンの省電力設定をするユーティリティ。多少設定が要りますが省電力設定ユーティリティのデファクトスタンダードとされています。

  https://github.com/rickysarraf/laptop-mode-tools || laptop-mode-tools

- pm-utils — サスペンドと電源状態設定のフレームワーク (今のところ大部分が開発途上)。

  http://pm-utils.freedesktop.org/ || pm-utils

- Powerdown — 様々な設定によってコンピュータの消費電力を減らすスクリプト。

  https://github.com/taylorchu/powerdown || powerdown-git

- powertop — 消費電力や電源管理の問題を診断して省電力設定を補助するツール。

  https://01.org/powertop/ || powertop

- TLP — Linux 向けの先進的な電源管理。

  http://linrunner.de/en/tlp/docs/tlp-linux-advanced-power-management.html || tlp

### スクリプトと udev ルールを使う

systemd ユーザーは `systemctl suspend` や `systemctl hibernate` でサスペンドとハイバネートを行うことができ、`/etc/systemd/logind.conf` で acpi イベントを処理することができるので、pm-utils と acpid を削除するということに興味を引かれるかもしれません。systemd が行えないことがたったひとつだけ存在します (systemd-204 現在): システムが AC 電源またはバッテリーで動作しているのかで別れる電源管理です。このギャップをなくすには、AC アダプタが抜き差しされたときにスクリプトを実行する udev ルールを作成します:

    /etc/udev/rules.d/powersave.rules

    SUBSYSTEM=="power_supply", ATTR{online}=="0", RUN+="/path/to/your/script true"
    SUBSYSTEM=="power_supply", ATTR{online}=="1", RUN+="/path/to/your/script false"

Note: pm-powersave が使用しているのと同じスクリプトを使うことができます。実行可能属性を付与して別の所に保存する必要があります (例えば `/usr/local/bin/`)。

powersave スクリプトのサンプル: powerdown, powersave。

上記の udev ルールはちゃんと動作するはずですが、電源設定がサスペンドやハイバネートをした後に更新されない場合、以下の内容で `/usr/lib/systemd/system-sleep/` にスクリプトを追加してください:

    /usr/lib/systemd/system-sleep/00powersave

    #!/bin/sh

    case $1 in
        pre) /path/to/your/script false ;;
        post)
    	if cat /sys/class/power_supply/AC0/online | grep 0 > /dev/null 2>&1
    	then
        		/path/to/your/script true
    	else
        		/path/to/your/script false
    	fi
        ;;
    esac
    exit 0

忘れずに実行可能属性を付与してください。

Note: あなたのノートパソコンでは AC0 が異なっている可能性があります。その場合は変更してください。

これで pm-utils はもう必要なくなりました。設定によっては、他のパッケージの依存パッケージになっている可能性はあります。それでも削除したい場合は、`pacman -Rdd pm-utils` を実行してください。

### 電源設定の表示

以下のスクリプトは USB や PCI デバイスの電源設定などのプロパティを表示します。全ての設定を見るには root 権限が必要なので注意して下さい。

    #!/bin/bash

    for i in $(find /sys/devices -name "bMaxPower")
    do
    	busdir=${i%/*}
    	busnum=$(<$busdir/busnum)
    	devnum=$(<$busdir/devnum)
    	title=$(lsusb -s $busnum:$devnum)

    	printf "\n\n+++ %s\n  -%s\n" "$title" "$busdir"

    	for ff in $(find $busdir/power -type f ! -empty 2>/dev/null)
    	do
    		v=$(cat $ff 2>/dev/null|tr -d "\n")
    		[[ ${#v} -gt 0 ]] && echo -e " ${ff##*/}=$v";
    		v=;
    	done | sort -g;
    done;

    printf "\n\n\n+++ %s\n" "Kernel Modules"
    for mod in $(lspci -k | sed -n '/in use:/s,^.*: ,,p' | sort -u)
    do
    	echo "+ $mod";
    	systool -v -m $mod 2> /dev/null | sed -n "/Parameters:/,/^$/p";
    done

## 参照

- ThinkWiki:How to reduce power consumption
- Manjro BBS topic
- Ubuntu Wiki's Power Saving Tweaks

Category:

- Power management (日本語)