![语境](https://linux22.com/image/1547622/%E8%AF%AD%E5%A2%83.png)
重现:标题有点神秘,所以要查看我的问题是什么,请运行“Furmark”或“BOINC”(GPU 加速),然后开始打开 Windows。一切都变慢了,Windows 部分绘制得很慢,等等。
- 打开新的 Explorer 需要更长的时间。
- 您几乎可以看到窗口被缓慢地绘制出来。
问题是:什么原因导致窗口/元素绘制速度缓慢,以及如何跟踪和解决这个问题?
什么时候会发生:当我大量执行多任务时。当我启动 PC 时,它非常快速。即使我给它增加负载,它也不会变慢。只有当我开始处理一个项目时,打开 3-4 种负载。
- 内存使用情况正常,24GB 中大约使用了 15GB。
- 中央处理器大部分时间处于空闲状态 / 加速和减速;i7 4770HQ 启用了 HT。
- 温度很好,没有节流。
- GPU1和GPU2都处于空闲状态,且都接收很低的负载。
- 这集成 GPU有 128MB 专用 VRAM,2GB 共享,但已使用约 10%。
硬件:
- 贮存:2x240GB SSD;1x1TB 7200rpm 2.5 英寸托架;1x2TB 7200rpm 外置 USB3 底座;1x1TB 7200rpm 2.5 英寸外壳;(Mac 用户请注意)
- 中央处理器:i7-4770HQ - 库存值 - 启用 HT。
- 内存:2x4GB + 2x8GB DDR3。
- 母板/型号:华硕 G750JZ
- GPU:英特尔 HD 4600(512MB 华硕 TurboMaster)+ Nvidia GTX880M(4GB vram)
操作系统:Windows 10 - 10.0.16299 内部版本 16299
我以为可能是 Chrome 和 Vivaldi(以及其他 Chrome/Blink 引擎应用程序)占满了 VRAM,然后导致速度变慢,但正如我所说,任务管理器没有任何证据就回来了。当这种情况发生时,游戏也能正常运行,因此在这种情况下不会出现明显的 3D 性能损失。
答案1
Windows 10 Fall Creators 更新默认启用控制流保护 (CFG)至所有应用程序。禁用此 CFG 强制还可以提高性能。为此,请打开Windows Defender 安全中心,现在选择应用程序和浏览器控制并点击“漏洞保护设置”
现在将 CFG 的值设置为Off by Default
现在重新启动,Windows 10 应该会更快。
答案2
语境
我的笔记本电脑也遇到了同样的问题。我总是同时处理很多任务,而且我有一个有些功能强大的笔记本电脑。我进行的最新基准测试显示,这款机器与大多数售价 300-400 欧元且内存少得多的廉价笔记本电脑相比毫不逊色。
- Core i7 3940XM——基准测试正常(CPU-Z 等)。
- 双通道 16 Gb RAM DDR3
- SSD SATA 三星 870 EVO - 基准测试正常,500 Mb/s。
事实上,令我惊讶的是,在“冷启动”时,计算机会比较快。但是我执行的多任务越多(通常同时打开 6-7 个程序,因为我有监控程序和自动化程序),它就会变得非常慢和不稳定。
症状
当你执行多任务时,打开窗口非常慢。在 Chrome 中打开新标签很慢,在窗口之间切换很慢而且很不流畅。感觉就像 CPU 降频到 800 Mhz,使用电池供电,除了一个核心之外所有核心都关闭了。
但有趣的是,基准测试结果还不错,没有显示任何 CPU 或 GPU 降频的迹象。任务管理器没有显示高 CPU 使用率或磁盘使用率,内存消耗可能很高,但即使关闭大多数程序后,PC 仍然会很慢。
假设
我觉得 Windows 中有一个错误(或者是一个非常糟糕的编程算法),好像屏幕上显示的 GUI 对象越多,Windows 算法就越糟糕/未优化,以至于它会因 GUI 对象数量过多而滞后。
我做了一些研究,了解屏幕上对象数量的负载的最佳方法是进入任务管理器并显示一个名为“GDI 对象”的特殊列。在一个没有这个问题的用户帐户上,总共有3200 GDI objects
。在另一个有这个问题的用户帐户上,总共有8400 GDI objects
。不幸的是,任务管理器中这与 CPU 或 GPU 负载无关。CPU 可以完全空闲,但计算机会滞后。
更新这篇文章最初写于 2017 年左右。2023 年,我仍然遇到同样的问题,所以我做了更多的研究。我的结论是,这是由于 GDI 对象泄漏和 GDI 对象过剩的混合造成的。Windows 中的每个用户会话都会获得最大数量的 GDI 对象。会话就像虚拟化的一样,如果不是,它们是有限的。无论背后的真正原因是什么,当用户空间达到 10000 个 GDI 对象(默认情况下)时,它就会开始节流,这是一种图形对象的“速率限制”,因此会导致速度缓慢和图形故障,尽管 CPU/GPU/Ram 负载正常。3D 游戏(即具体而言,而不是 2D 游戏)很特殊,因此即使达到此限制,3D 游戏也会全速运行。这将主要影响桌面性能。有一些注册表项可以增加此值:GDIProcessHandleQuota
是一个例子。但请注意,这些键有时会在每个主要操作系统版本中发生变化。从 Windows 10(已确认)以及可能的 Windows 11 开始,这些密钥都是有效的。
解决方案
- 更改注册表项。这是第一个解决方案,也是遇到同样问题的人可以使用的解决方案。问题可能只是每个会话的最大 GDI 对象数量是有限的。当用户达到极限时,Windows 只会减慢桌面对象的渲染速度,这是一种速率限制,换句话说,当 CPU/GPU/Ram 负载(和基准测试)正常时。有一些键可以增加限制(需要进一步测试,我暂时没有测试它们),例如
GDIProcessHandleQuota
。这个假设解释了为什么创建新的用户会话、重新启动或监视 GDI 对象的数量有效。删除 CFG(和同级)也有效,因为它可以在某种程度上减少重度使用中的系统负载,使系统即使在“速率限制”下仍然感觉敏捷。关键是:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows USERProcessHandleQuota GDIProcessHandleQuota USERNestedWindowLimit
相同的键:
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion\Windows
然后更改密钥:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\内存管理SessionPoolSizeSessionViewSize
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\SubSystems Windows,增加“SharedSection”的中间值
- 使用 GDIView 进行监视。通过使用 Nirsoft GDIView,有一种方法可以监视此行为,但是有些行为我不明白 GDIView 的用途(任务管理器显示的内容并不严格等于 GDIView 显示的内容)。这是一个简单的 Windows 命令行示例,用于计算 GDIView 的 GDI 对象总量:
GDIView.exe /scomma %temp%\data.txt
set a=0
for /f "tokens=17 delims=," %i in ('type %temp%\data.txt') do set /a a+=%i
echo %a%
禁用 CFG。显然,我禁用了 CFG。这给了我一点性能提升,但问题仍然存在。
创建新的用户帐户。到目前为止,这是效果非常好的。当有大量对象需要显示时,Windows GUI 显示代码部分似乎会严重不堪重负,但这是有效的每个用户会话。如果您创建一个新的用户会话,并使用一个会话执行繁重任务(重度自动化、多个 Firefox/Edge/Vivaldi/Chrome 选项卡),另一个会话执行轻量级任务,则问题就完全解决了。
附言:像 Windows XP 这样的旧操作系统似乎没有像 Windows 10/11 那样出现这个问题。这似乎与微软在 Windows 10/11 中实现 GDI/DirectDraw 的方式有关。也可能是 Windows XP 的图形密集型桌面要少得多,因此在执行密集型桌面任务时性能更好。
答案3
我没有足够的声誉来对接受的答案发表评论,但应该注意到不能简单地“为所有应用程序启用 CFG”。
必须编译二进制才能/guard:cf
真正利用它。