power-profiles-daemonとtunedでFedora Workstationの電力管理を最適化する

Fedora tutorial - IT technology blog
Fedora tutorial - IT technology blog

午後3時にバッテリー切れ — 開発者ラップトップの現実問題

Fedoraをメインの開発マシンとして2年間使ってきて、パッケージの更新速度には満足しているが、チューニングに時間がかかったことが一つあった。それが電力管理だ。ThinkPad X1 Carbonは最初、継続してコードをコンパイルすると4〜5時間しか持たなかった。power-profiles-daemontunedの連携を理解した後、実際の作業環境で7〜8時間まで延ばすことができた。

Fedora 39以降、power-profiles-daemonはデフォルトで組み込まれている。これはGNOME/freedesktopのデーモンであり、Ubuntuでよく使われるTLPとは全く異なるものだ。一方、tunedはRed Hatが開発した低レベルのチューニングツールで、CPUガバナーからディスクスケジューラまで直接制御できる。この二つは互いを置き換えるものではなく、正しく設定すれば非常にうまく補完し合う。

なぜ一方だけでなく両方必要なのか

power-profiles-daemonは高レベルで動作する。3つのプロファイル(power-saverbalancedperformance)をD-Bus経由で公開し、GNOME Shellがそれを読み取ってシステムトレイに表示する。プロファイルを選択すると、このデーモンがamd-pstateintel_pstateなどのドライバを呼び出してEPP(Energy Performance Preference)を調整する。

tunedはより深いレベルで動作する。CPUガバナー、IRQアフィニティ、ディスクI/Oスケジューラ、ネットワークレイテンシ、さらにsysctl経由のカーネルパラメータまで制御できる。tunedbalancedプロファイルとpower-profiles-daemonbalancedプロファイルは、まったく別物だ。

筆者が遭遇した問題は、tunedのデフォルト設定がCPUガバナーを上書きし、power-profiles-daemonと直接競合することだった。ソースコードを読んで各オプションを試すのに3晩ほどかかったが、最終的に両者を平和的に共存させる方法を見つけた。

インストールと初期状態の確認

Fedora 39以降ではpower-profiles-daemonはすでにインストールされている。素早く確認する:

# デーモンが動作しているか確認
systemctl status power-profiles-daemon

# 現在のプロファイルを確認
powerprofilesctl

# 出力例:
# * balanced:
#     Driver:     amd-pstate-epp (またはintel_pstate)
#     Degraded:   no
#
#   power-saver:
#     ...
#   performance:
#     ...

まだインストールされていない場合はtunedをインストールする:

sudo dnf install tuned tuned-utils tuned-gtk -y
sudo systemctl enable --now tuned

# 現在アクティブなプロファイルを確認
tuned-adm active

# 利用可能な全プロファイルを表示
tuned-adm list

次の作業に進む前に、この二つが競合していないか確認する:

# 現在のCPUガバナーを確認
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

# 「powersave」が表示された場合 — power-profiles-daemonが制御中(正常)
# 「schedutil」や「ondemand」が表示された場合 — tunedが上書きしている可能性あり

競合を避けるための詳細設定

ステップ1:CPUガバナーを上書きしないtunedプロファイルを選択する

根本原因は、一部のtunedデフォルトプロファイルがCPUガバナーを設定し、power-profiles-daemonと直接競合することにある。対処法は、tunedのbalancedプロファイルをベースにしつつ、CPUガバナー部分を無効化するカスタムサブプロファイルを作成することだ:

sudo mkdir -p /etc/tuned/fedora-dev
sudo nano /etc/tuned/fedora-dev/tuned.conf

ファイルの内容:

[main]
summary=Fedora Developer Profile — CPUガバナーの上書きなし
include=balanced

[cpu]
# ガバナーは設定しない — power-profiles-daemonに管理を任せる
# governor=
energy_perf_bias=normal
min_perf_pct=10

[disk]
apm=128
spindown=0
alpm=min_power

[sysctl]
vm.swappiness=10
vm.dirty_ratio=15
vm.dirty_background_ratio=5
kernel.nmi_watchdog=0

[usb]
autosuspend=1


timeout=10

新しいプロファイルを有効化する:

sudo tuned-adm profile fedora-dev

# 警告がないか確認
tuned-adm verify

ステップ2:充電ケーブルの抜き差しで自動的に電源プロファイルを切り替えるudevルールを作成する

これが最も役立つと感じた部分だ。GNOME自体もAC/バッテリーの変化に応じてプロファイルを切り替えるが、他のデスクトップ環境を使っている場合や、より細かく制御したい場合に便利だ:

