【问题标题】:Estimate/Calculate Session Memory Usage估计/计算会话内存使用情况
【发布时间】:2009-10-05 07:37:30
【问题描述】:

我想估计我的 ASP.NET Web 应用程序中服务器上每个会话使用的内存量。几个关键问题:

  • 为每个 Session 实例分配了多少内存?
  • 每个变量的内存使用量是否等于其给定的地址空间(例如 Int32 的 32 位)?
  • 具有可变地址空间的变量(例如 String、Array[]s)呢?
  • 自定义对象实例(例如保存各种其他东西的 MyCustomObject)呢?
  • 是否为每个变量添加了任何内容(例如,将 Int32 变量的地址绑定到会话实例)增加了每个变量的开销?

希望能帮助我弄清楚如何准确预测每个会话将消耗多少内存。谢谢!

【问题讨论】:

  • 您是否已经构建了应用程序,或者只是打算使用会话状态?为什么是会话状态?有更好的技术可供考虑。
  • 如果我需要跟踪状态怎么办?客户端?
  • 我会使用缓存,它更灵活。
  • 缓存是不稳定的,不受用户限制。
  • 将用户ID添加到密钥或其他方式是否有问题?

标签: c# asp.net session memory-management


【解决方案1】:

HttpSessionStateContainer 类有 10 个局部变量,因此大约是 40 个字节,加上对象开销的 8 个字节。它有一个会话 id 字符串和一个项目集合,因此当项目集合为空时,这大约是 50 个字节。它有更多引用,但我相信这些是对所有会话对象共享的对象的引用。因此,总而言之,每个会话对象大约需要 100 个字节。

如果您将 Int32 之类的值类型放入会话的项目集合中,则必须将其装箱。 8 字节的对象开销达到 12 字节,但由于内存管理器的限制,它不能为对象分配少于 16 字节的空间。使用四个字节来引用对象,一个 Int32 需要 20 个字节。

如果你把一个引用类型放在 items 集合中,你只存储引用,所以只有四个字节。如果它是一个文字字符串,它已经被创建,所以它不会使用更多的内存。创建的字符串将使用 (8 + 8 + 2 * Length) 个字节。

值类型数组将使用 (Length * sizeof(type)) 加上更多字节。引用类型数组将使用 (Length * 4) 加上几个字节作为引用,并且每个对象都是单独分配的。

自定义对象大致使用其成员大小的总和,在某些情况下加上一些额外的填充,再加上 8 字节的对象开销。包含 Int32 和布尔值(= 5 个字节)的对象将被填充到 8 个字节,加上 8 个字节的开销。

因此,如果您将一个包含 20 个字符和三个整数的字符串放入会话对象中,则将使用大约 (100 + (8 + 8 + 20 *2) + 3 * (20)) = 216 个字节。 (但是,会话项目集合可能会分配 16 个项目的容量,因此您使用的是 64 个字节,其中 16 个,因此大小将是 264 个字节。)

(所有大小都在 32 位系统上。在 64 位系统上,每个引用是 8 个字节而不是 4 个字节。)

【讨论】:

    【解决方案2】:

    .NET Memory Profiler 是你的朋友:

    http://memprofiler.com/

    您可以免费下载试用版并运行它。尽管这些东西的安装和运行有时会变得复杂,但我发现连接到正在运行的 Web 服务器并检查它在内存中保存的所有对象非常简单。

    【讨论】:

      【解决方案3】:

      您可能可以使用Performance CountersCustom Performance Counters 获得其中的一些。我从未使用 ASP.NET 测试过这些,但除此之外它们非常适合衡量性能。

      【讨论】:

        【解决方案4】:

        old, old article from Microsoft containing performance tips for ASP(不是 ASP.NET)声明每个会话的开销约为 10 KB。我不知道这是否也适用于 ASP.NET,但它肯定比 Guffa 提到的 100 字节多得多。

        【讨论】:

          【解决方案5】:

          规划大型应用程序时,除了粗略的内存使用情况外,您可能还需要考虑其他一些事情。

          这取决于您选择的会话状态提供程序,而默认的进程内会话可能根本不是这种情况。

          如果是进程外会话存储(这可能是可扩展应用程序的首选),情况将完全不同,并且取决于会话对象的序列化和存储方式。

          使用 SQL 会话存储,不会有线性 RAM 消耗。

          我建议从一开始就对大型应用程序使用进程外会话状态提供程序进行集成测试。

          【讨论】:

            猜你喜欢
            • 2013-03-12
            • 1970-01-01
            • 2011-01-17
            • 2023-03-27
            • 2010-10-17
            • 2014-06-03
            • 2020-05-27
            • 1970-01-01
            • 2016-07-07
            相关资源
            最近更新 更多