星崎レンスターズ [神慮の機械外郭]

サークル「神慮の機械」装丁人兼雑文係・10年来の同人二次小説屋の星崎連維が共和国の下僕として作品や同人話をしてます。なかみはようかん。

サークル「神慮の機械」10年来の同人二次小説屋にして装丁人の星崎連維/維如星が共和国の下僕として作品や同人話をしてます。なかみはようかん。

同人情報・各種アカウント  装丁仕事一覧  雑記  本家・神慮の機械  twitter  pixiv

PCを新調したらマルチディスプレイでカクつき問題とスリープ解除数分遅延でハマった話 (2)

自作トラブルから無縁になりたくてBTOを選択したのに分かるかこんなん!!!に2発も当たって凹んだ件、その1の「マルチディスプレイに起因するPCカクつき問題」に続き2発目である。

rennstars.blackcats.jp


なんせこの2番目の「スリープ解除がなぜか数分遅延する」問題、結論から言うとおそらく現時点では解決不能。殴りたい。


タスクスケジューラからのスリープ解除がなぜか数分遅れてタスクがコケる件

目次:

とりあえず原因と対応

  • 症状:タスクスケジューラのタスクでスリープ解除を指定した時間から3分後に解除され、タスクが実行されない
  • 原因:ASUSのIntelチップセット向けマザーボードでは、3.5時間以上のスリープ解除時に使われるACPI Wake Alarmのバグで25秒/時ずつ解除時間が遅延していく
  • 対応:無い
  • 敗因: ASUSマザーのバグと思われるがユーザー母数が少なく、声も上がりにくい……。



何が起きているのか

分かりづらいのだが、こういうことである。

  1. タスクでスリープ解除タイマーをセットする。自分の場合寝る時に目覚ましにしてるので7時間後ぐらい。
  2. セットした時間から3分後ぐらいに遅れてスリープ解除される
  3. スリープ解除されてるがタスク実行時間を過ぎてるのでタスクがコケる

意味が……わからない……。

スリープが解除されない、などは良くある話である。しかし解除はされるが数分遅れるってどいうこと?

いわゆるWindows Updateスリープ解除問題とは無関係

実は最初にハマったのはこの遅延問題ではなく「なぜかシステムが午前4時にスリープ解除される」。こと。

これ、一番ありがちなWindows Updateでスリープ解除されてしまう問題はグループポリシー設定で対処済みだったし、おまけに確かにWindows Update系のタスクが走ってはいたがそれはスリープ解除から50分後、つまり「普通に起動してたから」に過ぎない。

これは原因不明で直ってしまったので今もよくわかっていないが、1つ前のセカンドディスプレイ問題でのUSB周り同様、午前4時起動は結果的に別問題だったのである。

で、このトラブルと格闘していたら、なぜか目覚まし代わりにタスクスケジューラでセットしているタスクの指定実行時間から約3分後にスリープ解除され、当然3分後なのでタスクが実行されないという本題の方に直面したのであった。

スリープ解除されない、ならまだしも、3分後に解除される is 何

しかも不思議に思って、試しに数分後などにタスク時間をセットしてスリープに入るとちゃんと正しい時間に復帰して上がってくる。何かの間違いだったかと思って放置していたら(目覚ましなので)翌日にまったく同じ問題が発生。発症条件が謎過ぎて困ってしまった。

「オペレーターまたは管理者が要求を拒否しました」……も無関係!

もう一つ振り回されたのが、この「指定から3分後にスリープ解除」されるのでタスクが実行されなかった結果、タスクスケジューラの「前回の実行結果」「オペレーターまたは管理者が要求を拒否しました」が残ること。

これもタスクスケジューラでは定番問題らしい。ぐぐってみると同じタスクの前回のインスタンスが残ってる(要は終了してない)場合、並列で実行する設定にしてないと起動しない、だそうだ。

後から考えればスリープ解除が遅れることとは全然違う話なのだけど、実行しようとして失敗するのに3分掛かったように見えるのかも等々これまた色々設定を変えては試して無益に終わる結果となった。つ、疲れる。

スリープ問題は検索汚染がひどい

地味にフラストがたまるのだが、そもそもPCのスリープ関連は検索汚染がひどい

まぁ汚染と呼ぶには可哀そうなものも多いが、スリープが解除されない、勝手にされる等々、こんな解除が数分遅延するみたいなマイナーなネタは完全に埋もれてしまうのである。

毎度この手の日本語検索がキツいトピックは英語圏に頼るのだけど、残念ながら今回はそっちも空振り。毎度頼みの綱redditなんかでも皆無。

結果的に下の方で別の検索単語を得たことで後から分かったが、そもそもこの問題に触れているのは国内kakaku.comのクチコミと、見つかった限りたった1件のブログのみなのである……。そりゃ見つからんわ。


powercfgで色々と調べる

