获取应用程序池的内存使用情况

Posted

技术标签:

【中文标题】获取应用程序池的内存使用情况【英文标题】:Get application pool's memory usage 【发布时间】:2018-06-19 12:19:30 【问题描述】:

我想使用 Process 类获取我的应用程序池的内存使用情况。到目前为止,这是我的代码:

            ServerManager serverManager = new ServerManager();
            ApplicationPoolCollection applicationPoolCollection = serverManager.ApplicationPools;


            Process process = Process.GetProcessById(applicationPoolCollection.Where(p => p.Name == "mywebsite.com").First().WorkerProcesses[0].ProcessId);

我可以获得 Process 类,但我如何知道它当前使用的 RAM 量是多少?我确实看到了像PagedMemorySize64NonpagedSystemMemorySize64 这样的属性。哪一个会给我它目前占用的正确 RAM?

我不能像这样使用PerformanceCounter

PerformanceCounter performanceCounter = new PerformanceCounter();

                performanceCounter.CategoryName = "Process";

                performanceCounter.CounterName = "Working Set";

                performanceCounter.InstanceName = process.ProcessName;
 Console.WriteLine(((uint)performanceCounter.NextValue() / 1024).ToString("N0"));

ProcessName 的原因会返回 w3p,因此 PerformanceCounter 会在控制台中写入 IIS RAM 的总使用量,这不是我想要的。

我只需要应用程序池的 RAM 使用量。因此我认为我的答案在于 Process 类而不是 PerformanceCounter

感谢任何帮助。

【问题讨论】:

您需要一定数量的 RAM,还是分配给进程的内存数量? 【参考方案1】:

如果您只需要进程可见的 ram 数量,这意味着分配给进程的 ram 数量,但不需要进程实际使用它的每一位,您可以使用:WorkingSet。 (为您的 .net 选择合适的版本)

请您注意一个事实,即进程内存诊断还有更多内容,以防您担心分配的虚拟内存、提交的内存、映射文件等等。

【讨论】:

谢谢。我需要任务管理器中显示的 RAM 量,例如:如果在任务管理器中内存使用量显示为 290 MB,则代码应该给我(显然需要除以 1024 * 1024)。我尝试了您的 WorkingSet 属性,但是它与任务管理器之间存在差异。工作集通常返回比任务管理器中显示的更多的内存。知道为什么会发生这种情况吗? 尝试使用PrivateMemorySize

以上是关于获取应用程序池的内存使用情况的主要内容,如果未能解决你的问题,请参考以下文章

面试题为什么使用连接池?连接池的好处?

WebLogic中查看连接池的使用情况

揭秘池化技术--内存池的实现

内存池的概念以及应用

线程应用: 线程池的实现

boost内存池的使用介绍