我们注意到一个问题:当服务器 CPU 负载较高时,与服务器的远程桌面会话将会冻结。
环境:
- VMWare ESX 4.0u1。
- 客户操作系统是Windows Server 2008 R2(这是冻结的服务器)。
- 客户操作系统有 MS SQL Server 2008 R2 (10.50.4000) 和作为 Windows 服务运行的内部应用程序。
- 远程桌面客户端通常位于 Windows 7 笔记本电脑上。
将 RDP 连接到服务器可以正常工作。当服务器加载时,会发生以下情况:
- 现有的 RDP 会话变得无响应并似乎冻结 - 至少屏幕没有更新。如果任务管理器正在运行,它会变得静态,因为您不再看到它每隔几秒钟更新一次统计信息。您可以单击按钮或其他东西,视觉响应将延迟几分钟。
- 通过 vmware 管理工具进行的控制台会话似乎会以同样的方式冻结。(所以基本上它似乎会影响 GUI/交互性)。
- 在此状态下尝试通过 RDP 连接将花费很长时间,并且通常只会显示黑屏,而无法解析实际的 GUI。
- 其他服务继续响应!如果从另一台机器上的浏览器访问服务器上运行的 Web 应用程序,它将响应相当快,并且几乎不受高负载的影响。使用 WMI 访问“冻结”服务器的远程进程监视器也继续工作。
这种场景中的负载通常由进程 A 执行顺序(无线程)计算和对进程 B 的调用组成。当接收到这样的调用时,进程 B 通常会进行数据库调用,然后进行一些计算,然后将结果返回给进程 A。
在远程进程管理器中,我们可以确认进程 A、B 和 SQL Server 总共占用了 100% 的 CPU,但由于进程之间的顺序调用,实际上在任何给定时间点都不应该有多个进程准备运行。这些进程是 Windows 服务,不会以任何方式与 GUI 交互。
这就像当其他进程造成负载时,Windows 会完全剥夺 GUI 组件的 CPU 周期。
我做了一些实验只是为了检查 - 例如,如果我在笔记本电脑上运行三个忙循环的副本,它们每个都会占用 33% 的 CPU,总数将报告为 100%,但 Windows GUI 总体上仍然会完全响应。
是什么原因导致服务器 GUI 在负载下如此冻结,以及如何才能阻止它发生这种情况?
虚拟机有 6GB RAM,SQL Server 限制为 2GB RAM,其他相关服务通常每个服务少于 200MB。因此,似乎不是内存耗尽。
这些服务以正常优先级运行,但我还将它们降低至“低于正常”,但行为没有实际变化。
更新 1
为了缩小问题范围我尝试了这个:
- 在服务器上,以正常优先级运行一个自定义进程,该进程只是一个繁忙的循环。正如预期的那样,这会使 CPU 达到 100%。在此期间系统对于交互用户仍然响应良好。
- 向 SQL Server 发出 CPU 和数据密集型查询(
select * from dbo.Table where Name like '%flarp%'
在同一个命令批处理中重复 6 次)。该表有 160 万条记录。没有其他进程占用大量 CPU 资源。执行查询时,GUI 完全冻结,直到查询批次完成。我将 SQL Server 优先级设置为 LOW 并重复。GUI 仍然冻结。 - 同时尝试上述两种方法。我首先启动了 CPU 循环(处于正常优先级),它占用了 100%。不久之后,当我启动 SQL 查询(在低优先级 SQL Server 中)时,GUI 完全冻结。远程进程管理器指示 SQL Server 尽管优先级较低,但 CPU 占用率为 100%,而我的 CPU 循环(处于正常优先级)在查询完成之前为 0%。因此,尽管 SQL Server 的优先级较低,但它完全耗尽了纯 CPU 循环。