CosmosBlueのブログ

日々のよもやま話を徒然と

DefenderフルスキャンでCPUが100%の対策(21H2 / 22H2 / 23H2)

Windows10あるいはWindows11を使っているうちに、Defenderの手動フルスキャンがいつしか全力でCPUをブン回すのに気が付きませんでしょうか。これは2021年秋以降のアップデートでWindows Defenderの振る舞いが変わり、手動フルスキャンがCPU資源を枯渇させるほど高負荷で動作するようになったためです。

じゃあ他のセキュリティソフトを使えという意見もありますが、Defenderが無料でウィルスやマルウェアを探索するのは有難いことでそれは良いのです。ただ、PCのオーナーである自分の意志を差し置いて、Defenderが全力でCPUを使いまくるのがイヤで仕方がないのです。

現在Core i3のPCを使っていますが、手動フルスキャンを起動するとCPUが100%近くに張り付き、CPU温度は80℃くらいになります。CPUファンは高速で回転し続け、これが小一時間かかる訳ですからCPUにとってもファンにとっても健康に良くない訳です。

Webで過去の様々な手法を施してみました。ファイルやフォルダのフィルタをかけるとか、タスクスケジューラの優先度を下げるとか、CPUアベレージを指定するとか、プロセスに直接優先度を設定するとかです。しかし、これらは全て有効な成果を上げませんでした。おそらく当時は効果があったのだと思いますが、アップデートによりそれらの手法が通用しなくなったと考えられます。

ではこの現象はどうにもならないのか?Defenderのリソース大食いをPCオーナーの意図に沿わせることはできないのか?

実はできたんです。それを説明していきます。

ここらかの手順はWindows11 21H2 / 22H2 / 23H2 で共通です(2023/12/17)

まず既存の手法の中に「ScanAvgCPULoadFactor」を設定するというのがあります。これはPowerShell管理者モードを起動してGet-MpPreferenceコマンドを入力すると確認できます。

Get-MpPreference

表示された設定値の中から「ScanAvgCPULoadFactor」を探しだします。

ScanAvgCPULoadFactor

ScanAvgCPULoadFactorはデフォルトで50になっています(上の画像は自分が25にしたもの)。しかし、これだけでは「手動フルスキャン」に効果がありません。ここでPowerShellと格闘すること6時間、意味の分からないパラメータを全部調べていきました。その中で、Web上からは全く情報が得られない謎パラメータを見つけました。

ThrottleForScheduledScanOnly

「ThrottleForScheduledScanOnly」というものです。そのまま訳すと「燃料流量制御はスケジュールされたスキャンだけ」になります。そう、実はこれがScanAvgCPULoadFactorの値をスケジュールされた自動スキャン以外でも有効にするための鍵パラメータだったのです。

では逸る気持ちを抑えて、まずはScanAvgCPULoadFactorから設定していきましょう。PowerShellは管理者モードで起動し直してください。

ScanAvgCPULoadFactorの設定

 "Set-MpPreference -ScanAvgCPULoadFactor 25" と入力しています。最後の数字はスキャンの実行中にCPUを使う割合(%)を指定します。画像では「25%までしかCPUを使うなよ!」と設定しています。とはいえ、これは全体的な努力目標みたいなもので、ある区間で見れば指定割合を絶対に超えないというものではありません。必要な際にはやむを得ず高い値になることがあります。

個人的感覚で大雑把に言うとスキャンのCPU使用率は次のような設定になります。

  • CPU負荷は気にしないので早く終わって欲しい: ≧50%
  • CPU負荷とスキャンにかかる時間のバランス重視: 35~45%
  • 時間は気にしないのでとにかく迷惑かけるな: 15~25%

次にThrottleForScheduledScanOnlyを設定します。デフォルトは1(True)、つまり「燃料流量制御は自動スキャンにしか適用しないよ」になっています。これをWindowsが勝手に行うスキャン以外にも適用するようにします。

ThrottleForScheduledScanOnlyの設定

"Set-MpPreference -ThrottleForScheduledScanOnly 0"と入力しています。これでThrottleForScheduledScanOnlyの値を0 (False)にしました。これによって手動スキャンにもScanAvgCPULoadFactorの値が適用されるようになります。

もう一つ気になるパラメータを(念のため)設定しておきます。

DisableCpuThrottleOnIdleScansの設定

"Set-MpPreference -DisableCpuThrottleOnIdleScans 0"と入力しています。これは「DisableCpuThrottleOnIdleScans」というパラメータで、直訳すると「アイドル時のスキャンではCPU流量制御を無効にする」となります。正直これのTrue/Falseの違いは体験出来ていませんが、PCが暇を持て余しているからといってDefenderに爆走してもらっては困るので、念のため0(False)を設定をしておきました。

