【问题标题】:Why is Windows Defender delaying the start of our piece of software?为什么 Windows Defender 会延迟我们软件的启动?
【发布时间】:2021-12-27 06:49:34
【问题描述】:

我正在尝试帮助 SuperCollider community 尝试了解我们如何防止 Windows Defender 在最新的 Windows 10 上延迟执行其中一个可执行文件。

original github issue can be found on github

这是测试用例:

  1. download the latest version of SuperCollider for Windows x64 (3.10.3)

  2. 安装它

  3. 重启电脑

  4. 打开“cmd”并启动scsynth.exe

cd "\Program Files\SuperCollider-3.10.3"
scsynth.exe -u 57110

您必须等待 50 到 60 秒才能看到 scsynth 输出,该输出应该以类似

的内容开头
Device options:
  - MME : Mappeur de sons Microsoft - Input   (device #0 with 2 ins 0 outs)
[...]
SuperCollider 3 server ready.
  1. 请注意,如果您退出 scsynth.exe 并再次运行该命令,scsynth.exe 会立即启动,不会有任何延迟

  2. 现在将 scsynth.exeprocess 放入 Windows Defender 排除列表(有关如何访问此排除列表的信息,请参阅 this article

  3. 重启

  4. 打开“cmd”并启动scsynth.exe

cd "\Program Files\SuperCollider-3.10.3"
scsynth.exe -u 57110

现在scsynth.exe 马上开始。

此行为在添加 Windows Defender block at first sight 功能时开始。

这给 SuperCollider Windows 用户带来了很多问题。

谁能帮我们解决这个问题?

【问题讨论】:

  • 我曾经使用 Process Monitor(来自 Sysinternals/Microsoft)等工具来调查此类问题。它可以记录进程正在执行的所有 i/o、注册表以及进程和线程操作。比较这两种情况的日志可以让您很好地了解其他程序可能如何干扰。现在,我通过 UIforETW 使用 ETW(Windows 事件跟踪)来记录跟踪,然后使用 Windows 性能分析器对其进行分析。同样的处理还有更多细节需要深入研究。
  • 谢谢阿德里安,我会试着弄清楚这些工具发生了什么。
  • 并非如此。这是 Windows Defender 的一个众所周知的问题。他们在最新版本的 SC 中添加了警告。它只发生在第一次库类编译时。它需要例如在我的机器上需要 20 秒,而重新编译需要 1-2 秒。索引帮助文件也是如此。 Windows Defender 有一些特殊的技巧可以避免像这个商业软件那样减速(即地狱白名单)。请参阅关于 Rust 的讨论youtu.be/qbKGw8MQ0i8?t=2326。基本上,MS 需要轻轻地请求将 SC 列入白名单。
  • 在更精简的安装中(没有太多额外的夸克/插件),866 个 SC 类文件在第一次编译时需要 10 秒。每个文件几乎正好 12 毫秒,就像那个 Rust 家伙的谈话一样......而且编译后的帮助文件被写入C:\Users\<YourUserName>\AppData\Local\SuperCollider,因此也需要排除它以更快地启动 sclang。
  • 谢谢@fizz!我在最新版本的 SC 中添加了警告 :) 如果有人知道请求 MS 将 SC 添加到白名单的程序,我在!

标签: windows supercollider windows-defender


【解决方案1】:

我猜你希望微软在这里给出真正的答案,但这可能会在 cmets 中丢失,对于 SC 用户注册作为答案可能是足够有用的信息,所以:

经过更多的实践经验,当您从非系统位置运行 SC 时会发生什么(即不安装到 Program Files,也可能不安装到系统驱动程序)稍微复杂一些。对于非系统位置,Defender 仍会以慢速启动速度对其进行扫描,但每次机器启动只扫描一次。而如果 SC 安装到 Program Files,它会在每次 SClang 进程启动时被扫描(但不会在同一个 sclang 进程运行时重新编译类库),除非手动添加 Defender 异常路径。

据我所知,以上内容仍然启用了“一见钟情”,因为 MS 说“要禁用一见钟情,请关闭云提供的保护或自动提交样本。”而且我仍然启用了这两个功能。

因此,如果您不经常重启您的 PC,而只是使用挂起/恢复,那么如果您将 SC 安装到非系统位置...用于常规用途,这不是什么大问题。毫无疑问,它仍然为新 SC 用户提供了糟糕的开箱即用体验。


实际上,微软今天证明了上述理论有点错误。我刚刚进行了一次 Windows 更新,导致我的机器重新启动,所以我完全预计下一次 SC 启动会再次变慢......但事实并非如此!

因此,Defender 似乎保留了一个持久最近使用和扫描位置的缓存,这意味着它保存在磁盘上。所以下一个问题是什么实际上可能使这个缓存失效。最后一次重新启动,没有导致长时间扫描,仅用于 Windows 每月更新,但它不包括 Defender 引擎或定义更新。所以我认为 Defender 缓存可能会在一些更具体的事件上失效,而不是任何重启。也许有一些直接基于时间或 LRU 的条目到期,但很难测试这一点,因为 Defender 经常自我更新会造成混淆。

是的,在对后一个问题进行快速搜索后,Defender indeed 在磁盘上保留了与其先前扫描相关的一些信息的持久缓存。

打开实时保护后,大约 20-30 分钟后,它会在此位置创建数百/数千个文件: C:\ProgramData\Microsoft\Windows Defender\Scans\History\Store

这些文件大多为 1kb 或 2kb。在 24 小时内,我们最终得到了大约 950,000 个文件,并且占用了 30 GB 的空间。

顺便说一句,那些 Defender 历史文件过多的问题在当时(2021 年 5 月)得到了修复

此问题目前是一个已知问题,该修复程序将在本周四发布所有版本。 RCA 是 MsMpEng.dll 的工程师有一些问题并导致此文件夹中的大量文件。受影响的引擎版本是 18100.5。

但肯定有一些扫描历史信息仍然保存在磁盘上,这确实在一定程度上缓解了在常规使用中重新扫描 SC 等程序的问题,尽管不是在不合时宜的情况下。刚安装 SC 时的盒子场景。


除此之外:有点搞笑,但it appears Defender 扫描速度变慢有时会影响微软自己的产品。

programming solutions的领域:

据我所知,只要 Windows Defender(可能还有其他 A/V 扫描仪)在运行,就无法让 Windows I/O API 始终保持快速。您可以禁用 A/V 扫描(后果自负)。但是Mercurial 使用的技巧(后来被 rustup 等其他工具效仿)是使用线程池来调用 CloseHandle()。即使您在单个线程上执行所有文件打开和写入 I/O,并且仅使用后台线程池调用 CloseHandle(),您也可以看到写入文件的时间加快了 3 倍以上。理想情况下,任何在 Windows 上创建或改变几百个文件的软件都应该采用这种优化。这包括版本控制工具、安装程序和存档提取工具。有趣的事实:rustup 可以比开源和商业快速提取/复制工具更快地在 Windows 上提取 tar 文件,因为它使用了这个技巧等等。我相信 Windows 上的 rustup 实际上在提取 tar 档案方面比在 Linux 上更快!

还有来自 rustup 开发人员的 youtube 演讲,例如 this one

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    • 2020-05-07
    • 2019-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多