获取应用程序池的内存使用情况
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 量是多少?我确实看到了像PagedMemorySize64
和NonpagedSystemMemorySize64
这样的属性。哪一个会给我它目前占用的正确 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以上是关于获取应用程序池的内存使用情况的主要内容,如果未能解决你的问题,请参考以下文章