【发布时间】: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