【问题标题】:How to avoid HDD thrashing如何避免硬盘抖动
【发布时间】:2011-03-08 07:32:49
【问题描述】:

我正在开发一个使用大量内存的大型程序。该程序非常具有实验性,我一直在添加和删除大块代码。有时我会添加一个太消耗内存的例程,并且 HDD 驱动器将开始抖动,并且程序(和整个系统)将慢到蜗牛的速度。轻松关闭它可能需要 5 分钟!

我想要一种避免这种情况的机制。运行时过程,甚至是在运行程序之前要做的事情,例如“如果运行此程序,则存在 HDD 抖动的风险 - 现在中止以避免减慢到蜗牛的速度”。

有什么想法吗?

编辑:忘了说,我的程序使用了多个线程。

【问题讨论】:

  • 你不能捶打你没有的东西 ;)
  • 也许您应该了解一下为什么您的程序如此占用大量内存。你的程序是做什么的?您正在开发的东西可能需要比您当前基于 Windows XP 的系统所能提供的内存更多的内存(我猜您有 1GB,最多)。还有可能是你没有设计你的程序来很好地管理内存。需要时加载,不需要时卸载,以使程序在精简配置文件上运行,除非出于性能原因需要预加载。

标签: c++ visual-studio-2008 windows-xp


【解决方案1】:

您可以考虑使用 SetProcessWorkingSetSize 。这在调试时很有用,因为当您的应用程序内存不足时,它会因致命异常而崩溃,而不是将您的机器拖入颠簸的状态。

http://msdn.microsoft.com/en-us/library/ms686234%28VS.85%29.aspx

类似的问题

Set Windows process (or user) memory limit

【讨论】:

    【解决方案2】:

    当有多个线程或进程同时访问磁盘时,Windows XP 非常糟糕。这实际上是您在应用程序开始交换时所体验到的,因为操作系统正在写出一些页面而读入其他页面。 Windows XP(以及 Server 2003)在这方面完全是垃圾。这真是太可惜了,因为这意味着在这些系统上交换几乎是颠簸的同义词。

    您的选择:

    • Microsoft 在 Vista 和 Server 2008 中修复了这个问题。因此,请停止使用 9 年前的操作系统。 :)
    • 使用无缓冲 I/O 将数据读取/写入文件,并在应用程序中实现您自己的分页。像这样实现您自己的“交换”可以避免颠簸。

    在此处查看有关此问题的更多详细信息:How to obtain good concurrent read performance from disk

    【讨论】:

      【解决方案3】:

      我不熟悉 Windows 编程,但在 Unix 下,您可以使用 setrlimit() 限制程序可以使用的内存量。也许有类似的东西。目标是让程序在使用大量内存后中止,而不是颠簸。该限制将比机器上的总物理内存少一点。我猜想在 75% 到 90% 之间,但需要进行一些实验才能找到最佳设置。

      【讨论】:

      • 有一种方法(我决定把它作为答案)。
      【解决方案4】:

      您的程序可能会使用一些内存管理。虽然有一些程序确实需要一次将所有内容都保存在内存中,但很有可能只要有一点远见,您就可以重新设计您的程序以重用或丢弃您需要的大量内存。

      您的程序也会运行得更快。如果你使用了这么多内存,那么基本上所有内置的一级和二级缓存都可能溢出,这意味着 CPU 主要是在等待内存加载而不是处理你的代码指令。

      【讨论】:

      • 该程序确实必须在芯片上保存大量内存。它管理着一个大树结构,并在它周围不可预测地跳跃。
      • 您可能希望将处理保留在磁盘上并使用 b-trees。无论如何,此类程序的执行只会将内存放在磁盘上,并且 b 树经过专门优化以利用旋转磁盘提供的各种性能特征。将您的节点大小设置为适合磁盘块大小,并且您很可能只需要在任何给定时间在内存中保留大约一个块。添加一个 LRU 类型的缓存,您可以将该数量的块增加到 ~100,并一起跳过大量磁盘访问。
      【解决方案5】:

      我宁愿为你的程序应该在其上运行的计算机确定合理的最低要求,并且在安装过程中,如果没有足够的可用内存会警告用户,或者拒绝安装。

      每次他启动程序时都告诉他是荒谬的。

      【讨论】:

      • 这不是成品。我正在开发它。我需要这个警告供我自己在我的机器上使用。
      • @Mick:在这种情况下,如果您正在测试一段特别饥饿的代码,请在另一个机器上测试它,以免弄乱您的开发机器。
      • 虚拟机和进程工作大小限制在一个盒子上都非常有用。
      猜你喜欢
      • 1970-01-01
      • 2015-12-28
      • 1970-01-01
      • 1970-01-01
      • 2011-09-21
      • 2020-01-15
      • 2022-10-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多