【问题标题】:App pool memory usage is not coming down in IIS 6IIS 6 中的应用程序池内存使用量没有下降
【发布时间】:2013-03-17 08:50:12
【问题描述】:

我有一个页面简单的网站。单击一个按钮,我们执行一个 MDX 查询,该查询返回大约 200,000 行和 20 列。我使用以下代码使用 Microsoft.AnalysisServices.AdomdClient 库执行 MDX 查询(版本为 10.0.0.0 运行时版本 v2.0.50727)

        var connection = new AdomdConnection(connectionString);
        var command = new AdomdCommand(query, connection)
        {
            CommandTimeout =  900
        };

       connection.ShowHiddenObjects = true;
       connection.Open();
       var cellSet = command.ExecuteCellSet();
       connection.Close();

当查询正在执行时,应用程序池的内存使用率变得非常高。

这是服务器上内存使用的初始状态:

运行查询后:

我不确定为什么内存使用率会如此之高并且一直如此。我在本地机器上使用了探查器,一切看起来都不错。

我必须找出哪些选项保留在内存中?

有什么明确的方法可以清除这些记忆吗?

ADOMD 库是否总是消耗这么多内存?我们有任何替代选项来使用 C# 执行 MDX 查询吗?

当内存使用量如此之高时,IIS 停止处理其他查询,并且托管在同一 IIS 服务器上的应用程序(使用不同的应用程序池)也会受到影响,并且请求需要更长的时间才能执行。

【问题讨论】:

  • 你找到它了吗?

标签: asp.net-mvc-3 performance memory-leaks iis-6 application-pool


【解决方案1】:

我最近开始在我们遇到类似问题的地方。

您可以通过以下方式确定哪些内存是:

  1. 下载诸如 Redgate 的 Ants 分析器之类的内存分析器,这样您就可以查看应用程序池中发生的情况。但是,只有 2 周的试用期,但可以让您了解最初的情况。

  2. 获取CLR Profiler,这个工具可以下载,让你可以看到内存的快照,这样你就可以知道CLR内存中有什么。

需要注意的一点是大对象堆,根据设计,CLR 不会压缩 LOH 中的空间,因此如果将对象放在那里,则可能导致内存碎片。大于 85000 字节的对象会放在那里。一个例子是大型对象列表。

我尝试做的一件事是创建一个专门的集合,如复合列表,它基本上是一个列表列表,然后由于每个组件列表小于 85000 字节,它将保留在正常堆中,并且整个对象都没有被放入 LOH。其他人也提到了这种方法。

也就是说我仍然有问题,因为综合列表并没有真正解决问题,所以还有其他因素需要解决。我对此感到困惑,并认为应用程序池的内存转储并使用 winDbg 进行分析可能会提供进一步的答案。

还有一点,虽然我确信它不是问题的根源,但它建议为您的连接使用 using 语句,否则如果您的 close 语句之前有异常,那么它可能不会被关闭。

【讨论】:

    猜你喜欢
    • 2017-11-26
    • 2013-03-07
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多