# Antimalware Service Executable 占用 CPU 高，Defender 在做什么

任务管理器里的“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，开始录制后重复那项工作，按回车停止：

```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 开发缓存](/zh/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 占用高怎么查](/zh/windows/blog/windows-high-cpu-usage)，磁盘一直 100% 可以看 [任务管理器里磁盘 100%](/zh/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/zh/windows/blog/antimalware-service-executable-high-cpu
