SleepStudyでスリープ状態のときの消費電力の問題を調べる

もくじ
https://tera1707.com/entry/2022/02/06/144447

やりたいこと

最近、windowsアプリを開発していて、「消費電力を減らせ!」とよく言われる。

以前、CPUを無駄に何秒かごとに使ってしまっているんじゃないか?を調べるときに、WPRでCPU使用率の推移の情報を採取し、WPAでそれを解析する、ということをした。

それとは別に、スリープ(モダンスタンバイ)中に変に電力を食ってないか?というのを「SleepStudy」というので調べられるらしい。

やりかたを調べてみる。

情報源

Modern standby SleepStudy
MS公式。SleepStudyとは?の説明。SleepStudyで出てくるレポートの内容の説明などの「仕様」的なもの。

https://learn.microsoft.com/ja-jp/windows-hardware/design/device-experiences/modern-standby-sleepstudy

SleepStudyのコマンドラインオプション
標準で過去3日分のレポートを出すが、オプションで指定できる。
オプションで変えれるのは、出力フォルダと対象日数くらいっぽい。

https://learn.microsoft.com/ja-jp/windows-hardware/design/device-experiences/powercfg-command-line-options#option_sleepstudy

スタンバイに関する電源の問題のデバッグ
MS公式。SleepStudyを使ったワーク/演習

https://learn.microsoft.com/en-us/windows-hardware/test/wpt/debugging-problems-with-standby

システムの電源状態
MS公式。いわゆるS0~S5までの状態が何なのか?の資料。

https://learn.microsoft.com/en-us/windows/win32/power/system-power-states

SleepStudyに関する動画
MS公式。もともと「channel9」というくくり?の動作だったっぽい。
英語が早すぎて聞き取れないが、良いことをいってるっぽい。

https://learn.microsoft.com/ja-jp/shows/defrag-tools/168-powercfg-sleep-study

用語

用語 意味 備考
SleepStudy モダンスタンバイの調査のための機能。
普通のスリープ(S0)の調査のための機能ではない。
DRIPS Deepest runtime idle platform stateの略。
消費電力が最小である状態のこと。
参照
セッション 1回のスリープ突入からスリープを抜けるまでのこと。 SleepStudy関連の用語としての意味。
HW:91% SoC が最低電力状態(DRIPS)にある時間の割合。
ハードウェアDRIPSの略。
参考
Duration スリープに入ってから抜けるまでの時間。 SleepStudy関連の用語としての意味。

やったこと

とりあえず、上の資料を読みながら、実際にSleepStudyを出力して、また上のワークをやってみて、いろいろ試した。

SleepStudyの実行/レポート出力

基本はこれ。

powercfg sleepstudy

これで、カレントディレクトリに、レポートが出てくれる。

ただ毎回手打ちでコマンド打つのは面倒なので、下記のようなバッチを作ってレポートを出力させて試した。
管理者としてバッチを実行する方法の記事を参考にした)

@set @dummy=0/*
@echo off
NET FILE 1>NUL 2>NUL
if "%ERRORLEVEL%" neq "0" (
  cscript //nologo //E:JScript "%~f0" %*
  exit /b %ERRORLEVEL%
)

REM 管理者権限で実行したい処理 ここから

powercfg sleepstudy
sleepstudy-report.html

pause
REM 管理者権限で実行したい処理 ここまで

goto :EOF
*/
var cmd = '"/c ""' + WScript.ScriptFullName + '" ';
for (var i = 0; i < WScript.Arguments.Length; i++) cmd += '"' + WScript.Arguments(i) + '" ';
(new ActiveXObject('Shell.Application')).ShellExecute('cmd.exe', cmd + ' "', '', 'runas', 1);

レポートのhtmlの内容

全体

仕様は、情報源のところにも挙げた下のMS資料の通り。

https://learn.microsoft.com/ja-jp/windows-hardware/design/device-experiences/modern-standby-sleepstudy#report-details

なのだが、何とも説明がとっつきにくいので、情報源にも挙げたMSの演習でサンプルとしてあげられているレポートファイルを見ながらここが何なのかを書いてみる。