sudo nano /etc/udev/rules.d/81-power-profile.rules
# 充電ケーブルを抜いたときにpower-saverに切り替える
SUBSYSTEM=="power_supply", ATTR{online}=="0", RUN+="/usr/bin/powerprofilesctl set power-saver"

# 充電ケーブルを接続したときにbalancedに戻す
SUBSYSTEM=="power_supply", ATTR{online}=="1", RUN+="/usr/bin/powerprofilesctl set balanced"
sudo udevadm control --reload-rules

ステップ3:重いコンパイル時のためのperformanceプロファイルを設定する

DockerイメージのビルドやRustプロジェクトのコンパイルなど15〜20分かかる作業が必要なことがある。素早く切り替えるためのエイリアスを作成する:

# ~/.bashrcまたは~/.zshrcに追加
alias perf-on="powerprofilesctl set performance && echo 'パフォーマンスモード ON'"
alias perf-off="powerprofilesctl set balanced && echo 'バランスモードに復元'"
alias bat-mode="powerprofilesctl set power-saver && echo 'バッテリー節約モード ON'"

# またはビルドコマンドと組み合わせたスクリプトを使う
build-heavy() {
    powerprofilesctl set performance
    "$@"
    powerprofilesctl set balanced
}

実際にはこのように使っている:

# ビルド完了後に自動的にbalancedに切り替わる
build-heavy cargo build --release
build-heavy docker build -t myapp .

消費電力の確認とモニタリング

リアルタイムで消費電力を確認する

# まだインストールしていない場合はpowertopをインストール
sudo dnf install powertop -y

# 完全な情報を表示するためにroot権限で実行
sudo powertop

# 詳細確認用のHTMLレポートをエクスポート
sudo powertop --html=/tmp/power-report.html

powertopの出力で最も重要なカラムはPower est.だ。power-saverモードのアイドル時は8W以下、Chromeのタブをいくつか開いた状態のbalancedモードでは12W以下を目安にしている。

CPU周波数とEPPをモニタリングする

# 全コアの現在のCPU周波数を確認
watch -n1 'cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq | sort -n'

# EPP(Energy Performance Preference)を確認 — amd-pstate/intel_pstateのみ対応
cat /sys/devices/system/cpu/cpu0/cpufreq/energy_performance_preference

# power-saver → "power"
# balanced    → "balance_power"
# performance → "performance"

総合モニタリングスクリプト

#!/bin/bash
# ~/bin/power-status.sh

echo "=== 電源プロファイル ==="
powerprofilesctl | grep -A1 '\*'

echo ""
echo "=== tunedプロファイル ==="
tuned-adm active

echo ""
echo "=== CPUガバナー ==="
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

echo ""
echo "=== EPP ==="
cat /sys/devices/system/cpu/cpu0/cpufreq/energy_performance_preference 2>/dev/null || echo "非対応"

echo ""
echo "=== バッテリー状態 ==="
upower -i /org/freedesktop/UPower/devices/battery_BAT0 2>/dev/null | grep -E 'state|percentage|energy-rate'

echo ""
echo "=== 現在の消費電力 ==="
cat /sys/class/power_supply/BAT0/power_now 2>/dev/null | awk '{printf "%.2f W\n", $1/1000000}' || echo "/sys/class/power_supply/を確認してください"
chmod +x ~/bin/power-status.sh
power-status.sh

それでも消費電力が多い場合の調整

設定後もバッテリーの減りが早い場合は、powertop --auto-tuneを一度実行して、autosuspendが有効になっていないデバイスがないか確認する:

# 提案を確認するためだけに実行する。一部の設定が問題を引き起こす可能性があるため、永続的な適用は推奨しない
sudo powertop --auto-tune

# powertopのインタラクティブモードで「Tunables」タブを確認
# 「Bad」の項目がさらに最適化できる箇所

このセットアップを6ヶ月使って学んだことがある。すべてのauto-tuneを一度に有効にしてはいけない。以前、autosuspendを積極的に設定しすぎてUSBマウスがラグするようになったことがある。一つずつ有効にして1〜2日テストしてから次に進む。時間はかかるが確実だ。

6ヶ月後の実際の結果

上記のセットアップ(fedora-dev tunedプロファイル + 自動切り替えudevルール + performanceモード用エイリアス)で、ThinkPad X1 Carbon Gen 11は以下を達成した:

  • ターミナルとブラウザを数枚開いたアイドル時:約5W、バッテリーは9〜10時間持続
  • 通常作業(コーディング、Slack、メール):約8〜10W、6〜7時間持続
  • performanceモードでの重いコンパイル:約25〜30Wだが、balancedモードより約40%速く完了

何も設定していない頃と比べると、バッテリー持続時間が2〜3時間延びた。これで一日中外で作業する際に充電器を持ち歩く必要がなくなった。

Share: