代码之家  ›  专栏  ›  技术社区  ›  derdo

达到内存限制会减慢.NET应用程序的运行速度

  •  4
  • derdo  · 技术社区  · 15 年前

    我们有一个64位C/.net3.0应用程序,运行在64位Windows服务器上。应用程序有时会使用大量可用的内存。在某些情况下,应用程序停止分配额外的内存,并显著降低速度(慢500倍以上)。当我从任务管理器检查内存时,使用的内存量几乎没有变化。应用程序继续运行非常缓慢,并且从不发出内存不足异常。 有什么想法吗?如果需要更多数据,请通知我。

    5 回复  |  直到 15 年前
        1
  •  5
  •   Aaronaught    15 年前

    你可以试试 enabling server mode for the Garbage Collector . 默认情况下,所有.NET应用程序都在工作站模式下运行,GC尝试在保持应用程序运行的同时进行扫描。如果打开服务器模式,它会暂时停止应用程序,以便更快地释放内存(更多),并且它还为每个处理器/核心使用不同的堆。

    大多数服务器应用程序在使用GC服务器模式时都会看到性能的提高,特别是在它们分配了大量内存的情况下。缺点是当你的应用程序开始耗尽内存时(直到GC完成),它基本上会停止运行。

    * 要启用此模式,请将以下内容插入 app.config web.config :

    <configuration>
       <runtime>
          <gcServer enabled="true"/>
       </runtime>
    </configuration>
    
        2
  •  5
  •   Oded    15 年前

    当您达到物理内存限制时,操作系统将开始分页(即,将内存写入磁盘)。这确实会导致你看到的那种减速。

    解决?

    • 添加更多内存-只有在达到新的内存限制后,这才会有帮助。
    • 重新编写应用程序以减少内存使用
    • 找出是否有内存泄漏并修复它

    如果内存不是问题所在,那么您的应用程序可能很难达到CPU?你看到CPU接近100%了吗?如果是这样,请检查正在反复迭代的大型集合。

        4
  •  2
  •   Andras Zoltan    15 年前

    其他答案中提到了很多好东西。不过,我要把我的两个便士(或美分——取决于你来自哪里!)不管怎样。

    假设这确实是一个64位的过程,如您所说,这里有几个调查方法…

    您要检查哪些内存使用情况?内存使用还是VMEM大小?vmem大小实际上很重要,因为它适用于分页和非分页内存。如果这两个数字相差很远,那么内存的使用确实是导致速度减慢的原因。

    当事情开始变慢时,整个服务器的实际内存使用情况是什么?减速是否也适用于其他应用程序?如果是这样,则可能存在内核内存问题,这可能是由于大量磁盘访问和低级别资源使用(例如,创建20000个互斥体,或通过使用win32 hbitmap的代码加载几千个位图)。您可以在“任务管理器”上看到一些这方面的指示(尽管Windows 2003的版本比2008的版本更能直接提供信息)。

    当你说这个应用程序的速度变慢了,你怎么知道?你用的是大字典还是大单子?难道这不仅仅是因为内部数据结构变得越来越大,从而使任何内部算法正在执行的工作变得复杂化吗?当你得到巨大的数字时,一些算法会开始变得更慢。

    当应用程序以全速运行时,它的CPU负载是多少?实际上和减速发生时一样吗?如果CPU使用量随着内存使用量的增加而减少,那么这意味着无论它在做什么,操作系统都需要更长的时间来完成,这意味着它可能对操作系统施加了太多的负载。如果CPU负载没有区别,那么我猜是内部数据结构变得如此之大,以至于减慢了算法的速度。

    我当然会考虑在应用程序上运行一个Perfmon——从一些.NET和本机内存计数器、缓存命中和未命中以及磁盘队列长度开始。在应用程序的整个过程中运行它,从启动到它开始像一只哮喘乌龟一样运行,您可能也会从中得到一些提示。

        5
  •  1
  •   Carlos    15 年前

    浏览了其他答案后,我想说有很多好主意。有一个我没看到:

    获取一个内存分析器,例如Scietech的memprofiler。它会告诉你分配的是什么,按什么分配,它会显示出整个n片骰子。

    它还有视频教程,以防你不知道如何使用它。在我的案例中,我发现我有不使用(…)的IDisposable实例。