PerfPowerServices が暴走していたので対処した際のメモです。
環境
何が起きていたか
アクティビティモニターを確認するとPerfPowerServicesがCPUを70%ほど使い続けている状態でした。
発見してから2時間ほど放置しても下がらず、たまたまディスクタブで使用量を確認すると毎秒10MBの書き込みで100GB以上書き込み続けている状態でした。
効果があった方法
下記のファイルを削除して、アクティビティモニターでPerfPowerServicesを終了したらCPU負荷や異常なDisk書き込みがなくなりました。
/private/var/db/powerlog/Library/BatteryLife/CurrentPowerlog.PLSQL
/private/var/db/powerlog/Library/BatteryLife/CurrentPowerlog.PLSQL-wal
/private/var/db/powerlog/Library/BatteryLife/CurrentPowerlog.PLSQL-shm
試したけど効果がなかったもの
- プロセス終了、プロセス強制終了
- すぐに自動起動してCPU負荷とDisk書き込みを発生させました
- OS再起動
- 効果無し(同上)
- セーフブート
- 効果無し(同上)
- DiskのFirst Aid
- ディスクのエラー無し
- ハードウェア診断
- 異常無し
- OSの上書きインストール
- 効果無し(同上)
sudo launchctl unload PerfPowerServices
- エラー(
Unload failed: 5: Input/output error
)
- エラー(
sudo launchctl bootout system/com.apple.PerfPowerServices
- パーミッションエラーで実行できず(
Boot-out failed: 150: Operation not permitted while System Integrity Protection is engaged
)
- パーミッションエラーで実行できず(
効果があった方法(再掲)
lsofで開いているファイルを確認すると /private/var/db/powerlog/Library/BatteryLife
や /private/var/db/powerlog/Library/PerfPowerTelemetry
以下のファイルを開いていました。
※下記のコマンド実行結果は改善後の出力なので厳密には違います。
$ sudo lsof -p 170 Password: COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME PerfPower 170 root cwd DIR 1,4 640 2 / PerfPower 170 root txt REG 1,4 178624 1152921500312512050 /usr/libexec/PerfPowerServices PerfPower 170 root txt REG 1,4 57024 50860664 /Library/Preferences/Logging/.plist-cache.Rm5iXxTt PerfPower 170 root txt REG 1,4 110 1152921500312133407 /System/Library/CoreServices/SystemVersion.bundle/English.lproj/SystemVersion.strings PerfPower 170 root txt REG 1,4 32768 50854583 /private/var/db/powerlog/Library/BatteryLife/CurrentPowerlog.PLSQL-shm PerfPower 170 root txt REG 1,4 32768 13245936 /private/var/db/powerlog/Library/PerfPowerTelemetry/ExtendedPersistence/CurrentLog.EPSQL-shm PerfPower 170 root txt REG 1,4 32768 31571665 /private/var/db/powerlog/Library/PerfPowerTelemetry/CleanEnergy/CurrentCleanEnergyDB.CESQL-shm PerfPower 170 root txt REG 1,4 826310 1152921500312174626 /System/Library/Frameworks/Foundation.framework/Versions/C/Resources/FoundationErrors.loctable PerfPower 170 root txt REG 1,4 238064 50210472 /private/var/db/timezone/tz/2023d.1.0/icutz/icutz44l.dat PerfPower 170 root txt REG 1,4 281152 1152921500312511242 /usr/lib/libobjc-trampolines.dylib PerfPower 170 root txt REG 1,4 138105 50861413 /private/var/db/analyticsd/events.allowlist PerfPower 170 root txt REG 1,4 373520 1152921500312155548 /System/Library/Extensions/IOHIDFamily.kext/Contents/PlugIns/IOHIDLib.plugin/Contents/MacOS/IOHIDLib PerfPower 170 root txt REG 1,4 935744 1152921500312171489 /System/Library/Frameworks/CoreMediaIO.framework/Versions/A/Resources/VDC.plugin/Contents/MacOS/VDC PerfPower 170 root txt REG 1,4 32986592 1152921500312520346 /usr/share/icu/icudt72l.dat PerfPower 170 root 0r CHR 3,2 0t0 314 /dev/null PerfPower 170 root 1u CHR 3,2 0t0 314 /dev/null PerfPower 170 root 2u CHR 3,2 0t316 314 /dev/null PerfPower 170 root 3u REG 1,4 1826816 50854578 /private/var/db/powerlog/Library/BatteryLife/CurrentPowerlog.PLSQL PerfPower 170 root 4u REG 1,4 333752 50854582 /private/var/db/powerlog/Library/BatteryLife/CurrentPowerlog.PLSQL-wal PerfPower 170 root 5u REG 1,4 32768 50854583 /private/var/db/powerlog/Library/BatteryLife/CurrentPowerlog.PLSQL-shm PerfPower 170 root 6u REG 1,4 4096 13245928 /private/var/db/powerlog/Library/PerfPowerTelemetry/ExtendedPersistence/CurrentLog.EPSQL PerfPower 170 root 7u REG 1,4 1433792 13245935 /private/var/db/powerlog/Library/PerfPowerTelemetry/ExtendedPersistence/CurrentLog.EPSQL-wal PerfPower 170 root 8u REG 1,4 32768 13245936 /private/var/db/powerlog/Library/PerfPowerTelemetry/ExtendedPersistence/CurrentLog.EPSQL-shm PerfPower 170 root 9u REG 1,4 53248 31571655 /private/var/db/powerlog/Library/PerfPowerTelemetry/CleanEnergy/CurrentCleanEnergyDB.CESQL PerfPower 170 root 10u REG 1,4 2818112 31571664 /private/var/db/powerlog/Library/PerfPowerTelemetry/CleanEnergy/CurrentCleanEnergyDB.CESQL-wal PerfPower 170 root 11u REG 1,4 32768 31571665 /private/var/db/powerlog/Library/PerfPowerTelemetry/CleanEnergy/CurrentCleanEnergyDB.CESQL-shm PerfPower 170 root 12r DIR 1,4 96 50836975 /private/var/db/powerlog PerfPower 170 root 13u IPv4 0xd8b7965fe99ee93d 0t0 UDP *:* PerfPower 170 root 14u KQUEUE count=0, state=0x8 PerfPower 170 root 15u KQUEUE count=0, state=0x8 PerfPower 170 root 16u IPv4 0xd8b7965fe99e753d 0t0 UDP *:* PerfPower 170 root 17u IPv4 0xd8b7965fe99e553d 0t0 UDP *:* PerfPower 170 root 18u IPv4 0xd8b7965fe99e713d 0t0 UDP *:* PerfPower 170 root 19u CHR 21,0 0t0 623 /dev/xcpm
/private/var/db/powerlog/Library/BatteryLife/Archives
以下に大量のローテートされたと思わしきファイルがありましたが、なぜか powerlog_1970-01-08_041E275E.PLSQL.gz
や powerlog_1984-05-07_063FE7A3.PLSQL.gz
など1970年から徐々に未来に向かう方向で1分間に30個前後のファイルが生成されていました。
1984-05-07などとありますが作成されたのは昨日や今日です。
CurrentPowerlog.PLSQL などが破損しているのではないかと推測して、これらのファイルを削除して、プロセスを再起動したら異常なファイル書き込みやArchivesの生成がなくなりました。
副作用
CurrentPowerlog.PLSQL を削除したからなのか、システム設定のバッテリーにあるバッテリー残量や画面オンの使用状況がクリアされました。
(異常時は画面オフの時もずっと画面オンとして扱われていたのもファイルが破損していた説が濃厚になりました)
最後に
PerfPowerServices
で検索しても全然情報が出てこないので困りました。
解消後はOSの再起動をしても、プロセスが落ち着いている状態です。
ただ、ファイルがローテートされるタイミングがいつになるかわかりませんが、ローテートされた時に再び暴走しないかが不安です。
たまたま、異常状態に気がつけたけど、解消するまでにどれだけのdisk書き込みが発生して寿命に影響したのだろうか……
あと、OS復旧の起動やOSイメージのDLが遅すぎ……
寝る前に放置して翌朝確認したら、OSイメージDL後のインストール開始時の再起動でFileVaultのパスワード入力待ちで停止していたのがショックでした。
対応時のツイートメモ(抜粋)
PerfPowerServicesがCPUを70%ほど使っている。なんだこれ。
— matayoshi (@nmatayoshi) 2024年2月12日
まだ動いている。マジでなんだこれ。
— matayoshi (@nmatayoshi) February 12, 2024
コンソールで診断レポートを見たら、diskに書き込みまくっているんだが。
— matayoshi (@nmatayoshi) February 12, 2024
"34.36 GB of file backed memory dirtied over 2580 seconds (13.32 MB per second average), exceeding limit of 397.68 KB per second over 86400 seconds"
システムモニターでも100GB以上書き込みしているし、50GB以上読み込んでいる。
— matayoshi (@nmatayoshi) February 12, 2024
/private/var/db/powerlog/Library/BatteryLife とかを開いている。強制終了したらDisk IOが一旦落ち着いたけど、また起動してきた。マジでなんだこれ
— matayoshi (@nmatayoshi) February 12, 2024
画面オンの使用状況が使っていない時間帯も使っていることになっている
— matayoshi (@nmatayoshi) February 12, 2024
ダメだ。OSを再起動してもPerfPowerServicesが起動してくる
— matayoshi (@nmatayoshi) February 12, 2024
diskのエラーは無し
— matayoshi (@nmatayoshi) February 12, 2024
セーフブートしてもプロセスが起動してくる
— matayoshi (@nmatayoshi) February 12, 2024
ハードウェア診断も異常無し
— matayoshi (@nmatayoshi) February 12, 2024
上書きインストール完了。でもPerfPowerServicesは変わらず起動する
— matayoshi (@nmatayoshi) February 12, 2024
/private/var/db/powerlog/Library/BatteryLife/Archives にファイルが増えていく。ファイル名に日付っぽいのがあるが、1970年から1983年。作成日などは今日になっている。段々今に向かって進んでいる?
— matayoshi (@nmatayoshi) February 12, 2024
/private/var/db/powerlog/Library/BatteryLife/Archivesは次々とファイルが生成されていくので、/private/var/db/powerlog/Library/BatteryLife/CurrentPowerlog.PLSQL* のファイルを削除してからPerfPowerServicesプロセスを終了したら漸く落ち着いた。
— matayoshi (@nmatayoshi) February 12, 2024
PerfPowerServicesが自動起動してCurrentPowerlog.PLSQL*が再生成された。Archives以下に大量に生成されることもとまった
— matayoshi (@nmatayoshi) February 12, 2024
バッテリーの利用状況が消し飛んだが、無駄なCPU利用とDisk IOの浪費が止まったので、これで解決できたのなら嬉しい。
— matayoshi (@nmatayoshi) February 12, 2024
気がついて対処できるまでの間に、どれだけ無駄にDiskの寿命が縮まったのだろうか…
— matayoshi (@nmatayoshi) February 12, 2024