【问题标题】:Profiling disk access分析磁盘访问
【发布时间】:2010-10-20 21:55:16
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c++ multithreading mfc profiling disk


    【解决方案1】:

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

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

    对于具有读取和写入功能的许多线程 - 许多磁盘在面对具有后台写入的读取时性能很差。如果您有不同的线程对磁盘上的随机位置执行大量磁盘 I/O,您可能最终会饿死某些请求。

    【讨论】:

      【解决方案2】:

      帮助您解决 (2):

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

      希望这会有所帮助....

      【讨论】:

        【解决方案3】:

        我会做的是,如果您不能同时暂停所有线程并检查它们的状态,请专注于其中一个并暂停它,而它“非常慢”。 This is a little known but effective technique.

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

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

        【讨论】:

          猜你喜欢
          • 2011-05-23
          • 2013-02-04
          • 2011-12-07
          • 2021-08-09
          • 2016-04-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-19
          相关资源
          最近更新 更多