什么样的事情可能会导致整个系统出现hover100s-1000s毫秒?

我正在开发Windows游戏,并且在渲染时,一些计算机会经历间歇性暂停(由于缺乏更好的术语,所以会出现“暂停”)。 在分析时,它们出现在代码中看似随机的地方。 最终我注意到,这不仅仅是我的过程受到了影响,而且(看似)系统上的每个过程都受到了影响。 我的应用程序中的所有线程都会一起挂钩。 在这些故障中,CPU利用率下降,似乎大多数进程都没有进展。

这使我相信这可能是一个操作系统或驱动程序问题,但它只发生在玩游戏(只在某些系统上)。 操作系统可能做什么样的操作将需要内核暂停所有的用户线程和阻塞。 某种I / O? 起初我想过分页,但是我的印象是只会影响单个进程,不是吗?

一些正在使用的系统:Windows,DirectX(3d),nVidia卡(未知如果在ATI上复制),使用重叠的io进行stream式传输

根据我的经验,这些types的问题通常归结为某种types的资源枯竭。

很容易猜测它“可能”到什么程度,但没有数据,这些仍然是猜测。

编辑 – 增加了一些关于实际计数器的更多细节,以及如何分析它们

计数器

要收集可以解决难题的数据,在Windows上需要收集perfmon数据。 一些你应该抓住所有进程(如果适用)的计数器是:

**Processor** /All Counters/All instances **Logical Disk**/All Counters/All instances **Memory**/All Counters/All instances **Network Interface**/All Counters/All instances **Paging File**/All Counters/All instances **Process**/All Counters/All instances **Processor**/All Counters/All instances **Server**/All Counters/All instances **Server Work Queues**/All Counters/All instances **System**/All Counters/All instances 

在我看来,这是所有可能的计数器的详尽清单,您可能会发现相关的数据。捕获所有这些数据是一个惩罚,它是大量的数据logging,所以你可能想尝试的子集你感觉到的柜台与你的情况最相关。

logging

运行perfmon时,您要select为性能计数器创建新的手动定义的数据收集器集。 将会有一个屏幕要求采样间隔。 您需要确保采样间隔足够小以捕获问题,但不能太小,以至于数据logging会压倒系统。

我会建议设置捕获手动启动/停止。 以便您可以开始捕获,重新生成问题,然后停止并分析日志。

分析数据

perfmon实用程序允许您单独查看每个计数器。 如果你知道你在找什么,这是有效的。 如果您不熟悉此过程或要查看哪个计数器,则可能会从使用自动分析工具(如PAL)中受益。 PAL是免费的,真棒。 从本质上讲,它有一套为每个计数器定义的阈值,它通过您的日志收集parsing并吐出一个HTML报告,显示您:
警告 – 任何接近阈值的计数器
严重 – 任何超过阈值的计数器

这可以是一个简单的方法来开始分析,并在任何标记为关键项目。

对问题陈述的最佳猜测/猜测

增加对可能的猜测。 这听起来像你可能在内存压力下。 这意味着物理空闲内存已经耗尽,操作系统需要读取或写入磁盘的内存内容。

能够validation上述情况的性能数据将显示内存利用率稳步上升,随后急剧下降。 与此同时,页面文件使用率以及本地磁盘I / O将会急剧上升。 再次,只是猜测没有任何硬数据(你需要)。

如果您设法挂起整个计算机,而不仅仅是您自己的进程或任何您正在使用的进程,那么这意味着Windows或驱动程序中的一个错误,因为用户模式代码不可能导致这种系统全挂。 这并不意味着错误不是由您自己的代码中的错误触发的 – 但是您的代码也可能完全没有bug。

你需要做的是缩小问题的范围 – logging所有线程的状态。 另外,您应该确认没有外部代码与您的stream程混淆。 有一个特定的罗技networking摄像头,其驱动程序将注入一个DLL到所有进程,并会损坏我知道的几个游戏,例如。 这种事情会以不可知的方式从外部破坏你的系统。

这听起来像是你崩溃/失速的GFX驱动程序。

最好的工具是缩小PIX和directx-debug运行时间。

您可以在“DirectX控制面板”中将DirectX运行时更改为debugging模式。 这应该会给你很多关于驱动程序调用或你提供的数据可能存在的问题的日志输出。 您应该尝试修复运行时正在logging的每个错误/警告,因为它完全依赖于驱动程序,因此在特定的Graphcs卡上如何处理这些问题。

如果这不显示任何可疑的事情,你可以尝试获取有关PIX发生的事情的更多信息。 但我很确定,第一步应该给你你需要的信息。