我的目标是开发一个迷你基准测试工具,这样我就可以测试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和内存的性能计数器。
那是计划。
你能告诉我吗?
谢谢!
答案 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();