Power saving (日本語)
Related articles
この記事では省電力機能を使用するのに必要な設定を扱います。コンピュータが AC 電源またはバッテリーで動作しているかに関わらず、ここに記載されているほとんど全ての機能には使用する価値があります。パフォーマンスへの影響は軽微ですが、大抵壊れているハードウェアやドライバーのためにデフォルトでは有効になっていません。電力の使用量を減らすことは熱を減らすことでもあり、動的なオーバークロックによって、最近の Intel や AMD の CPU ではパフォーマンスの向上につながることもあります。
Contents
設定
udev ルールなどを使ってスクリプトや省電力設定を自分で作成したい場合は以下の設定を参考にすることができます。
オーディオ
デフォルトでは、オーディオの省電力機能はほとんどのドライバーで無効になっています。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
バックライト
バックライトを見て下さい。
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]:
- BIOS が何らかの理由で ASPM を無効化した (コンフリクトが起こるから?)。
- PCIE が L0s 以外の ASPM を必要とする (L0s は無効化され L1 だけが有効化される)。
- ASPM について BIOS がプログラムされていない。
- BIOS にバグが存在する。
コンピュータが ASPM をサポートしていると信じられる場合は、pcie_aspm=force カーネルパラメータを使うことで強制的にオンにすることができます。
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
/etc/udev/rules.d/hd_power_save.rules
ACTION=="add", SUBSYSTEM=="scsi_host", KERNEL=="host*", ATTR{link_power_management_policy}="min_power"
ハードディスクドライブ
設定できるドライブのパラメータについては hdparm を見て下さい。
多数のプログラムがディスクに頻繁に書き込みをおこなう場合は省電力は効率的ではありません。全てのプログラムを調査して、いつどのようにプログラムがディスクに書き込むを行うのか調べるのがディスクの使用量を減らす道です。iotop を使えばどのプログラムがディスクに頻繁に書き込みしているかわかります。他のヒントは Solid State Drives (日本語)#SSD の読み書きを最小化するヒント を見て下さい、ほとんどのヒントは SSD に限ったものではありません。
noatime オプションを設定するなどの小さなことも馬鹿にできません。十分な RAM がある場合、swappiness を無効化したり制限することでディスクへの書き込みが減る可能性があります。
CD/DVD のスピンダウン
udisks を使用してしばらくしてから CD/DVD ロムをスピンダウンさせるには:
# udisks --inhibit-polling /dev/sr0
ツールとスクリプト
パッケージ
以下のツールを使うことで手動で多数の設定を行うかわりになります。どのツールも多かれ少なかれ同じような動作をするので、衝突をさけるためにツールはどれか一つだけを実行してください。電源管理カテゴリを見ることで Archlinux にどんな電源管理の選択肢が存在するかわかります。
以下は省電力設定をするために作られた人気のあるスクリプトやツールです:
- acpid — ACPI の電源管理イベントを届けるデーモン。netlink をサポート。
- ftw — 節電のための udev ルールを設定するスクリプト。
- Laptop Mode Tools — ノートパソコンの省電力設定をするユーティリティ。多少設定が要りますが省電力設定ユーティリティのデファクトスタンダードとされています。
- pm-utils — サスペンドと電源状態設定のフレームワーク (今のところ大部分が開発途上)。
- Powerdown — 様々な設定によってコンピュータの消費電力を減らすスクリプト。
- powertop — 消費電力や電源管理の問題を診断して省電力設定を補助するツール。
- TLP — Linux 向けの先進的な電源管理。
スクリプトと 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"
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
忘れずに実行可能属性を付与してください。
これで 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