ファイル名はsleepstudy-report_1.html(イコール、なにか異常があるときのレポートのサンプル)

それに対して、一般的なPCで採取した、なにも問題のないときのレポートは下記のようになる。
(電力消費が変に高いところがない、色がカラフルじゃない)

※前者と後者で少しレポートの内容が異なる(例えばサマリーの表に「STATE」の項目がある/ない、など)のは、SleepStudyのバージョンが異なるからかもしれない。

※前者はSleepStudyのMS公式の演習のサンプル、後者は新しいPC(2025年発売のPC)に実際に入っているSleepStudyuで出力したレポート。前者は相当長いこと演習サイトがメンテされてない雰囲気なので、その間に出力ファイルの仕様がかわったのかも。

電池残量の推移

掲題の通り。電池残量の推移。

サマリー(概要表)

レポート全体概要。

1行が1セッションの概要で、「セッション」とは、1回のスリープ突入からスリープを抜けるまでのこと。

セッションの行をクリックすると、同じレポートファイル内の、そのセッションの詳細表示部分に飛ぶ。

セッションごとの詳細情報

Top Offenderは、電力を食ってるヤツtop5ということ。

そのデバイスの名前をクリックすると、詳細な情報に飛ぶ。

% ACTIVE TIMEが99%ということは、スリープしていた時間(Duration)のうちの99%の時間、デバイスが動作してしまっていたということ。

色分けのルールによると、赤になる条件は、

  • DRIPS率が80%未満だと赤になる
  • バッテリーの消費率が、1hにつき1%以上だと赤になる

とのこと。ともかく、赤色になっていると、そいつが「異常に電力を食っている」と判断してよさそう。

ここまでの内容で、一時切り分けをする

ここまでで、なんとなく消費電力が高いデバイスを割り出せる。

例えばMSの演習1のサンプルレポート(sleepstudy-report_1.html)だと、例えば

Disk drive (\_SB.PCI0.SAT0.PRT2)

というデバイスが、電力を食っているっぽい。

で、そのデバイスは、「\_SB.PCI0.SAT0.PRT2」というデバイスIDを持っている。

こいつの場合、

名前から、おそらくPCIバスにつながっているデバイスであろうということがわかる。
具体的にどういう接続になっているか、などは、ドライバの知識が必要になってくるらしい。

ざっくりどういう接続になっているかはデバイスマネージャーの「表示」を「デバイス(接続別)」にすると見ることができるらしい。(未確認。やってみること)

一時切り分け後の対応

ざっくり一時切り分けをしたら、ハードに詳しい方、部門の人に、このデバイスが電力を食っているっぽいと相談をするのがよいかも。

その他

メモ

モダンスタンバイ中はDAM(デスクトップ アプリケーション モデレーター)というものが、アプリを止めに行ってしまうので、自作アプリでモダンスタンバイ中の情報をとってデバッグするのは難しい。→なのでSleepStudyが有効。

S0~S5

下記に書いてる情報だが、一応まとめる。

https://learn.microsoft.com/en-us/windows/win32/power/system-power-states

State 説明 備考
S0 起動中
S0 Ix(S0低電力) モダンスタンバイ SleepStudyはコレの時の調査のためのツール!
S1 現在のPCでは使ってない
S2 現在のPCでは使ってない
S3 レガシースリープ
S4 休止 Windowsの「シャットダウン」はコレ
S5 電源OFF Windowsの「完全シャットダウン」はコレ

仕様メモ

サマリーの仕様はこれ。

  • 上記のうち、特にきになるこれ
    • SleepStudyレポートでは、10分未満のモダンスタンバイセッション全体は追跡されません。
    • ACセッションでは、電力の変化は追跡されません(CHANGE RATEのChargeキーワードで示されます)。

https://learn.microsoft.com/en-us/windows-hardware/design/device-experiences/modern-standby-sleepstudy#list-of-summary-information

  • 昔(20H1以前)のレポートの色は下記できまっていた

  • 今はこれ。

https://learn.microsoft.com/en-us/windows-hardware/design/device-experiences/modern-standby-sleepstudy#color-coding

※排水率:drain rate →放電率