服务器日志和chrome开发人员工具中的响应时间之间存在差异

时间:2016-08-17 04:47:37

标签: performance nginx tornado timing

我正在对网站进行负载测试,并注意到我从网络服务器(在本例中为tornado web server)和Chrome开发者工具收到的时间信息之间存在相当大的差异。 Web服务器提供一个作为进程运行的服务(实际上,由主管管理的几个进程)在nginx后面。还有一个与此服务交互的Web界面。这个龙卷风Web服务器可以相当快地检索查询(平均30毫秒)。但是,Chrome开发者工具显示的响应时间要慢得多(大约240毫秒)。

每个查询都会检索一些信息,并需要查询其他资源(主要是图像)。我认为这是造成这么大差异的主要原因,但我尝试使用curl和<?php if(!user_is_logged_in()): ?> <div class="vertical-align user-page-form"> <div class="vertical-align-center"> <div class="horizontal-align-middle"> <div id="up-logo"> <a href="<?php print $front_page; ?>" rel="home"> <img src="<?php print $logo; ?>" /> </a> </div> <?php if ($messages): ?> <?php print $messages; ?> <?php endif; ?> <?php print render($page['content']); ?> <div class="login-footer"> <?php if($_GET['q'] == 'user' || $_GET['q'] == 'user/login'): ?> <?php print l('Create new account', 'user/register', array('attributes' => array('class' => 'left'))); ?> <?php print l('Reset your password', 'user/password', array('attributes' => array('class' => 'right'))); ?> <?php elseif($_GET['q'] == 'user/register'): ?> <?php print l('Sign in', 'user/login', array('attributes' => array('class' => 'left'))); ?> <?php print l('Reset your password', 'user/password', array('attributes' => array('class' => 'right'))); ?> <?php elseif($_GET['q'] == 'user/password'): ?> <?php print l('Create new account', 'user/register', array('attributes' => array('class' => 'left'))); ?> <?php print l('Sign in', 'user/login', array('attributes' => array('class' => 'right'))); ?> <?php endif; ?> </div> </div> </div> </div> <?php else: ?> <div class="page"> <?php if ($tabs): ?> <div class="tabs"><?php print render($tabs); ?></div> <?php endif; ?> <?php print render($page['content']); ?> </div> <?php endif; ?> 测量172ms。

另一方面,对nginx使用此日志记录指令:

time_starttransfer

我能够检查log_format timed_combined '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent" ' '$request_time $upstream_response_time $pipe'; request_time实际上是非常小(45毫秒)。

在响应时间出现这种差异的原因是什么?

更新

这是Firebug的截图:

enter image description here

我认为我不能用有限的信息来判断延迟。

更新2

我能够通过curl获得更好的信息。不过我不确定它是否准确:

upstream_response_time

从我所见, time_namelookup: 0.000 time_connect: 0.062 time_appconnect: 0.000 time_pretransfer: 0.062 time_redirect: 0.000 time_starttransfer: 0.172 ---------- time_total: 0.240 ,所以0.172 - 0.062 = 0.110s。但是,查看日志时,Web服务器报告0.044s,并且nginx同意(0.045s)报告time_starttransfer - time_pretransfer = content_generation。此外,curl输出中的request_time,我认为应该是延迟,并不是那么大(0.062s)。

有趣的是,time_connect与nginx或龙卷风报告的时间相似(0.048 vs 0.044)。但这种计算不应该是正确的。有没有人知道什么是正确的方法来证明chrome开发人员工具/ curl与web服务器/ nginx之间响应时间的差异?

2 个答案:

答案 0 :(得分:8)

TL; DR

您正在将苹果与橙子进行比较...使用ping检查您的RTD。

HTTP请求处理

单个HTTP(S)请求的简化(但仍然相当复杂)的一组步骤如下:

  1. 客户端执行DNS查找以解析URL中的主机名。
  2. 客户端建立与主机服务器的TCP连接。
  3. 客户端可选择进行TLS协商(仅适用于HTTPS连接)。
  4. 客户端最终通过连接发送请求 - 此阶段的开始是客户端即将发送第一个字节的时间。
  5. Web服务器接收请求并开始处理它。
  6. Web服务器开始发送响应。
  7. 客户端开始接收它 - 即它收到响应的第一个字节。
  8. 服务器继续将数据流式传输到服务器,直到它到达响应的末尾。
  9. 客户端收到最后一个数据。
  10. 正如您所看到的,Web服务器只知道步骤5到8(因为许多初始连接设置将超出其控制范围),并且只能测量5-6和5-8。但是,客户端知道步骤1到9.此外,它还可以测量完全相反的数据点列表。

    网络延迟

    任何请求或响应都必须通过网络传输(通常是因特网用于公共服务),因此数据从一台机器传输到另一台机器时会产生延迟。两台机器之间的最短时间(从一台机器到另一台机器再返回)称为往返时间(RTT)往返延迟(RTD)。这会影响所有通信,通常使用ping等工具进行衡量。

    此RTD影响所有通信,HTTP请求也不例外,因此它将非常接近上述步骤中步骤4-5和6-7之间的延迟总和。

    净结果

    将所有这些放在一起,然后,您应该发现curl已经为time_pretransfer返回的步骤1-4(好,到4的开头)进行了测量。此外,它还为time_starttransfer测量了1-7(同样是7的开头)。但是,服务器已经测量了5-6的时间。

    你错过了4-5到6-7之间的时间,我们上面看到的基本上是RTD。

    因此,您应该找到time_starttransfer = time_pretransfer + request_time + RTD

答案 1 :(得分:1)

客户端不知道服务器上发生了什么。它不知道请求何时到达另一端,并且当另一端开始发送响应时。

您正在尝试比较两个端点测量的数字,但它们之间存在明显的延迟,并且它们在通信方面受到限制。

如果您真的想了解详细信息中的延迟,您应该了解TCP的工作原理。我只是注意到连接动作不是直接的,或者是一个动作,它涉及在服务器和客户端之间交换数据包。传输数据也是如此。