对Web服务的速度进行故障排除

时间:2009-03-25 19:11:40

标签: performance web-services

C#.NET 2.0,如果结果证明适用。

我将开始深入了解为什么我们的Web服务行动缓慢 - 这个Web服务跳过代理,跳转到另一个域,查询存储过程以获取某些数据,然后返回一个int / string / dataset,取决于我要求的内容。我刚刚编写了一个控制台应用程序,它以相同的方式重复查询它,以便我可以收集一些统计信息。

对于每个请求,保持活动状态变为关闭,由于某些遗留原因没有人记录,因此会立即闻到。

多次循环同一个请求时,我注意到了一些奇怪的行为。这是我的输出,反映了每次迭代进行查询和返回数据所花费的时间。

Beginning run #1...completed in 4859.3128 ms
Beginning run #2...completed in 3812.4512 ms
Beginning run #3...completed in 3828.076 ms
Beginning run #4...completed in 3828.076 ms
Beginning run #5...completed in 546.868 ms
Beginning run #6...completed in 3828.076 ms
Beginning run #7...completed in 546.868 ms
Beginning run #8...completed in 3828.076 ms
Beginning run #9...completed in 3828.076 ms
Beginning run #10...completed in 578.1176 ms
Beginning run #11...completed in 3796.8264 ms
Beginning run #12...completed in 3828.076 ms
Beginning run #13...completed in 3828.076 ms
Beginning run #14...completed in 3828.076 ms
Beginning run #15...completed in 3828.076 ms
Beginning run #16...completed in 3828.076 ms
Beginning run #17...completed in 546.868 ms
Beginning run #18...completed in 3828.076 ms
Beginning run #19...completed in 3828.076 ms
Beginning run #20...completed in 546.868 ms
Total time: 61165 ms
Average time per request: 3058 ms

我觉得很奇怪,有多个重复值,一直到很小的水平。 是否存在一些瓶颈会导致它在相同的时间内重复返回?

...希望我的用于计算和显示毫秒持续时间的代码没有关闭,但跟踪它的TimeSpan对象是每个循环的本地代码,所以我不认为是这样。

编辑: Jon要求提供时间码,所以这里你去了(变量名称已更改以保护专有权,因此可能会有一些使得这不能编译的胖子...)< / p>

int totalRunTime = 0;
for (int i = 0; i < numberOfIterations; i++)
{
    Console.Write("Beginning run #" + (i + 1).ToString() + "...");
    DateTime start = DateTime.Now;
    SimpleService ws = new SimpleService();
    DataSet ds = ws.CallSomeMethod();
    DateTime end = DateTime.Now;
    TimeSpan runTime = end - start;
    totalRunTime += (int)runTime.TotalMilliseconds;
    Console.Write("completed in " + runTime.TotalMilliseconds.ToString() + " ms\n");
}
Console.WriteLine("Total time: " + totalRunTime.ToString() + " ms");
Console.WriteLine("Average time per request: " + (totalRunTime / numberOfIterations).ToString() + " ms\n");

3 个答案:

答案 0 :(得分:1)

最简单的方法是,在不运行探查器等的情况下,让网络应用程序记录确切的时间(显然,尽可能接近它),它会在呼叫中的不同时间开始操作,以及完成的时间。然后你可以看到它在哪里花时间。 (使用Stopwatch会给你更多准确性,但这样做会稍微困难。)

我同意你重复一次很奇怪。你能发布测量它的代码吗?我不会非常惊讶地看到某种捕获的变量问题让你的时间混乱。

编辑:您的计时代码看起来不错。这很奇怪。我建议你也在网络服务上记录时间,看看它是否看起来一样。这几乎就像故意扼杀它一样。

当你运行它时,它看起来是否花费了它所说的时间 - 即当它说它需要3秒时,是在写完最后一行后大约3秒?

答案 1 :(得分:0)

现在您需要为链中的其他步骤获取一些基准值。查看服务器日志以获取请求到达Web服务器的时间,并在Web服务代码中添加一些日志记录,以查看Web服务器何时切换到实际的“工作”代码。

一旦你完成了,你可以开始缩小最慢部分的性能,重复你想要的。

答案 2 :(得分:0)

SimpleService的创建(和创建计时)是否会扭曲您的数字? 如果你把它拉出循环会怎么样?

int totalRunTime = 0;
SimpleService ws = new SimpleService();
for (int i = 0; i < numberOfIterations; i++)
{
    Console.Write("Beginning run #" + (i + 1).ToString() + "...");
    DateTime start = DateTime.Now;
    DataSet ds = ws.CallSomeMethod();
    DateTime end = DateTime.Now;
    TimeSpan runTime = end - start;
    totalRunTime += (int)runTime.TotalMilliseconds;
    Console.Write("completed in " + runTime.TotalMilliseconds.ToString() + " ms\n");
}
Console.WriteLine("Total time: " + totalRunTime.ToString() + " ms");
Console.WriteLine("Average time per request: " + (totalRunTime / numberOfIterations).ToString() + " ms\n");