【问题标题】:Detect memory thrashing in Windows检测 Windows 中的内存抖动
【发布时间】:2017-04-29 16:01:27
【问题描述】:

我正在开发一个执行 CPU 和内存密集型计算的应用程序。可能出现的一个问题是我们并行运行了太多计算任务,导致机器使用太多内存,一切都停止了。解决方案很简单:并行运行更少的任务。然而,windows 没有提供内存压力过大的警告,有时我们的用户并没有意识到他们正在运行太多的任务。我们希望显示来自应用程序的警告以帮助我们的用户。

问题 1:提供这样的警告是个好主意,还是在概念上存在问题?

问题 2:检测内存不足导致性能不佳的好方法是什么?我正在考虑简单地查看仍然可用的物理内存百分比,并在该百分比变得非常低时发出警告。然而,这似乎有些武断,容易误报。

还有其他方法可以查看应用程序或窗口是否进行了大量内存交换,或者是否在垃圾收集上花费了大量时间?我正在 Windows 上运行 .NET 应用程序。

【问题讨论】:

  • 用户不可能注意到机器何时开始抖​​动。也不是看不到,用System.Management监控Win32Process,“Page faults/sec”。但误报是一个严重的风险。往往是一个草率的编程问题,但修复完全太便宜,不能花太多时间在上面。您的程序所需的 RAM 量必须是规定的最低系统要求的一部分,并且需要由您的安装程序进行验证。
  • 计算时,我们的用户一般不会使用机器,只是在等待计算完成,所以他们可能不会注意到任何抖动。此外,我们的应用程序不需要预定数量的 RAM。在实际运行之前确定计算需要多少 RAM 也非常困难。不过,我会研究监控“页面错误/秒”。
  • 海玛,别这样。告诉用户一些对他来说已经很明显的事情并不是一个有用的功能。这是构成项目灾难的那种东西,无法在规定的时间内完成它应该执行的任务的程序不是可用的程序。把你的精力放在它所属的地方,数据集大小和内存使用之间总是存在相关性。如果您还不知道,那么您必须花时间来衡量它。
  • 汉斯:你的回答无法理解。 “数据集大小和内存使用之间总是存在相关性。”你到底想告诉我们什么?

标签: .net windows memory


【解决方案1】:

如果您用于计算的线程数超过 CPU 内核数(例如 N),您已经减慢了计算速度,因为操作系统会花费时间来切换线程上下文,但同时只有 N 个线程在工作。您需要以某种方式将进行大量计算的线程数限制为 N 或 N - 1(1 个线程用于 GUI 主线程)。

内存怎么样,您可以在新的计算例程开始之前检查可用内存量,如果没有足够的内存则延迟它 - 例如将此类任务放入队列中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-18
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多