【问题标题】:How can I use MORE RAM?如何使用更多内存?
【发布时间】:2017-12-25 08:59:34
【问题描述】:

我需要强制使用动态 RAM 的终端服务器为我的精简运行的 .NET 应用程序提供更多 RAM,从而减少 .NET GC RAM 压力并提高性能。

对于我使用 X86 作为目标编译的大型 Microsoft .NET C# WinForms 应用程序,是否有垃圾收集器或其他 .NET Framework 设置可让我的应用程序使用更多 RAM 来提高性能,而不是让 .NET 垃圾收集器尝试如此严格地控制 RAM 压力?

我希望有一些 .NET GC 提示、设置或 .NET 框架函数调用来调整其运行的精简程度。

原因: 我的应用程序在每个工作日的工作时间内被成千上万个终端服务器上的数万用户使用。 在 15 年的部署期间,我发现如果为每个实例提供大约 1.85GB 的 RAM,该应用程序将能够充分发挥作用。

我们已经完成了重要的开发,以确保最小的 RAM 使用和内存泄漏得到控制。 (IE:Using(){},在每个可能的对象上调用 Dispose)

但是,这是一个巨大的应用程序,几乎可以完成客户端业务操作的所有任务,包括一些图形等等,我预计会使用大量 RAM。

在我们删除旧的第 3 方 GUI 控件之前,我无法更改为 64 位,这将需要数月的开发和管理,因为它不会提供任何直接的最终用户升级,因此我不会安排这样做。 (除了整体性能更好......)

问题在于说服托管终端服务器的客户 IT 公司添加所需的 RAM 以保持性能。 他们的典型论点是虚拟机没有报告大量的 RAM 使用情况,这立即意味着我需要花费数天时间说服他们,这不是在这种情况下使用的最佳指标。

也适用于使用动态 RAM 且应用程序性能降低但未适当增加 OS RAM 的服务器。

我的目标是调整一些设置以允许更多的 RAM 使用(不使用不需要的/虚假的内存消耗)并推动这些服务器根据需要分配更多的 RAM。

【问题讨论】:

  • 您不能使用比 PC 上更多的内存。当您使用的内存比计算机实际拥有的更多内存时,Windows 将使用硬盘驱动器交换内存(缓存),但使用交换会显着减慢应用程序的速度。我会使用控制面板查看正在使用多少缓存。
  • 不是,但 .NET GC 将内存使用率保持在可用 RAM 的 40% 左右。因此,IT 说“你没有使用 RAM”只有当更多的 RAM 添加到主机时,.NET GC 才会打开,使用更多的 RAM 并且应用程序性能更好。我想在默认情况下更接近 100% 的使用率。
  • 您可以尝试这里提出的解决方案; stackoverflow.com/questions/1075542/configure-net-clr-ram-usage 虽然我个人认为你很不走运。也许将该设置设置为 2GB 或其他值会导致操作系统尝试使用更多 RAM,并且管理 VM 的服务依次分配该 RAM。但是除非虚拟机真的没有剩余的 RAM,否则为什么它会扩展以便你有更多的 RAM?为什么 Windows 允许您将 CLR 的 RAM 使用率设置为高于它认为自己拥有的 RAM 的值?
  • 终端服务器也是 x86 吗?
  • 如果终端服务器是 x64,您可以将您的应用程序分成许多 x64 服务,同时保持应用程序在 x86 上。另一个选择是使用存储缓存,可以选择存储在 SSD、HDD 或英特尔的 Optane 内存上。

标签: c# .net performance memory garbage-collection


【解决方案1】:

但 .NET GC 将内存使用率保持在可用 RAM 的 40% 左右

这个问题及其cmets有几个误解,这是一个核心问题。 GC 和 CLR 完全忽略了 RAM,就像在现代按需分页虚拟内存操作系统上运行的任何程序一样。 “虚拟”是一个关键术语,操作系统创造了一个进程可以访问处理器可以提供的所有地址空间的错觉。 32 位进程需要 2GB,64 位进程需要很多 TB。

“按需分页”是另一个关键术语,操作系统以页面为单位为进程提供 RAM,每次 4096 字节。按需,不是在分配时,而是在进程从地址读取或写入时。页面文件是一个关键的操作系统资源,当没有足够的 RAM 可用时,它就是存储内存内容的地方。当操作系统需要为其他进程提供 RAM 页面时,RAM 内容会被调出。因页面错误而按需调回页面。

在具有少量 RAM 的机器上,这些页面错误可能会频繁发生,并且会显着降低程序速度。在任务管理器中可见,您可以为“PF Delta”添加一列。其他相关的列是“工作集”,即程序正在积极使用的 RAM 量。以及“提交大小”,即分页文件支持的所有分配的总和。 .NET 程序在分配内存时会增加提交大小。

操作系统会主动查找一段时间未使用的 RAM 页面并将它们分页。重要的是它可以快速响应其他进程的内存需求。如果您的程序是机器上唯一运行的程序,那么这不是很理想。这可以调整,检查this MSDN page for the policy。对于终端服务器来说这是否是一个好主意对我来说并不明显,我不认为这是一个很大的可能性,serverfault.com 是最好的询问地点。

您可以通过编程方式修改Process.MinWorkingSet property,但请记住,当操作系统认为可用 RAM 量太低时,它可能会忽略它。并且您可能会导致服务器上的其他进程大大减慢,从而使管理员感到不安。还有一些东西可以让 serverfault.com 上每天都这样做的专家们振作起来

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多