# Defender 的 Antimalware Service Executable 為什麼吃掉 CPU

工作管理員裡的「Antimalware Service Executable」就是 Windows 內建的 Microsoft Defender 防毒，處理程序檔是 `MsMpEng.exe`。它佔用 CPU 偏高，多半是在掃描：可能是排程掃描，可能是剛裝完新的安全性情報後補掃一次，也可能是別的程式正在大量開啟檔案，它跟著做即時檢查。先分清是哪一種再動手。幾種情況的處理方式各不相同，沒有一種需要把 Defender 永久關掉。

## 它到底在做什麼

微軟[排查 Defender 效能問題的文章](https://learn.microsoft.com/en-us/defender-endpoint/troubleshoot-performance-issues)直接點了名。Anti-malware Service Executable、`MsMpEng.exe`、Microsoft Defender 防毒說的是同一個東西。它的工作大致分三類：

| 工作來源 | 什麼時候發生 | 看起來是什麼樣子 |
| --- | --- | --- |
| 即時保護 | 檔案被開啟、關閉或啟動時 | CPU 跟著別的工作走：編譯、安裝程式、解壓縮、複製大量小檔案 |
| 排程掃描 | 按排程執行，預設要等電腦閒置 | 人一離開就開始，回來時可能還沒掃完 |
| 安全性情報更新後的掃描 | 新的病毒庫裝好以後 | 像是在排程之外又掃了一次 |

平時最常遇到的是即時保護。同一篇文章列了幾種特別耗 CPU 的情況：沒有數位簽章的 `.exe`、`.dll` 被反覆啟動，把 HTA、CHM 這類複雜格式當資料庫用，混淆過的指令碼，還有 `.iso`、`.vhdx` 這種大檔放在會同步到網路位置或 OneDrive 的個人資料夾裡。編譯一個專案要寫出幾千個小檔，就是最日常的例子。編譯器每寫一個檔，Defender 就要看一個。

<figure class="blog-diagram">
  <picture>
    <source media="(max-width: 900px)" srcset="/img/blog/windows-antimalware-service-executable-high-cpu-zh-mobile.webp" type="image/webp" width="768" height="1180">
    <img src="/img/blog/windows-antimalware-service-executable-high-cpu-zh.webp" width="1360" height="454" loading="lazy" alt="Defender 的三類掃描">
  </picture>
  <figcaption>即時掃描跟著別的工作走，排程掃描跟著時間走，安全性情報更新後還會自己掃一次。三種情況的處理方式不一樣。</figcaption>
</figure>

## 先看，不改設定

按 `Ctrl + Shift + Esc` 開啟工作管理員，按 CPU 排序，同時記下這一刻還有誰在忙。如果它的佔用跟著編譯、安裝或一次大量複製一起起落，那是在即時檢查這些檔案。如果別的程式都閒著、只有它在忙，多半是在做一次掃描。過幾分鐘再看一眼。掃完自己降下來是正常現象，不算故障。

再從開始功能表開啟 Windows 安全性，進入病毒與威脅防護。[微軟的 Windows 安全性說明](https://support.microsoft.com/en-us/windows/virus-and-threat-protection-in-the-windows-security-app-1362f4cd-d71a-b52a-0b66-c2820032b65e)講了這裡的掃描選項：快速掃描、完整掃描、自訂掃描和 Microsoft Defender 離線掃描，還有保護歷程記錄。保護歷程記錄值得先看一眼。如果 Defender 確實發現了東西正在處理，CPU 偏高就有了原因，該處理的是記錄裡列出的那一項。

想知道到底是哪些檔案最費時間，Defender 自帶一個效能分析工具。[微軟的說明](https://learn.microsoft.com/en-us/defender-endpoint/tune-performance-defender-antivirus)講得很清楚：先開始錄製，重複一遍那個慢的操作，它會按掃描耗時列出排在前面的檔案、路徑、副檔名和處理程序。以系統管理員身分開啟 PowerShell，開始錄製後重複那項工作，按 Enter 停止：

```powershell
New-MpPerformanceRecording -RecordTo C:\Temp\defender.etl
Get-MpPerformanceReport -Path C:\Temp\defender.etl -TopFiles 10 -TopProcesses 10
```

路徑只是舉例，換成一個存在的資料夾就行。報告只讀資料，不改任何設定。排在前面的如果是自己專案的建置輸出或套件管理員快取，即時掃描的開銷就找到了。如果是一個剛下載的壓縮檔，或認不出來的程式，那就該讓它繼續掃。

## 掃描本身，預設用快速掃描

[微軟的掃描說明](https://learn.microsoft.com/en-us/defender-endpoint/schedule-antivirus-scans)建議排程掃描用快速掃描。它檢查惡意軟體會隨系統啟動的那些位置，例如登錄機碼和啟動資料夾，再加上一直開著的即時保護，就是微軟建議的涵蓋方式。完整掃描要把所有固定磁碟讀一遍，磁碟大的話要幾個小時甚至幾天。微軟一般不建議把它設成排程工作。如果是自己手動點了完整掃描，CPU 會一直忙到它掃完。

同一份說明還提到，排程掃描開始前 15 分鐘 Defender 會先檢查更新。排查文章也說明安全性情報更新後預設會補一次掃描，所以有時會在一個自己沒設過的時間看到它在掃。

想把排程掃描挪出工作時間，可以照微軟的[工作排程器步驟](https://support.microsoft.com/windows/schedule-a-scan-in-microsoft-defender-antivirus-54b64e9c-880a-c6b6-2416-0eb330ed5d2d)，開啟工作排程器程式庫 › Microsoft › Windows › Windows Defender，按兩下 Windows Defender Scheduled Scan，在觸發程序裡新建一個時間，選一個電腦開著但自己不用的時候，例如午餐時間。挪時間不會少掃一次，只是換個時候付出這份開銷。

## 開發目錄，先考慮 Dev Drive，再考慮排除項目

如果開銷來自開發工作，微軟在 Windows 11 上給的方案是 [Dev Drive](https://learn.microsoft.com/en-us/windows/dev-drive/)。它是一個單獨的 ReFS 磁碟區，至少 50 GB，專門放程式碼存放庫、套件快取和建置輸出。受信任的 Dev Drive 上 Defender 會以效能模式執行。微軟把它描述成比排除資料夾更安全的替代做法：檔案照樣會掃，只是對編譯的影響小一些。在系統管理員命令列裡可以查它的狀態：

```powershell
fsutil devdrv query D:
```

把 `D:` 換成自己的 Dev Drive 磁碟機代號。C 槽不能做成 Dev Drive，已有的磁碟區要轉換只能重新格式化。微軟還建議 Visual Studio、SDK 這類開發工具留在 C 槽。把快取挪過去比改一項設定的改動大。Dev Drive 頁面列出了 npm、NuGet、pip、Cargo、Maven、Gradle 各自要設的環境變數。哪些快取其實可以直接清，可以看 [Windows 開發快取](/tw/windows/blog/windows-developer-caches)。

## 排除項目，只給自己信得過的資料夾，並且清楚代價

排除項目會讓 Defender 不再掃描那個檔案、資料夾、檔案類型或處理程序。在 Windows 安全性裡，[微軟的步驟](https://support.microsoft.com/en-us/windows/add-an-exclusion-to-windows-security-811816c0-4dfd-af4a-47e4-c301afe13b26)是病毒與威脅防護 › 管理設定 › 新增或移除排除項目。同一頁也寫明了排除的內容可能讓裝置和資料暴露在風險裡。微軟的[排除項目參考](https://learn.microsoft.com/en-us/defender-endpoint/microsoft-defender-antivirus-exclusions-configure)更直接：通常根本不需要設排除項目。

如果還是要加，範圍盡量小：

- 只排除自己信得過的工具才會寫入的資料夾，例如一個專案的建置輸出目錄，不是整顆磁碟，也不是整個使用者資料夾。
- 下載、桌面、瀏覽器的下載目錄，以及會收到郵件、聊天和網路上檔案的資料夾，一律不排除。惡意軟體就是從這些地方進來的。
- 處理程序排除會涵蓋這個處理程序開啟的所有檔案。排除編譯器或套件管理員，等於它下載下來的東西也不掃了。

每加一項排除都是一次交換：那個資料夾省了 CPU，落進去的任何東西也都沒人檢查。哪天這個資料夾開始放下載來的檔案，就把排除項目刪掉。

## 哪些事不要做

不要透過登錄、群組原則、「精簡」指令碼或第三方最佳化工具把 Defender 永久關掉。在 Windows 安全性裡關掉即時保護本來就是暫時的。[微軟的說明](https://support.microsoft.com/en-us/windows/virus-and-threat-protection-in-the-windows-security-app-1362f4cd-d71a-b52a-0b66-c2820032b65e)寫著過一小會兒它會自己重新開啟。關著的這段時間裡，開啟和下載的檔案都不會被檢查。排查文章也只建議透過疑難排解模式短暫關一下，用來排除它是不是原因。

也不要在工作管理員裡結束 MsMpEng.exe，不要刪 Defender 資料夾裡的檔案，不要為了讓數字降下來把 `C:\` 或整個使用者資料夾排除掉。如果同時裝了別的安全性軟體，微軟的文章建議把雙方的處理程序互相加進排除項目。兩個掃描器檢查同一批檔案，本身就是 CPU 偏高的常見原因。

## 改完以後怎麼確認

挪了掃描時間、把快取搬到 Dev Drive，或加了一個小範圍的排除項目之後，重複同樣的工作，例如同一次編譯，前後對比一下。也可以再錄一次效能分析，看那個資料夾有沒有顯示略過原因，或者掃描耗時是不是降了。回到 Windows 安全性的病毒與威脅防護，保護狀態應該仍然是開著的。

Mole 不會改 Defender 的設定，也不會加排除項目。點視窗左上角的 Mole 標記，選擇執行診斷。報告會顯示 Defender 即時保護是否開著，病毒庫超過一週沒更新時也會提示。別人動過這台電腦的安全性設定以後，可以拿它看一眼。不是 Defender 的 CPU 佔用，可以看 [Windows CPU 佔用偏高怎麼查](/tw/windows/blog/windows-high-cpu-usage)。磁碟一直 100% 可以看 [工作管理員裡磁碟 100%](/tw/windows/blog/windows-disk-100-percent)。

## 常見問題

### Antimalware Service Executable 是病毒嗎？

真正的這個處理程序是 Windows 內建的 Microsoft Defender 防毒，檔名 `MsMpEng.exe`。佔用偏高通常是在掃描。如果保護歷程記錄裡有偵測結果，處理那一項就行。

### 電腦閒著的時候 Antimalware Service Executable 為什麼 CPU 佔用偏高？

排程掃描預設在電腦閒置時執行，安全性情報更新後也會預設補掃一次。快速掃描一般很快自己結束，完整掃描可能要幾個小時。

### 可以停用 Antimalware Service Executable 嗎？

沒有安全的辦法。關掉即時保護只是暫時的，Windows 會自己重新開啟。用原則或指令碼永久停用會讓檔案沒人檢查。改用調整掃描時間或 Dev Drive。

### 加排除項目能解決 Defender CPU 佔用偏高嗎？

只適合範圍很小、只有可信工具寫入的資料夾，例如建置輸出目錄。微軟提醒排除項目會降低保護。下載、桌面和整顆磁碟都不要排除。


Canonical: https://mole.fit/tw/windows/blog/antimalware-service-executable-high-cpu