ただ、先の夜中問題の際にpowercfgコマンドで色々調査できることがわかり、powercfg /sleepstudyで生成されるHTMLのレポートを見ていてふと気づいた。

sleepstudyのレポートって最初ちょっとわかりづらいのだけど、スリープから解除された理由はスリープに入ったときのイベント(System Power State: Sleep)Exit Reasonに入る。スリープ解除のイベント(System Power State: Active)Entry Reasonではないので注意。

で、SleepのExit Reasonを見ると、正しくタスクスケジューラのタスクでスリープ解除された方は

Timer - Windows は、スリープ状態の解除を要求したスケジュールされたタスク 'NT TASK\セットしたタスク名' を実行します。

が入っているのに、3分遅れでスリープ解除された方は

Device -ACPI Wake Alarm

になってる。違いはこれしかない。

ACPI Wake Alarmのバグ?

で、「ACPI Wake Alarm スリープ 遅延」でぐぐったら一発ヒット。

lileenchantee.blog.fc2.com

この方がASUS PRIME H510M-Aで遭遇したのがこれ。

  • スリープから約3.5時間まではアプリケーションがスリープ解除するが、約3.5時間を超えるとACPI Wake Alarmがスリープ解除するようになる。
  • ACPI Wake Alarmがスリープ解除する場合、1時間毎に約25秒ずつスリープ解除が遅れていく

これだよ!

自分のタスクでも7時間程度のスリープ時間で3分の遅延。25秒*7=175秒で大体3分だ。あってる。自分の環境はASUS TUF GAMING Z690-PLUS、要するにIntel Z690チップセットなのでド当たりである。

で、解決……しなかった

上記のページに書いてあった対応は以下の通り。

  • ACPI Wake Alarm(ACPI ウェイク アラーム)が存在する場合はACPI Wake Alarmが優先して使われ、ACPI Wake Alarmが存在しない場合はLegacy RTCが使われる。
  • UEFI(BIOS)設定でACPI Wake Alarmを無効にできない場合でも、デバイス マネージャー上で無効にすれば同じ結果になる。
  • デバイス マネージャー上で無効にする場合はHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\acpitimeのStartを4に変更して再起動する。

ところがそこのサイトにも書いてあるが、

  • UEFI(BIOS)でACPI Wake AlarmをLegacy RTCに変える → 400番台チップセット以降のASUSマザーUEFIにはその設定がない
  • Windows上のデバイマネージャでシステムデバイス内にあるACPI Wake Alarmを無効化する → 500番台以降のマザーでそれをやるとあらゆるタスクからのスリープ解除が無効になり使えない(400番台では機能するとの報告あり)

という次第で、要するに詰んだ

一応ASUSのサポートに英語で(重要)症状を説明して御社のバグではと出してみたけど、初手はまぁ木で鼻をくくったような回答が返ってきた。2022/07/22現在、もう一度念入りに調査を依頼しなおしているけど望みは薄そうである……。

個人的バッドノウハウ解法

とりあえず症状としては繰り返すが

  1. タスクでスリープ解除タイマーをセットする
  2. 3.5時間後以降のスリープ解除が1時間当たり25秒遅延する
  3. 結果数分遅れてスリープが解除される
  4. スリープは解除されているがタスク実行時間を過ぎてるのでタスクがコケる

つまりスリープ自体は解除されるし、遅延時間はほぼ正確に計算できる


よって、起動後にもう一度タスクに足掻いてもらうというのがとりあえずの解法1。

  1. そもそも遅延を織り込んでタスクを早めにセットする
  2. タスク設定の「スケジュールされた時刻にタスクを開始できなかった場合、すぐにタスクを実行する」を入れておく

……が、これだとなぜか起動してから更に3分ぐらい実行までに時間が掛かってしまう。バックアップ等「走ればいい」ものならそれでいいが、正確な時間が欲しいタスクでは使えない。


そこで、もう最高にバッドハックだと思うのだが、ワイの答えは

  • スリープを解除するだけのダミータスクを別途本タスクの数分前にセットする

これである。……いやこれ手動でやってたら発狂すると思うけど、幸い自分の場合はスクリプトからschtasksを使って時間を登録している。なのでスクリプト内で

  1. 時間を指定してタスクを作成させる際に、そこから指定時間と現時刻の差を取る
  2. その差から1時間あたり25秒の遅延時間を計算
  3. 指定時間から遅延時間引いた時刻にスリープ解除用ダミータスクを登録
  4. これによってダミータスクで狙った時間にスリープが解除され、1分以内にセットされた本タスクが走る

これでとりあえず解決。


解決っていうのかよこれは!!!!!!


まぁASUSから真っ当な回答が来るなり、UEFI等のファームウェアップデートで解決したらまた報告しますね…………

Supported by MACHINA EX DEO  Powered by 黒猫連盟 and はてなブログ