如何使用更多RAM?

时间:2017-07-19 21:44:26

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

我需要使用动态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:使用(){},在每个对象上调用Dispose等等)

然而,这是一个巨大的应用程序,几乎完成了客户业务操作的所有任务,包括一些图形和更多,我期望大量使用RAM。

我们无法更改为64位,直到我们删除旧的第三方GUI控件,这将花费数月的开发和管理不会让我安排,因为它不会提供任何直接的最终用户升级。 (除了总体上更好的表现....)

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

此外,对于使用动态RAM的服务器,可以在不增加OS RAM的情况下降低应用程序性能。

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

1 个答案:

答案 0 :(得分:11)

  

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

在这个问题及其评论中存在几种误解,这是一个核心问题。 GC和CLR完全不使用RAM,就像在现代按需分页的虚拟内存操作系统上运行的任何程序一样。 “虚拟”是一个关键术语,操作系统产生一种幻象,即进程可以访问处理器可以提供的所有地址空间。对于32位进程为2G​​B,对于64位进程为数TB。

“按需分页”是另一个关键术语,OS为进程提供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上执行此操作的专家也会让事情反弹