问题
我正在测试我们的 AngularJS + ASP.NET WebAPI 应用程序之一的性能。我观察到的奇怪的事情是,在 Fiddler 中以不同的时间执行完全相同的查询。
这种行为不仅在服务器上出现,在我的本地计算机上也出现。
详细信息
该应用程序使用 Chrome 进行测试,并使用 ASP.NET WebAPI(Microsoft.AspNet.WebApi 版本 5.2.2
)和 Angular JS 版本 1.3.8
编写。
服务器是 Windows Server 2008 R2,带有 SQL Server 2008 和 IIS 7.5。
我的本地计算机是 Windows 8.1,带有 Visual Studio 2013 和 SQL Server 2014。
我注意到根据Fiddler,完全相同的查询以不同的时间执行(蓝色的查询是相同的,白色的查询是另一种类型的完全相同的查询):
例如26号查询的详细时间为:
Request Count: 1
Bytes Sent: 583 (headers:517; body:66)
Bytes Received: 3,844 (headers:260; body:3,584)
ACTUAL PERFORMANCE
--------------
ClientConnected: 17:26:25.099
ClientBeginRequest: 17:27:26.544
GotRequestHeaders: 17:27:26.544
ClientDoneRequest: 17:27:26.544
Determine Gateway: 0ms
DNS Lookup: 0ms
TCP/IP Connect: 0ms
HTTPS Handshake: 0ms
ServerConnected: 17:26:25.102
FiddlerBeginRequest: 17:27:26.544
ServerGotRequest: 17:27:26.544
ServerBeginResponse: 17:27:26.554
GotResponseHeaders: 17:27:26.554
ServerDoneResponse: 17:27:26.554
ClientBeginResponse: 17:27:26.554
ClientDoneResponse: 17:27:26.554
Overall Elapsed: 0:00:00.010
28号查询的具体时间为:
Request Count: 1
Bytes Sent: 583 (headers:517; body:66)
Bytes Received: 3,844 (headers:260; body:3,584)
ACTUAL PERFORMANCE
--------------
ClientConnected: 17:26:25.099
ClientBeginRequest: 17:27:29.104
GotRequestHeaders: 17:27:29.104
ClientDoneRequest: 17:27:29.104
Determine Gateway: 0ms
DNS Lookup: 0ms
TCP/IP Connect: 0ms
HTTPS Handshake: 0ms
ServerConnected: 17:26:25.102
FiddlerBeginRequest: 17:27:29.104
ServerGotRequest: 17:27:29.104
ServerBeginResponse: 17:27:29.616
GotResponseHeaders: 17:27:29.616
ServerDoneResponse: 17:27:29.616
ClientBeginResponse: 17:27:29.616
ClientDoneResponse: 17:27:29.616
Overall Elapsed: 0:00:00.512
正如我所说,它们是完全相同的查询(相同的 header 、相同的数据等)。
查询 28 在查询 26 之后 1-2 秒执行。
问题
这种行为的主要原因是什么?我应该在哪里查找问题?奇怪的是,查询先快后慢,然后又快,等等。我没有理由认为问题与数据缓存有关.
如何精确测试服务器上的计时,找出0.010
和0.512
秒之间的差异?差异超过50倍.
最佳答案
那么,如果您能与我们分享在服务器上执行的代码以及奇数和偶数请求之间的区别,那将会非常有帮助。
我在这里做了很多假设,所以请原谅任何愚蠢的错误。
我以前见过这种行为,在这种情况下,它与SqlServer 的执行计划缓存有关。
您可以在 Internet 上找到大量有关此内容的信息,简而言之,在执行查询之前,SqlServer 引擎会进行一些计算,并确定检索该查询的数据的最佳方式。这会增加查询时间的额外负担,SqlServer 知道这一点并缓存该执行计划,以便以后可以重用它。
我不知道有关它的所有细节,但如果我不得不猜测,我会说有些东西使该缓存无效,因此需要每隔一段时间重新计算一次。造成这种情况的常见原因是 order by
和 join
子句不同,这可能会发生,具体取决于发送到该方法的数据。
另一种可能性是查询结果本身被缓存,并且在一段时间后变得无效。
正如我所说,在不查看代码的情况下这是一个疯狂的猜测,但我真的认为检查一下是个好主意。
一种简单的测试方法是,如果您一遍又一遍地发送完全相同的请求,同时不发送不同的请求,则检查时间是否会有所不同。
希望有帮助。
关于sql-server - ASP.NET WebAPI 和 IIS 中的请求计时不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29751350/