我正在测试我们的一个AngularJS ASP.NET WebAPI应用程序的性能.我观察到的奇怪的事情是,与Fiddler不同的时间执行完全相同的查询.
这种行为不仅在服务器上而且在本地机器上也被观察到.
细节
该应用程序使用Chrome进行测试,并使用Angular JS版本1.3.8编写在ASP.NET WebAPI(Microsoft.AspNet.WebApi版本5.2.2)中.
服务器是带有sql Server 2008和IIS 7.5的Windows Server 2008 R2.
我的本地机器是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,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
正如我所说,他们是完全相同的查询(相同的标题,相同的数据等).
问题
这种行为的主要原因是什么?我应该在哪里搜索问题?奇怪的是,查询首先是快速,然后慢,然后再次快速等等.我没有理由问题与数据缓存有关.
如何精确测试服务器上的时间,以找出0.010和0.512秒之间的差距?差距超过50倍.
解决方法
>使用这样的东西chrome extension for a REST API client来向终端发出请求. (您也可以使用以下内容:http://jmeter.apache.org/,但设置更复杂)
>运行这20次,节省时间.
>清空数据库,然后填充这个请求所需的表 – 只是几行数据.
>运行工具20次 – 存储时间.是否一致?如果在这一点上他们不一致,我会将代码视为罪魁祸首.
你打电话给外部服务吗?
>除了执行查询之外,加载数据时,服务是否做其他任何事情?
>使用像dotTrace一样的分析器来查看比它应该花费更多的时间. (实际上你应该从一开始就使用这个)
>如果时间仍然一致,请在数据库中加载更多数据,直到时间不一致.然后配置查询并开始优化它们.
现在,通过如何不一致的时间,我会假设该服务在加载该数据时做其他事情:外部服务调用..某事.