如何以编程方式创建性能计数器,以便对Web api的性能进行基准测试

时间:2015-05-06 12:10:28

标签: c# .net httpclient benchmarking performancecounter

我的目标是开发一个迷你基准测试工具,这样我就可以测试Web Api的性能。

我想使用简单的控制台应用程序以编程方式创建性能计数器。作为我研究的一部分,我创建了下面的主要方法。这只是一个简单的测试。基本上,我需要HttpClient才能转发x个请求,然后查看此操作的一些指标(即处理器时间百分比)。

我的逻辑是否正确?

隐藏复制代码

  static void Main(string[] args)
  {
          var client = new HttpClient();
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        var theCPUCounter = new PerformanceCounter("Process", "% Processor Time", Process.GetCurrentProcess().ProcessName);

        Console.WriteLine(theCPUCounter.NextValue());
        System.Threading.Thread.Sleep(1000);

        for (int i = 0; i <= 5; i++)
        {
            HttpResponseMessage response = client.GetAsync("http://www.google.co.uk/").Result;
        }
        Console.WriteLine(theCPUCounter.NextValue());
    }

我知道有一些性能计数器更有意义,但目前我只是想看看我是否理解正确。

如果以上是正确的,那么我的计划是:

1)使用HttpClient和TPL创建具有并发请求的各种吞吐量方案(即发送1000个并发请求,但每100个创建不同的方案以便利用Web Api中的各种资源)。一旦我执行了那些场景,那么

2)我将发布用于测量CPU和内存的性能计数器。

那是计划。

你能告诉我吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

这里的基本问题是“如何使用PerformancCounters”,你正确地得到了那个部分。您可以简化代码:

public static void Main()
{
    var cpuSample = new System.Diagnostics.PerformanceCounter("Processor", "% Processor Time", "_Total"); 
    while(true)
    {
       Thread.Sleep(1000);
       Console.WriteLine(cpuSample.NextValue() + " %");
    }
 }

您的帖子会将HttpClient添加到混音中,但这是完全正交的。您可以通过定期读取样本来使用PerformanceCounters,并且读取的值是上一个样本的间隔中的计数器值。

对于您示例中的特定计数器(总CPU%),您在应用程序之间执行的操作(即10个HttpClient请求)无关紧要。 _Total CPU%是全局值,它涵盖该主机上的所有应用程序和服务。

如果您对改进HTTP请求感兴趣,请注意您应该关注其他地方。阅读Adjusting HttpWebRequest Connection Timeout in C#High performance TCP server in C#

答案 1 :(得分:1)

尝试使用metrics.net库:

https://github.com/Recognos/Metrics.NET

您可以测量CPU使用率(和其他指标),如下所示:

using Metrics;

Metric.Config
    .WithHttpEndpoint("http://localhost:1234/")
    .WithAllCounters();