分析磁盘访问

时间:2009-04-21 18:36:18

标签: c++ multithreading mfc profiling disk

目前我正在开发一个读取和写入磁盘的MFC应用程序。有时这个应用程序运行得非常快,有时候它很慢。我猜这是因为涉及磁盘访问,因此我想对其进行分析。这些是这方面的一些问题:

(1)。目前我正在使用AQTime 分析器来分析应用程序。有没有人试过使用它来分析磁盘访问?或者还有其他可用的工具吗?

(2)。我应该关注哪些最重要的磁盘参数?

(3)。如果我有多个线程试图从磁盘读取和写入数据会影响性能吗?即最好是对磁盘进行单线程访问?

3 个答案:

答案 0 :(得分:2)

您可以使用Windows Performance Toolkit。您可以为磁盘I / O事件启用跟踪提供程序,并查看每个事件的I / O时间和磁盘服务时间。它确实有一点学习曲线。这也可以让您确定哪个文件I / O实际上导致实际访问磁盘,而不是由缓存管理器处理。

最重要的参数是磁盘服务时间和队列长度。磁盘服务时间是磁盘实际用于服务请求的时间。队列长度表示您的磁盘请求是否在其他请求后备份。

对于许多线程w / read&写道 - 许多磁盘在使用后台写入读取时表现不佳。如果您有各种线程对磁盘上的随机位置执行大量磁盘I / O操作,则可能会使某些请求无法使用。

答案 1 :(得分:1)

为您提供帮助(2):

  1. 尝试批量写入磁盘以避免许多小写调用。当您完成刷新缓冲区时,请调用commit。 commit(又名fsync)是一项昂贵的操作,所以当有很多小写时,它会更加如此。
  2. 在Windows文件句柄上,您可以试用 FILE FLAG WRITE THROUGH 来提高写入速度。假设不必使用此标志调用句柄。
  3. 如果您正在写入磁盘的数据也将通过读取进行访问,请考虑首先写入内存结构,从结构中读取另一个线程以将其写入磁盘。这有助于避免从刚刚写入的磁盘中读取数据的调用。
  4. 希望这会有所帮助......

答案 2 :(得分:0)

我要做的是,如果你不能同时暂停所有线程并检查它们的状态,那就把注意力集中在其中一个线上并暂停它,而它是“该死的慢”。 This is a little known but effective technique.

由于它与它可能的速度相比非常慢,无论它等待它的时间大概是等待99%的时间,所以当你暂停它时你会看到它。无论是一次大的等待还是无数的小小的等待都是如此。看看整个调用堆栈。罪魁祸首可能在堆栈中间的某处。

如果您不确定,请暂停两到三次。罪魁祸首将在所有堆栈样本上。