负载测试不显示超过4GB的工作集性能计数器。

13
我正在尝试创建负载测试到某个应用程序。我想要获取仅对我的应用程序进程的内存使用情况。为此,我将进程/工作集添加到我的计数器集中。

enter image description here

问题在于Working Set PerformanceCounter读取的值是以字节为单位的,并且不计算大于4294967296(即4 GB)的值。

enter image description here

但我的应用程序“以64位模式运行”,使用超过4GB的内存
从任务管理器中清楚地看到它大约占用了6GB,但这个值在负载测试图表中不显示

那么如何创建自定义PerformanceCounter,使其像进程/工作集一样准确地运行,但使用千字节而不是字节,我可以获得真实的值。或者任何其他解决方案,使我能够计算我的应用程序在负载测试中使用多少内存。


为什么不直接获取正常输出并除以2 << 10 - Scott Chamberlain
您可以创建自己的计数器,以提供所需的确切值。微软有关于如何创建自定义性能计数器的页面。 - AdrianHHH
如果您想计数超过4294967296,那么您的程序必须作为64位进程运行。这很容易做到,右键单击您的EXE项目>属性>构建选项卡。取消选中“首选32位”复选框,确保平台目标为AnyCPU。 - Hans Passant
不是你正在测试的程序,而是显示这些统计数据的那个程序。 - Hans Passant
1
这听起来很像你想让别人为你编写代码。您是否对MSDN上的教程和示例感到困惑? - Heretic Monkey
显示剩余4条评论
2个回答

4
我找到了解决方案。感谢您所有的评论,它们都非常有帮助。 第一步是正常安装新的PerformanceCounterCategory,最重要的是将其设置为PerformanceCounterCategoryType.MultiInstance,示例如下:
var countersToCreate = new CounterCreationDataCollection();
var memoryCounterData = new CounterCreationData("Memory Usage", "Memory Usage", PerformanceCounterType.NumberOfItems64);
countersToCreate.Add(memoryCounterData);
PerformanceCounterCategory.Create("KB Memory Usage", "KB Memory Usage", PerformanceCounterCategoryType.MultiInstance, countersToCreate);

下一步是创建一个简单的Windows服务或控制台应用程序,该程序应从process.WorkingSet64中读取每个进程的值,并将其设置为您的PerformanceCounter。这个应用程序或服务应在进行负载测试时运行,并且当然要在x64模式下运行。例如:
static void Main(string[] args)
{
    while (true)
    {
        Thread.Sleep(500);
        foreach (var process in Process.GetProcesses())
        {
            var memoryUsage = new PerformanceCounter("KB Memory Usage", "Memory Usage", process.ProcessName, false);
            memoryUsage.RawValue = process.WorkingSet64/1024;
        }
    }
}

0

5
不留评论就投反对票对任何人都没有益处。亲爱的反对者,请您好心向我解释一下,您不喜欢我的提示在哪里。谢谢。 - Markus Safar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接