6

我们有一个高流量的网站,它产生了大量的 I/O。在 10 分钟内,它已经读取了超过 10 GB 的数据(在任务管理器中看到有问题的 w3wp)。对于内存和应用程序挂起,我一直在成功使用 WinDbg。但我不知道如何在负责最高 I/O 的进程中找到对象/方法。

这甚至可能吗?

编辑 问题是:有没有办法在 .NET 程序集中分析 I/O 操作,比如:按最高磁盘 I/O 排序的线程列表(或类似的东西可以帮助我在哪里查看)

4

3 回答 3

6

ANTS 性能分析器

我已经使用这个工具取得了巨大的成功 - 处理查找导致大容量网络场上约 512GB 内存在 5-10 分钟内被占用的特定指令。听起来和你的情况非常相似。

现在,现实一点——它不会神奇地解决你的问题。它仍然需要大量的设置、彻底的分析和侦查工作。但是这个工具确实把问题从“几乎无法解决”变成了“几天之内就能解决”。

更新:

正如我在评论中提到的(Ben Emmett 回应),我们可以使用 ANTS 来监控内存、文件系统句柄——几乎任何资源消耗,并深入调用堆栈以查看特定例程的效果。

于 2013-02-25T01:19:14.433 回答
1

我想出了这个工具AppDynamics Lite,它以可视化的方式显示您的应用程序调用成本和性能。它可能会帮助您找出哪些函数正在执行最昂贵的 IO 操作。

报价;

通过响应时间、吞吐量、异常率和垃圾收集时间等关键指标以及 CPU、内存和磁盘 I/O 等关键系统资源来了解 CLR 的运行状况。

值得一试,因为它可以试用/免费 30 天。希望能帮助到你。Ps:我不以任何方式隶属于 AppDynamics。

于 2013-03-06T16:07:04.253 回答
1

您可以使用 Windows 8 中的(免费)Windows Performance Toolkit,它也可以在 Windows Vista 及更高版本上运行。在那里,您可以打开系统范围的分析,以立即查看所有进程中发生了什么。无需仪器。只需重新启动一次即可设置由 WPRUI.exe 自动完成的神秘注册表项。

使用 XPerf,您可以启用 IO Init 堆栈遍历,以便为每个启动的 IO 获取调用堆栈。唯一的问题是 64 位进程的堆栈将被破坏,这意味着您只会看到代码的 BCL 方法上方的第一个方法,因为操作系统的堆栈遍历功能中存在 Windows 7 错误。

一种解决方法是对您的程序集进行 Ngen 或移动到 Server 2012 或切换到 x86 进行分析以查看更深入的调用堆栈。

即使没有任何调用堆栈和文件名以及硬盘使用了多长时间,您也会看到所有文件 IO 和 CPU 活动。这应该会给你很好的信息,你的应用程序的哪一部分导致了磁盘 IO。即使没有完整的堆栈,您也应该能够从部分调用堆栈中查明您的问题。

该工具将为您提供比任何商用分析器更多的洞察力,但您需要学习如何使用它。由于调用堆栈不会在您的代码或用户模式中结束,而是在内核中,您还可以确定例如病毒扫描程序是否导致显着的 IO 延迟。但是你需要知道你的处理器是如何工作的。这个工具集最初是针对内核开发者的,它解释了为什么你会看到这么多无用的列。

在下图中,您可以看到堆叠的文件 IO 和 CPU 消耗。当您在磁盘 IO 图表中选择高 IO 文件时,它将在 CPU 消耗中突出显示在 IO 处于活动状态时同时进行的所有相关调用堆栈。通过这种方式,您可以直接从 IO 导航到可能被阻塞的线程。

在此处输入图像描述

于 2013-03-07T06:48:19.017 回答