ここまでPowerShellで設定変更していますが、一体これらはどこに記録されているのでしょう?まず自動・手動に関わらず、Defenderインスタンスの設定はレジストリの「HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Defender\Scan」にあります。ここへの値設定や変更はSet-MpPreferenceでしかできません。

ScanAvgCPULoadFactorはレジストリ上では"Scan"が無くて「AvgCPULoadFactor」なので気を付けてください。

Scanレジストリ

これとは別に「HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows Defender\Scan」というのがあります。ここがそもそもグローバルのOriginであり、ここにキーがあるものはその値が、無いものはデフォルト値がそれぞれ設定され、その後にローカル設定があればオーバーライドするみたいです。

ここはレジストリエディターで編集可能です。なのでPowershellで変更したスキャンのキーパラメータはこちらにも設定しておくと良いでしょう(通常何もしていなければScanキーは存在していないので自分で「Scan」を新規作成します)。

Powershellが読んでいるポリシー

では、Defender (Antimalware Service Executable)プロセスに設定を読み込ませるために一度Windowsを再起動し、Windowsセキュリティの「ウィルスと脅威の防止」からフルスキャンを実行し、タスクマネージャで確認してみてください。これで、以前のような静かなPC環境を得ることができました。

自分は当初ScanAvgCPULoadFactorを40%に設定していましたが、Windows Updata時にTiWorker.exeというのが60%近くまでCPUを使うので、同時に走行するAntimalware Service Executableの40%を加算すると100%近くになることがありました。なので現在はScanAvgCPULoadFactorを25%に設定しています。Defenderのスキャンが遅くなることでアップデートプロセスも待ちが多くなるため、全体として負荷が下がるのではないかと考えられます。でも、この手法もいずれ無効になるんだと思いますので、22Hとか23Hになってこの記事を試して効果が無かった場合でもご容赦願います。

2022/10/16 追記

元々この記事は当時使用していたWindows10 21H2での出来事が対象でしたが、最近Windows11 22H1にアップグレードし、更に続けて22H2にアップデートしたので、これら二種でも結果が得られました。

Windows11でもThrottleForScheduledScanOnlyを0から1に戻すと、手動フルスキャンのスタート数秒後から80%~90%で突っ走り始めるので、スロットル制御は効いているようです。ただ、以前よりAvgCPULoadFactorを超えてくるケースが多くなった気がします。Defenderがどのようにプログラミングされているかは全く知らないのですが、一つの処理ブロックを扱っている間は休憩できず、処理ブロック間にsleepなどを挟んでAverageを落とすような感じなのでしょうか。

また、我が家にはCeleronと第7世代Core i3のノートPCがそれぞれあり、こちらのWindows10 21H2でもやってみましたが、Celereon (N4100) はAvgCpuLoadFactor 25%設定でも50%付近をうろつくような時間が多く、15%設定にして30%程度に抑えられる感じでした(スキャン時間が非常に長くなりますが)。

私のデスクトップは第11世代Core i3で、負荷の軽い時は定格クロック以下で動作し、パワーを求められた時は供給電圧電力を一定時間上げてオーバークロックする" Intel Turbo Boost Technology "を搭載しています。より多くのパワーが供給されればより多くの仕事ができてしまうため、CPUの温度が上がりやすいという事実はあります。

これに対してノートPC用のCPUは元々低電圧電力設計になっていて、ファンレスでもCPU100%に対して70℃以下程度に収まってしまいます。なのでノートPCの場合はスロットルを絞って途方もない時間を要するくらいなら、いっそ絞らなくても良いのかもしれません。

2024/03/23 追記:

Windows11 23H2 2024-3月期アップデート適用済の環境ですが、Defenderのフルスキャンが以前に比してかなり大人しいというか、AvgCPULoadFactorを守るようになった気がします。以前から25%設定のままなんですが、最近急に実行速度が遅くなってCPU温度も40℃程度のまま(約90万ファイル)で7時間くらい走ってるんですよね。

作業の邪魔をされるのはイヤだけど、1日のPC使用時間内で終わらないのも困る、というレベルで長い場合は環境に応じてAvgCPULoadFactor値を調整してみてください。ただ、最新のスキャンエンジンでの一過性事象だった場合は、またすぐにうるさいやつになるかもしれませんのでご注意を。

なお、今もってThrottleForScheduledScanOnlyを1にすると手動フルスキャンでCPUが爆走するのは変わっていませんので、調整はあくまでもAvgCPULoadFactor値を上げる方向がよろしいかと思います。

 

PowerShellおよびレジストリの操作は自己責任で行ってください。この記事によって被ったあらゆる損害についてブログ主は免責とさせて頂きます。