3

我们目前正在我们的 Web 服务器上测试性能,并且在生产服务器和测试服务器之间得到了非常不同的结果。

我们正在进行的测试如下:

  • 下载站点上可用的 RSS 提要 XML
  • 对 XML 提要中存在的所有链接发出 HEAD 请求,以检查 url 是否正确

令人惊讶的是,测试服务器上的平均响应时间约为 15 毫秒,而产品服务器上的相同测量结果为 900 毫秒。由于两台服务器(应该)配置相同,我对这些结果感到非常困惑。

  1. 我是否认为 .CFM 页面的 HEAD 请求实际上并不涉及 ColdFusion 服务器,而只涉及 IIS?
  2. 如果我对第一点是正确的,我在哪里可以检查 IIS 级别是什么可以在响应时间上产生如此大的差异?

按照我从你们那里收到的建议,我只是尝试在测试 cfm 页面中添加一个日志条目,以查看 CFLog 是否被执行。

令人惊讶的是,对同一个文件的同一个 HEAD 请求会在 prod 中生成一个日志条目。而不是在测试中。显然,测试和产品之间的配置应该不同,但我不知道在哪个级别。

4

2 回答 2

1

你的第一个假设是不正确的。必须对请求的响应HEAD进行编码,并且不会自动处理。HEAD请求应使用与请求相同的标头信息进行响应GET,这通常意味着执行与请求相同的代码GET,然后在响应中省略消息体。

HTTP 规范,第 9.4 节

HEAD 方法与 GET 相同,只是服务器不能在响应中返回消息体。响应 HEAD 请求的 HTTP 标头中包含的元信息应该与响应 GET 请求发送的信息相同。此方法可用于获取有关请求所隐含的实体的元信息,而无需传输实体主体本身。这种方法通常用于测试超文本链接的有效性、可访问性和最近的修改。

对 HEAD 请求的响应可能是可缓存的,因为响应中包含的信息可以用于从该资源更新先前缓存的实体。如果新字段值表明缓存的实体与当前实体不同(如 Content-Length、Content-MD5、ETag 或 Last-Modified 的变化所表明的那样),则缓存必须将缓存条目视为陈旧的。

我认为很少看到动态站点、CMS 或框架实际上实现了HEAD响应、有效ETag等大部分内容 - 所以通常你会从 aGET和 a得到相同的响应HEAD,包括应该的消息体从HEAD请求中被剥夺。

我假设您在时差中遇到的情况可归因于服务器之间的内容差异。也就是说,测试服务器可能只有最少的内容,因此比完整内容生产服务器执行得更快。

于 2013-02-18T11:46:36.560 回答
0

我不知道这个问题的答案,但我拼凑了一些代码来测试它,并且有一些结果。警告:我只使用内部 Tomcat Web 服务器,而且我使用的是 CF10(我注意到您使用的是 CF8)。我不认为他们的这些警告使我在您的特定情况下的发现无效。

<!--- headMe.cfm --->
<cflog text="hit" file="headMe">


<!--- doHead.cfm --->
<cfhttp method="head" url="http://localhost/headMe.cfm" result="httpResponse" />
<cfdump var="#variables#">

所以我浏览到doHead.cfm,它执行headMe.cfm 的HTTP HEAD。如果实际执行了 headMe.cfm,那么我们将在 headMe.log 中获得一个日志条目。如果不是:没有日志条目。

httpResponse变量是合法的,并且符合 HEAD 请求的预期,并且...我得到了日志条目。

所以我的结论是,当收到一个 HEAD 请求时,不幸的是所有的 CFML 都被实际执行了。我真的不认为它应该是。HTTP 规范中没有任何内容表明它应该或不应该导致“动态”请求完全执行,但我认为如果不这样做会很好。

无论如何,HTH。

于 2013-02-18T04:28:38.777 回答